Задавали ли сте си въпроса , как мога да накарам 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 netmas 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 ТРЯБВА да бъдат над правилата за дефаулт , тъй като ако са след те се 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" , ще се радвам да го получа :)

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