Я так понял, что необходимо дать доступ в Интернет внутренней сети 192.168.1.0/24 и разрешить этой сети доступ на порты 22, 80 и 53. Ядро собрано с поддержкой IPFW (необходимые опции я перечислил в предыдущем посте).
От этого задания и будем отталкиваться.
Небольшое лирическое отступление...
SSH работает на порту 22 по протоколу TCP. Web работает на 80 порту и тоже по TCP. А вот с ДНС не все так просто... Клиентские запросы "бегают" по UDP, порт 53. А по TCP выполняется только трансфер зон между серверами. Кстати, в выводе
netstat указано, что открыты только порты TCP, что меня немного смущает. В моем случае, при работающем DNS-сервере вывод netstat получается такой:
# netstat -an | grep 53
tcp4 0 0 127.0.0.1.953 *.* LISTEN
tcp4 0 0 172.20.0.1.53 *.* LISTEN
tcp4 0 0 10.200.0.1.53 *.* LISTEN
tcp4 0 0 195.3.158.206.53 *.* LISTEN
tcp4 0 0 127.0.0.1.53 *.* LISTEN
udp4 0 0 172.20.0.1.53 *.*
udp4 0 0 10.200.0.1.53 *.*
udp4 0 0 195.3.158.206.53 *.*
udp4 0 0 127.0.0.1.53 *.*
Для превращения сервера в роутер, необходимо разрешить пересылку пакетов между сетевыми интерфейсами. Для этого необходимо наличие в rc.conf такой строки:
gateway_enable="YES"
Разрешить пересылку пакетов "на ходу", не перезагружая сервер можно через параметр sysctl:
sysctl net.inet.ip.forwarding=1
Вернемся к файрволу...
Исходя из задания, в rc.firewall вставим такой блок (простенький файрвол, который клиентской сети и роутеру разрешает сетевой обмен без ограничений, и накладывает ограничения на доступ к роутеру):
[Rr][Oo][Uu][Tt][Ee][Rr])
net="192.168.1.0/24"
# Allow me
${fwcmd} add pass udp from me to any 53 keep-state
${fwcmd} add pass all from me to any
# Allow ICMP to me
${fwcmd} add pass icmp from any to me icmptypes 0,3,8,11
# Allow incoming setup
${fwcmd} add pass tcp from ${net} to me 22 setup
${fwcmd} add pass tcp from ${net} to me 80 setup
# Allow DNS
${fwcmd} add pass udp from ${net} to me 53
# Allow established TCP
${fwcmd} add pass all from any to me established
# Allow internal network
${fwcmd} add pass all from ${net} to not me
${fwcmd} add pass all from not me to ${net}
# Deny all to me
${fwcmd} add deny all from any to me
Вроде с правилами нигде не оплошал (не проверял именно эту конфигурацию на тестовой машине). По идее должно все работать...
Далее настраиваем НАТ по этой статье (PF):
http://muff.kiev.ua/content/nat-realizatsiya-s-pomoshchyu-pf.
Применяем все правила файрвола, описанные в блоке "ROUTER":
# sh /etc/rc.firewall ROUTER
Если файрвол работает нормально, применяем правила при загрузке системі, добавляя следующий блок в rc.conf:
# Firewall
firewall_enable="YES"
firewall_script="/etc/rc.firewall"
firewall_type="ROUTER"
Теперь комментарии по предыдущему посту...
Так понимаю, была попытка запустить
natd... Так вот, выиграш
IPFW NAT в том, что он работает только на ресурсах ядра, без запуска
natd. Так что о
natd советую пока забыть.
По вопросам:Что необходи поставить rc.conf для ipfw + nat ?По поводу IPFW уже отписался выше. Если НАТить будете (для начала) с помощью PF, то в статье все описано. Если НАТ-ить хотите с помощью ядерного НАТ-а, то необходимо просто добавить необходимые правила в
rc.firewall.
Почему когда я ставлю в свой файл firewall,ipfw вперед он жалуеться и зависает ? А вот здесь я мало что понял, в основном только догадки... Если у вас отдельный файл с правилами файрвола, то советую вначале файла вставить такой блок:
#!/bin/sh
setup_loopback () {
${fwcmd} add 5 pass all from any to any via lo0
${fwcmd} add 5 deny all from any to 127.0.0.0/8
${fwcmd} add 5 deny ip from 127.0.0.0/8 to any
}
fwcmd="/sbin/ipfw -q"
А потом уже все свои правила начинать с
${fwcmd}. Например:
${fwcmd} add 15 deny all from "table(5)" to any
Что не хватает правилу чтоб открыть 53 порт? 22 и 80 работают нормально с этими правиламиПо ходу я вначале описал разницу. По 53 порту у тебя будет бегать только UDP трафик. Вряд ли, что у тя будет выполняться трансфер зон.