Бележки на SysAdmin - FreeBSD NAT с IPFilter (ipnat)
NAT във FreeBSD с IPFilter (ipnat)
Съдържание
Синдромът на хамака е един от ключовите моменти в деградацията на системния администратор. Започва с факта, че стабилността и неподвижността стават синоними. Навремето, преди IPFilter да бъде включен във FreeBSD, единственият нормален начин за правене на NAT на FreeBSD беше natd. Предпоставка за пълното функциониране на natd е наличието на dummynet(4). natd и все още може да бъде от значение в някои случаи. Ще обмислим използването на ipnat от IPFilter като средство за превод на мрежови адреси (NAT).
Този документ не е стъпка по стъпка как за манекени - разбира се, че няма нужда да се обяснява, че например след промяна на /etc/syslog.conf, той трябва да изпрати HUP сигнал и файловете, където ще пише, трябва да бъдат създадени независимо и как да "приложат" променените правила. Ако мислите, че не сте добре запознати с *nix и FreeBSD в частност, тогава можете да прочетете по тази тема:
По-нататък ще се приеме, че имаме поне версия 3.4.29 на IPFilter. Ако във вашия случай това не е така, значи все още не сте излезли напълно от хамака, въпреки че самият факт, че четете този текст, е доказателство за желанието ви да го направите.
Подготовка
И така, разгледайте ситуацията: имаме 2 интерфейса - fxp0 (200.200.200.1), гледащ големия и зъл интернет, и dc0 (192.168.0.1), гледащ вътрешната мрежа.
Задача: да позволи на потребителите на вътрешната мрежа да създават връзки към външни хостове, без да използват socks5 / http прокси и т.н.
В ядрото ни трябват само 2 реда: options IPFILTER options IPFILTER_LOG
След това IPFilter е достъпен за нас в целия си блясък.
Също така добавете реда gateway_enable="yes" към /etc/rc.conf или добавете реда net.inet.ip.forwarding=1 към /etc/sysctl.conf.
Обикновен NAT със състояние
Нека започнем с прост NAT със състояние, т.е. IP пакетите от външния интерфейс към получателя във вътрешната мрежа ще бъдат излъчвани само ако потребителят от вътрешната мрежа сам е установил тази връзка. Всички други пакети, които са дошли до външния интерфейс за получателя във вътрешната мрежа, ще бъдат блокирани (вижте пренасочването по-долу, ако някои пакети отвън винаги трябва да се препращат вътре).
За връзки, установени от потребителя, ние ще създадем запис в таблицата със състояния с просто правило на IPFilter: бързо предаване на fxp0 proto tcp от 192.168.1.149 към всички флагове S/FSRA поддържане на състояние (за TCP връзки) и предаване бързо на fxp0 proto udp от 192.168.1.149 към всяко поддържано състояние (за UDP връзки). Можете вместо това от две правила, направете едно общо както за TCP, така и за UDP: изключете бързо на fxp0 proto tcp/udp от 192.168.1.149 до всяко състояние на запазване , но при такова правило няма да можем да проследяваме tcp пакети с флага SYN, използвайки флагове, в резултат на което всеки пакет от вътрешната мрежа ще създаде запис в таблицата със състояния (ако не е), а не онези пакети, които са първи при установяване на TCP връзка (с флаг SYN). Какво е по-удобно / по-добро / по-подходящо - решете сами.
Следвайки това правило, ще поставим правило, което блокира всички пакети за вътрешната мрежа:
Сега самото предаване.Нека добавим правилото към файла за превод (по подразбиране е /etc/ipnat.rules): map fxp0 192.168.1.149/32 -> 200.200.200.1/32 portmap tcp/udp 20000:20099
Остава само да приложите правилата. 😉
За удобство при наблюдение на работата на NAT можете да добавите ред към syslog.conf: local0.* /var/log/ipmon.log и да стартирате помощната програма за наблюдение на работата на IPFilter - ipmon с ключове -Dvas (станете демон, покажете по-подробна информация, наблюдавайте всички IPFilter устройства (NAT, таблица на състоянието и самия IPFilter) и работете през syslog). Ако полученият лог файл изглежда хаотичен, не бързайте да включите NAT само за журнал с опцията -o N. Правилата на IPFilter, които влизат в журнала, могат да бъдат изпратени там от друго съоръжение. За да направите това, достатъчно е да добавите facilty: block в log level local2.info quick on fxp0 from any to 192.168.0/16 към всяко правило с log флаг и да добавите още един ред към syslog.conf: local2.* /var/log/ipfilter.block.log. В резултат на това действие /var/log/ipmon.log ще съдържа информация за NAT (създадени излъчвания, затворени излъчвания) и таблица със състояния (създаване и изтриване на запис), а файлът /var/log/ipfilter.block.log ще съдържа пакети, които са били блокирани.
Ако не искате средството да бъде указано в голям брой правила и правилата да бъдат по-кратки, можете да отхвърлите възможността ipmon да работи през syslog и да го принудите да пише директно във файла; например: ipmon -Dv -o NS /var/log/NAT.log (преводите и таблицата на състоянието се записват във файла /var/log/NAT.log) и ipmon -Dv -o I /var/log/ipfilter.log (операцията на самия филтър се записва във файла /var/log/ipfilter.log).
Струва си да се отбележи, че едно правило може да излъчва няколко хоста. Например, замествайки 192.168.1.149/32 в правилата ipnat и IPFilter с 192.168.128/25, ние ще излъчваме хост пакети отвътрешна мрежа от диапазона от 192.168.1.128 до 192.168.1.254.
Пренасочване (пренасочване)
Ако има нужда от безусловно излъчване на някои пакети, дошли отвън (например, така че WWW / SMTP сървърът от вътрешната мрежа) да е достъпен отвън, се използва пренасочване.
Лесна опция: излъчване на пакети от всеки хост.
rdr fxp0 200.200.200.1/32 порт 8080 -> 192.168.1.17 порт 80 tcp
В този случай всеки пакет, пристигащ на порт 8080 на външния интерфейс 200.200.200.1, ще бъде „пренасочен“ към 192.168.1.18 порт 80. Естествено, по-добре е да поставите хост 192.168.1.17 в таблицата за транслация, както е описано в „Simple stateful NAT“ и като вземете предвид, че връзката ще бъде инициирана отвън, добавете правила на IPFilter което би им позволило. Ако ipmon регистрира IPFilter, направената грешка може лесно да се види.
Можете да пренасочите не всички пакети, а селективно въз основа на техния подател: rdr fxp0 от 212.118.165.100/32 към 200.200.200.1/32 порт = 6000 -> 192.168.1.89 порт 6000
Това правило ще преобразува пакети, пристигащи на 200.200.200.1 порт 6000само от хост 212.118.165.100
Не забравяйте да създадете правила за IPFilter, за да позволите на такива пакети да преминават. Въпреки че, ако ipmon е конфигуриран и работи, той бързо ще ви напомни за това. 😉
Прокси правилото трябвазадължително да идва преди други правила (с изключение на пренасочване).
Безусловно пълно предаване
Контрол на излъчването
Със сигурност е глупаво да се настройва NAT, без да се разглеждат протоколите, генерирани от ipmon. Може също да е полезно да ограничите възможността за осъществяване на връзки отвътре до привилегировани портове на външни хостове. Всичко това е възможнои трябва да бъдат персонализирани.
Добрият стар root-tail (/usr/ports/sysutils/roottail) може да бъде добър помощник.