от Valqk - Антон(28-03-2004)

рейтинг (53)   [ добре ]  [ зле ]

Printer Friendly Вариант за отпечатване

Задавали ли сте си въпроса , как мога да накарам FreeBSD box-а ми да
изкара част от мрежата ми /или друга мрежа/ с ip което не е ip-то по подразбиране на рутера.

Тази статия дава отговор на този въпрос, може би доста от вас са имали или ще имат подобен проблем.


Малко теория.

Под FreeBSD нат-ът се извършва от външна програма, наречена natd.
Тази външна програма е доста гъвкава и дава възможност за доста настройки
и гъдели.
За справка : man 8 natd , man 8 ipfw ;

А сега, практика :-).

Да си представим, че имаме две вътрешни мрежи (възможно е да се разцепи и една под-мрежа, но ще е по лесно разбираемо с 2 мрежи).

net1: 192.168.0.0/24 (255 адреса).
net2: 192.168.1.0/24 (255 адреса).

Имаме 2 реални ip-та , които искаме да ползваме за тези две вътрешни мрежи:

ip1: 80.72.67.118 -> 192.168.0.0/24
ip2: 80.72.67.119 -> 192.168.1.0/24

т.е. всички ip-та които са от 192.168.0.0 да излизат през 80.72.67.118 ,
а 192.168.1.0 през 80.72.67.119

По подразбиране, всичкия трафик, който в момента излиза от машината и за двете мрежи би трябвало да излиза от default адреса на мрежовата карта (не от алиасите), приемаме че това е 80.72.67.118.

Как излиза този трафик?
Във правилата ни на firewall-а има правило което казва
"всичкия трафик който идва към мен през външния ми интерфейс да се пренасочва към порт 8886.
След пренасочването, на този порт "слуша" natd програмката,
която всъщност транслира адресите от вътрешни към външния и подава заявките към сървърите.
Тя пази всички изпратени заявки във списък и след връщането на заявката от сървъра към който е подадена natd транслира обратно всичката информация и я подава към клиента.

При стартиране на natd, той изисква една от двете опции -
-n  - което указва името на външния мрежов интерфейс
или
-a - което указва кое ip да използва за да изкарва трафика през него.
(за справка man 8 natd за да видите всички възможни параметри на natd).

Във вариантите по подразбиране се слага -n опцията, която използва ip-то  
качено на мрежовата карта първо(не алиас). В нашия случаи то е 80.72.67.118 .

Как може да накараме част от заявките да излиат през друго външно ip?

1. Трябва да "направим" това ip, така че то да съществува на нашия рутер.  
Т.е. ще добавим алиас на външния мрежов интерфейс (приемаме че работим със мрежови карти 3c905, тъй като във *BSD мрежовите интерфейси се кръщават с различни имена в зависимост от производителя и драйвера който ползва въпросния мрежов интерфейс - в моя случаи xl0 i xl1).

И така слагаме алиас на външния ни интерфейс.
#>ifconfig xl0 alias 80.72.67.119 netmask 255.255.255.224
след изпълняването на тази команда вече имаме работещо ip на външния ни мрежов интерфейс.

2. Трябва да кажем на natd от коя мрежа кои заявки да препраща и накъде (това става през ipfw(2), аз лично ползвам ipfw2 , тъй като има много повече възможности).  

Малко теория: Тъй като порт 8886 е по подразбиране на natd-то той служи за входно/изходния трафик, но за да можем да работи нормално natd със не-дефаулт порт, се нуждае от два порта - входен и изходен.

Избирам си 65350 за изходен(този към който се препраща трафика от вътрешната мрежа към natd-то) и 65351 за входен (този към който се препраща трафика идващ от интернет към рутера).

Тъй като ipfw e rule-id based, приемам че правилото по подразбиране за natd-то е с номер 1000.

2.1. Изтривам правило 1000 тъй като ще трябва да се промени - да не пренасочва трафика идващ от второ реално ip към дефаулт natd.
#> ipfw del 1000

2.2. Добавям новото правило, което изключва въпросното ip.
#> ipfw add 1000 divert natd ip from not 80.72.67.119 to any via xl0
(ЗАБЕЛЕЖКА: Тук можете да сложите и цялата подмрежа от реални ip-та която имате , но ако го направите, няма да имате достъп до нея от вътрешната мрежа, ако адресите са сложени преди рутера!)

2.3. Добавям 2 правила за да укажа на целия трафик, който идва от вътрешната мрежа (192.168.1.0/24) да минава през друг порт към natd.

#> ipfw add 720 divert 65350 ip from 192.168.1.0/24 to any via xl0
#> ipfw add 721 divert 65351 ip from any to 80.72.67.109 via xl0
(ВНИМАНИЕ: правилата за втория natd ТРЯБВА да бъдат над правилата за дефаулт natd, тъй като ако са след те се divert-ват от предишното правило което е за any[т.е. за всичкия останал трафик]).


3. Сега е времето да стартирам втора инстанция на natd, която да се грижи за трафика идващ на портове 65350 и 65351 , като и "кажа" да прекава всичкия трафик минаващ през нея, през адрес 80.72.67.119.
#> natd -i 65350 -o 65351 -a 80.72.67.109
(Допълнение: Ако искате да видите тарика, и защо може да не работи сложете опция -v.)


4. Добавям разрешение за достъп до рутера от мрежа 192.168.1.0/24
ВНИМАНИЕ: Това трябва да стане ПОД правилата за natd-то.

#> ipfw add allow ip from 192.168.1.0/24 to any via xl1
#> ipfw add allow ip from any to 192.168.1.0/24

5. Ако нямам разрешение за другата мрежа добавям и тях.
#> ipfw add allow ip from 192.168.0.0/24 to any via xl1
#> ipfw add allow ip from any to 192.168.0.0/24


Сега вече трафика от мрежа 192.168.1.0/24 трябва да излиза през 80.72.67.119 ( може да проверите тук: http://showmyip.com )

Ако се интересувате може да погледнете същата статия, с малко повече/по малко неща от: http://valqk.ath.cx/howtos/FreeBSD/natd.html

Приемам всякакви коментари, отзиви, поправки и препоръки на
valqk [at] lozenetz [dot] org

Ще помоля ако някой поства тук, да ми пише и на мейла тъй като няма да следя дали има постнати коментари тук.

Едно предупреждение, не си изтривайте divert правилото ако не сте близо до машината, или в локалната мрежа, където правилата за natd-то не важат, иначе рискувате да си срежете клона на който седите :).

Надявам се този "документ" да е полезен за вас.
Ако е така ми пратете мейл със "hello world" , ще се радвам да го получа :)

Всичко най-най :) и весело ! :)))

Без малко да забравя, SPECIAL 10x to Tbyte for this issue with natd!!!!

Малко коментари относно статията от Tbyte с които съм напълно съгласен.

1.За да не си отрежете клона на ssh-а през който сте се вързали,
можете да добавите две правила:

#> ipfw add 500 allow tcp from me 22 to any
#> ipfw add 501 allow tcp from any to me 22

ЗАБЕЛЕЖКА: Имайте предвид, че тези две правила трябва да са преди правилото за natd-то.

2. По принцип ако сте доставчик, е по добре да пуснете първия нат, който нат-ва цялата ви мрежа не на дефаулт ip-то а да качите друг алиас с ifconfig (има го описано как става по горе) и да пуснете първия natd с опция -а алиас_адрес , за да можете да правите всякакви магии по рутера със дефаулт ip-то без да спирате трафика на потребителите си "инцидентно" , ОПРЕДЕЛЕНО Е ПРЕПОРЪЧИТЕЛНО :)))

Ако има още коментари моля пишете!!!


<< Какво е Линукс? | PPP over SSL. Част 2: Клиент >>