САМЫЙ СЕРЬЕЗНЫЙ ГЕЙТ - Настраиваем ipfw + NAT во FreeBSD
DemiurG (arkhangel@mail.ru)
Спецвыпуск Xakep, номер #033, стр. 033-054-5
Пример 2: ipfw del 8000 - убираем это правило.
Пример 3: ipfw add allow tcp from any to 192.168.0.55 2000-2100 - разрешаем tcp трафик от любого хоста в Интернете к хосту 192.168.0.55 с 2000 по 2100 порт.
Пример 4: ipfw add 9200 count tcp from pop.mail.ru 110 to 192.168.6.200 via xl1 - подсчитаем, сколько почты скачивает хост c ip 192.168.6.200 c сервера mail.ru. В данном случае мы подсчитываем все по протоколам pop3, а если учитывать еще и imap4, то пример 4 будет выглядеть так:
ipfw add 92 count tcp from pop.mail.ru 110,143 to 192.168.6.200 via xl1
(так как imap4 использует порт 143).
Ты понял, почему в правиле 4 мы указываем интерфейс? Если в правиле 4 мы его не укажем, то трафик будет считаться два раза (сначала он пройдет через интерфейс xl1 - потом xl0). А если ты хочешь узнать, сколько ты отсылаешь почты, тогда пример 5: ipfw add 94 count tcp from 192.168.6.200 to smtp.mail.ru 25 via xl0.
Допустим, многие (или все) правила ты захотел отменить - вводи команду ipfw -f flush, и все правила, кроме последнего (65535 deny ip from any to any), удалятся. После того как очистил все правила, не удивляйся, что шлюз больше не функционирует - правило 20 (divert natd all from any to any via xl1) тоже исчезло.
ПОГРУЖЕНИЕ
Наверное, ты заметил, что все правила хранятся в оперативной памяти компа, то есть при случайной перезагрузке (или не случайной) весь твой труд будет уничтожен. Непорядок. Изменим это. Все настройки для ipfw задаются в файле /etc/rc.firewall. Используя файл rc.conf + опцию firewall_type="/usr/local/etc/firewall.conf", ты можешь сделать свой конфиг firewall'а (firewall.conf), из которого уже будут браться рулесы, но я обычно просто вставляю их в конец дефолтного rc.firewall. У нас должно получиться в несколько правил (не забудь, что нам надо еще защитить внутреннюю сеть от посягательств):
/sbin/ipfw -f flush
/sbin/ipfw add 20 divert natd all from any to any via xl1
/sbin/ipfw add 40 deny tcp from any to any 135-139 via xl1
/sbin/ipfw add 45 deny tcp from any 135-139 to any
/sbin/ipfw add 300 allow ip from 192.168.6.200 to any
/sbin/ipfw add 310 allow ip from any to 192.168.6.200 via xl1
/sbin/ipfw add 320 allow ip from any to 192.168.6.200 via xl0
/sbin/ipfw add 400 allow ip from 192.168.0.55 to any
/sbin/ipfw add 410 allow ip from any to 192.168.0.55 via xl1
/sbin/ipfw add 420 allow ip from any to 192.168.0.55 via xl0
/sbin/ipfw add 65000 allow ip from 222.222.222.222 to any
Прогрузим правила: sh /etc/rc.firewall. Смотрим ipfw -a list.
Оффтопик: если ты хочешь посмотреть какое-то определенное правило - тебе не обязательно поднимать все командой ipfw -a list, ты можешь просто задать ipfw show и номер нужного тебе правила. Пример (чтобы посмотреть правило 45): ipfw show 45.
Если ты не понял, давай разберем, что мы тут написали:
правила №40 и 45 запрещают вход и выход по нетбиосу (что есть хорошо - зачем локальной сети выход в Инет по нетбиосу). Для каждого внутреннего ip-адреса мы создаем 3 правила. Для ip-адреса 192.168.6.200 правило номер 300 разрешает выход в Интернет, а правила 310 и 320 позволяют обращаться к этому хосту из Интернета по интерфейсам xl1 и xl0 (без этих правил хост мог бы просто послать запрос к какому-либо серверу, но получить ответ от него не имел бы прав). Rule 65000 дает право роутеру отсылать пакеты от себя. Заметь, что тут обязательно надо указывать ip внешнего интерфейса, а не сам интерфейс. Благодарю тому, что у нас на каждый хост 3 специфических правила - посторонний (не прописанный) хост не может подключиться к твоей сети, то есть подключиться он сможет, но выйти в Инет нет (разумеется, до тех пор, пока ты для него не вобьешь эти три правила, тем самым разрешив ему доступ на роутере).