Уже много лет трудятся несколько шлюзов на базе freebsd. Во всех используется одна схема правил ipfw, к которой привык.
в кратце конфигурация следующая:
Код: Выделить всё
fwcmd="/sbin/ipfw"
$fwcmd -f flush
iint="re0"
oint="rl0"
iip="192.168.20.254"
oip="91.222.123.45"
n1="192.168.20.0"
${fwcmd} add pass all from any to any via lo0
${fwcmd} add pass all from any to any via ${iint}
# Здесь всякие блокировки
${fwcmd} add deny all from any to 127.0.0.0/8
${fwcmd} add deny all from 127.0.0.0/8 to any
${fwcmd} add deny ip from me to any in recv ${oint}
${fwcmd} add deny ip from any 137-139 to any via ${oint}
${fwcmd} add deny ip from any to any 137-139 via ${oint}
# Разрешаем ssh
${fwcmd} add allow ip from any to me 22 keep-state
# Включаем нат
${fwcmd} nat 123 config ip ${oip} log
# Разрешающие правила
${fwcmd} add nat 123 ip from 192.168.20.5 to any
${fwcmd} add nat 123 ip from 192.168.20.6 to any
${fwcmd} add nat 123 tcp from ${n1}/24 to any \
dst-port 25,26,110,143,465,587,993,995 keep-state
# Завершающее правило нат
${fwcmd} add nat 123 ip from any to ${oip}
# Далее правила для шлюза, ими же пользуется и сквид
${fwcmd} add allow tcp from me to any dst-port 20,21,22,23,25,26,80,110,443,8080,8443,9443
${fwcmd} add allow udp from me to any dst-port 53,123
${fwcmd} add allow icmp from me to any icmptypes 0,3,4,8,10,11,30
# Далее всё, что не прошло по предыдущим правилам, блокируем и пишем в лог
${fwcmd} add deny log logamount 20000 all from any to any
Надо открыть новый порт, дописываем в правило ${fwcmd} add allow tcp from me to any dst-port 20,21,22,23,25,26,80,110,443,8080,8443,9443
Всё это здорово, но возникла задача приоритезации трафика IP телефонии.
Начал курить доки, выяснилось, что для работы pipe или queue нужно, чтобы в /etc/sysctl.conf присутствовал параметр net.inet.ip.fw.one_pass=0, который рушит весь мой чудесный конфиг. :-)
Я никак не могу понять логику работы ipfw с отключённым параметром one_pass.
Добавил правила после ${fwcmd} add pass all from any to any via ${iint}
Код: Выделить всё
sipip=77.55.66.88
# QoS
${fwcmd} pipe 1 config bw 2Mbits queue 20
${fwcmd} pipe 2 config bw 2Mbits queue 20
${fwcmd} queue 1 config pipe 1 weight 80 mask src-ip 0xffffffff gred 0.002/10/30/0.1
${fwcmd} queue 2 config pipe 1 weight 20 mask src-ip 0xffffffff gred 0.002/10/30/0.1
${fwcmd} queue 3 config pipe 2 weight 80 mask src-ip 0xffffffff gred 0.002/10/30/0.1
${fwcmd} queue 4 config pipe 2 weight 20 mask src-ip 0xffffffff gred 0.002/10/30/0.1
# IP Telephony
${fwcmd} add queue 1 ip from me to ${sipip}
${fwcmd} add queue 3 ip from ${sipip} to me
${fwcmd} add queue 2 ip from any to any out xmit ${oint}
${fwcmd} add queue 4 ip from any to any in recv ${oint}
Т.к. по умолчанию файрволл работает в режиме accept, последнее правило allow ip from any to any
В таком варианте приоритезация работает и всё выглядит замечательно, кроме одного - снаружи все порты открыты.
Помогите пожалуйста переписать мой скрипт, чтобы работала приотирезация и шлюз был защищен извне.