FIREWALL

Программы и дополнительная литература

Вы должны прочитать HOWTO: Firewall.

Там сказано, что вам понадобится утилита ipfwadm, если у вас ее еще нет. Существуют, правда, и другие, но как я начал использовать ipfwadm, так на нем и остановился. Он достаточно удобен и прост! Вы всегда знаете, что конкретно он делает.

Предварительные проверки

Вы уже собрали IP-переадресацию и маскарадинг в ядро, поэтому проверьте, находится ли firewall в его стандартном (разрешающем) состоянии командой

ipfwadm -I -l ipfwadm -O -l ipfwadm -F -l 

Эти команды выдадут список правил соответственно для входного, выходного и переадресуемых потоков firewall. Опция "-l" означает "list" (список).

Возможно, вы собрали и систему учета IP-пакетов:

ipfwadm -A -l 

Вы увидите, что ни одно правило не определено, и что, по умолчанию, firewall пропускает все пакеты. Вы всегда можете вернуться к этому состоянию командами

ipfwadm -I -f
ipfwadm -O -f
ipfwadm -F -f 

Опция "-f" означает "flush" (сбросить, очистить). Эта опция вам может понадобиться.

Основное правило

Я хочу отрезать внешний мир от моей сети и не более того, поэтому мое последнее (воспринимаемое по умолчанию) правило будет следующим - firewall должен игнорировать любые пакеты, идущие из внутренней сети во внешний мир. Я поместил все правила в файл /etc/rc.d/rc.firewall и запускаю его из /etc/rc.d/rc.local в процессе загрузки.

ipfwadm -I -a reject -S 192.168.2.0/255.255.255.128 -D 0.0.0.0/0.0.0.0 

Опция "-S" задает адрес источника и маску. "-D" - адрес и маску получателя.

Это - достаточно подробный формат. Ipfwadm понимает сетевые имена и некоторые сокращения (все это описано в man).

Наверно, более удобно поместить некоторые или все эти правила в выходной поток firewall, используя "-O" вместо "-I", но я оставлю эти правила на входящем потоке.

Исключения для адресов

Все исключения этому общему отрицанию я должен поместить до установки основного правила.

Машина, работающая в качестве firewall во внутренней сети, будет иметь некоторые привилегии. Без особого разрешения будет запрещено входить в машину, использующую firewall, но с этим разрешением им можно общаться с внешним миром.

ipfwadm -I -i accept -S 192.168.2.100/255.255.255.255 \
 -D 0.0.0.0/0.0.0.0 

Я также разрешу клиентам внутренней сети общаться с firewall-машиной. Возможно, они попытаются таким образом постараться выбраться во внешний мир!

ipfwadm -I -i accept -S 192.168.2.0/255.255.255.128 \
 -D 192.168.2.100/255.255.255.255 

На этом моменте вы можете попытаться добраться до клиентов снаружи firewall, при помощи telnet, но у вас ничего не получится. Это означает, что вы смогли увидеть их машины, но они не могут послать вам ничего. Вы сможете установить контакт с внутренними машинами, если firewall у вас играет роль простого аудитора. Испытайте rlogin и ping , а также tcpdump на первой или второй карте. Вы должны понять, что вы увидите.

Исключения для протоколов

Я буду облегчать правила протокол за протоколом. Первое, что я хочу сделать - разрешить ping снаружи внутрь и получать ответ, поэтому я добавлю правило:

ipfwadm -I -i accept -P icmp -S 192.168.2.0/255.255.255.128 \
 -D 0.0.0.0/0.0.0.0 

Опция "-P icmp" как раз отвечает за протокол.

Пока я не настроил должным образом ftp-proxy, я также разрешу вызовы ftp, используя конкретные порты - 20, 21 и 115 на внешние машины.

ipfwadm -I -i accept -P tcp -S 192.168.2.0/255.255.255.128 \
 -D 0.0.0.0/0.0.0.0 20 21 115 

Я так и не смог заставить работать sendmail между внутренними машинами без DNS. Вместо настройки собственного DNS-сервера, я просто разрешил запросы с моей сети к внешнему серверу, поместив заодно его адрес в файлы /etc/resolv.conf на машинах моей сети ("nameserver 123.456.789.31" в отдельной строке).

ipfwadm -I -i accept -P tcp -S 192.168.2.0/255.255.255.128 \
 -D 123.456.789.31/255.255.255.255 54 

Номер порта и протокол определенного сервиса вы можете узнать при помощи tcpdump. Задействуйте этот сервис при помощи ftp или telnet или чего-нибудь подобного с внутренней машины или на нее, и затем проверяйте порты firewall при помощи tcpdump, например:

tcpdump -i eth1 -e host client04 

В файле /etc/services также есть много интересного. Чтобы разрешить telnet и ftp ВНУТРЬ сети ИЗВНЕ через firewall, вам придется разрешить локальным клиентам производить вызовы НАРУЖУ на определенных портах. С ftp все понятно - это сервер, организующий собственное соединение с получателем - но я не очень понимаю, зачем это необходимо для telnet.

ipfwadm -I -i accept -P tcp -S 192.168.2.0/255.255.255.128 ftp telnet \
 -D 0.0.0.0/0.0.0.0 

Иногда возникает проблема с некоторыми демонами, которые пытаются выяснить имя машины-firewall, чтобы узнать собственный сетевой адрес. У меня лично возникла проблема с Rpc.yppasswdd. Он настаивал на передаче информации наружу от firewall (через вторую карту). Это привело к тому, что клиенты изнутри его не видели.

Вместо запуска IP-алиасинга или правки кода демона, я просто переписал имя машины на адрес внутренней карты в клиентских файлах /etc/hosts.

Проверка

Вам, наверное, надо будет проверить работу telnet, rlogin и ping снаружи. Изнутри вы должны смочь произвести ping наружу. Вы также должны иметь возможность команды telnet на firewall-машину изнутри сети, а на самой этой машине должно быть возможно все.

Вот и все. Далее вам, наверно, стоит узнать подробнее про rpc/Yellow Pages и работу с файлом паролей. Сеть с firewall должна работать так, чтобы обычные пользователи не могли войти в firewall (если они смогут зайти в него, они смогут выбраться наружу). Хороших вам HOWTO!