Как то давно у меня зашел спор с одним администратором о возможностях ipfw. Он мне долго доказывал, что фаервол туповатый и вообщем-то совсем не кошерный. Переубеждать я его не стал и как-то об этом позабылось. Я пользовался ipfw а он ipf. Но теперь вернемся к теме. На написание статьи меня побудила одна интересная и простая с первого взгляда задача. Имеем: FreeBSD 7.0 release, инет от прова (замечу в данном случае одного), сеть адресов 1.1.1.192/29, естесно шлюз в этой же сети :-) Надо: В силу того, что сервер выполняет функции фаервола, прокси и почтосервера, захотелось разделить трафик по назначению и выделить для почтовика отдельный апишник, с заполненой обратной зоной PTR. Решение: Как могло показаться на первый взгляд, то что может быть проще, чем взять и использовать ipforward2, включив его в ядро? Но данное решение, естественно, моглобы существовать в разных VLSM, что в данном случае неприемлемо, ввиду сходимости сети. Для сервера прокси выделен ip: 1.1.1.195/29, для почты ip: 1.1.1.197/29, шлюз соответственно ip: 1.1.1.193. Листинг ifconfig:
Первое, что пришло в голову, это разделить входящий трафик, что и было сделано:
00050 allow ip from any to 1.1.1.195 dst-port 22,53,80,433,1024-65535 in via fxp1
00055 allow ip from any to 1.1.1.197 dst-port 25,110 in via fxp1
00060 allow ip from 1.1.1.19522,53,80,433,1024-65535 to any out via fxp1
00065 allow ip from 1.1.1.19725,110 to any out via fxp1
00090 allow ip from any to any via lo0
65535 deny ip from any to any
Входящий трафик разрешен на 1.1.1.197 только на 25 и 110 порты, т.е. почта, на 1.1.1.195 - ssh, dns, www, https, непревилегия. Исходящий же трафик прописываем соответственно. Далее возникает логичная стенка, из-за того, что у нас одна подсеть. И независимо от того, что мы напишем в фаерволе, исходящий трафик будет идти с интерфейса, ближайшего к шлюзу, в данном случае это 1.1.1.195. ipforward вообще не помощьник, т.к. шлюз у нас один. Пришлось извращаться. Итак. Поднимаем NAT(PAT - точнее) на адресе 1.1.1.197.
/sbin/natd -a 1.1.1.197 -p 8669
Поднимается сокет 8669, может 8668 нам еще пригодится :-) Далее конфигурим фаервол (обращайте внимание на номер правил):
00030 skipto 900 ip from me to any dst-port 25 out
00040 skipto 900 ip from any 25 to me in
00100 skipto 20000 ip from any to any
00900 divert 8669 ip from any to any via fxp1
00910 allow ip from any to any
Итого, получается нечто общее:
00010 skipto 900 ip from me to any dst-port 22 out
00020 skipto 900 ip from any 22 to me in
00030 skipto 900 ip from me to any dst-port 25 out
00040 skipto 900 ip from any 25 to me in
00050 allow ip from any to 1.1.1.195 dst-port 22,53,80,433,1024-65535 in via fxp1
00055 allow ip from any to 1.1.1.197 dst-port 25,110 in via fxp1
00060 allow ip from 1.1.1.19522,53,80,433,1024-65535 to any out via fxp1
00065 allow ip from 1.1.1.19725,110 to any out via fxp1
00070 allow ip from any to 192.168.1.2 in via fxp0 (LAN)
00080 allow ip from 192.168.1.2 to any out via fxp0 (LAN)
00090 allow ip from any to any via lo0
00100 skipto 20000 ip from any to any
00900 divert 8669 ip from any to any via fxp1
00910 allow ip from any to any
65535 deny ip from any to anу
В общем то имеем полное разделение трафика (входящего и исходящего), исключая тем самым попадания ip в black list.