Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> настройка —> IPFW policy (PBR)

Policy-based routing & FreeBSD

Автор: bekhterev.


Как то давно у меня зашел спор с одним администратором о возможностях 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:

fxp1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=b<RXCSUM,TXCSUM,VLAN_MTU>
	ether 00:02:b3:b0:xx:xx
	inet 1.1.1.195 netmask 0xfffffff8 broadcast 1.1.1.199
	inet 1.1.1.197 netmask 0xfffffff8 broadcast 1.1.1.199
	media: Ethernet autoselect (10baseT/UTP)
	status: active

Первое, что пришло в голову, это разделить входящий трафик, что и было сделано:

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.195 22,53,80,433,1024-65535 to any out via fxp1
00065  allow ip from 1.1.1.197 25,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

Итого, получается нечто общее:

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.195 22,53,80,433,1024-65535 to any out via fxp1
00065  allow ip from 1.1.1.197 25,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.



размещено: 2009-03-09,
последнее обновление: 2009-03-30,
автор: bekhterev


andr, 2009-03-29 в 19:35:36

Листинг ifconfig:
broadcast поправить c 79.175.18.199 на 1.1.1.199

На РАТ завернут SSH
00010  skipto 900 ip from me to any dst-port 22 out
00020  skipto 900 ip from any 22 to me in
а по идее заворачивать надо было POP...
мож я не прав?

bekhterev, 2009-03-29 в 23:15:15

79.175.18.199 - бродкаст остался с реальным айпи (забыл потереть, сорри). В реальности у меня еще и ssh завернут через этот интерфейс. поп заворачивать сысла нет, т.к. закрыт извне.
Спасибо за указания. Вообще все взято с реальной машины. Каюсь в невнимательности.

nikll, 2009-04-10 в 10:33:04

у ipfw своя ниша у pf своя, часто они заменяют друг друга без проблем, а ipf (на мой сугубо личный взгляд) это нечто напоминающщее недоделанный pf



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.1756 секунд
Из них PHP: 22%; SQL: 78%; Число SQL-запросов: 86 шт.
Исходный размер: 25054; Сжатая: 5813