IPFW + kernel NAT + pipe + queue

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
kdesys
рядовой
Сообщения: 20
Зарегистрирован: 2008-09-02 17:49:47

IPFW + kernel NAT + pipe + queue

Непрочитанное сообщение kdesys » 2011-08-05 20:56:05

Всем привет.

Уже много лет трудятся несколько шлюзов на базе 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 nat 123 ip from 192.168.20.7 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}
Чтобы это работало пришлось в конце скрипта закоментировать правило ${fwcmd} add deny log logamount 20000 all from any to any
Т.к. по умолчанию файрволл работает в режиме accept, последнее правило allow ip from any to any

В таком варианте приоритезация работает и всё выглядит замечательно, кроме одного - снаружи все порты открыты.

Помогите пожалуйста переписать мой скрипт, чтобы работала приотирезация и шлюз был защищен извне.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
EARL
мл. сержант
Сообщения: 85
Зарегистрирован: 2010-05-24 9:05:18
Откуда: Тамбов

Re: IPFW + kernel NAT + pipe + queue

Непрочитанное сообщение EARL » 2011-08-07 20:44:22

kdesys писал(а): Начал курить доки, выяснилось, что для работы pipe или queue нужно, чтобы в /etc/sysctl.conf присутствовал параметр net.inet.ip.fw.one_pass=0, который рушит весь мой чудесный конфиг. :-)
Я никак не могу понять логику работы ipfw с отключённым параметром one_pass.
Логика простая. Если one_pass=1, то команда

Код: Выделить всё

${fwcmd} add nat 123 ip from 192.168.20.5 to any
Будет натить пакет по указанному правилу, после чего пакет будет отправлен дальше.
Если one_pass=0, то указанная выше команда будет натить пакет и дальше он будет передан на следующее правило в цепочке. Поэтому при one_pass=0, можно попробовать заменить указанную команду на

Код: Выделить всё

${fwcmd} add nat 123 ip from 192.168.20.5 to any
${fwcmd} add allow ip from 192.168.20.5 to any
По идее должно заработать.

pendolf
проходил мимо
Сообщения: 3
Зарегистрирован: 2011-08-08 11:23:13

Re: IPFW + kernel NAT + pipe + queue

Непрочитанное сообщение pendolf » 2011-08-08 11:53:39

Чтобы не плодить тему решил оставить сообщение тут.
Здравствуйте. В общем задача организовать шлюз+шейпер для сети 192.168.200.0/24. Dummynet использую в первый раз...

FreeBSD 8.2-RELEASE i386
Опции ядра:

Код: Выделить всё

options         IPFIREWALL
options         IPFIREWALL_FORWARD
options         IPFIREWALL_VERBOSE
options         IPFIREWALL_VERBOSE_LIMIT=50
options         IPFIREWALL_NAT
options         LIBALIAS 
options         ROUTETABLES=2 
options         DUMMYNET     
options         HZ="1000"     
sysctl -a | grep net.inet.ip.fw.one_pass
net.inet.ip.fw.one_pass: 0

Код: Выделить всё

gateway_enable="YES"

firewall_enable="YES"
firewall_nat_enable="YES"
dummynet_enable="YES"
firewall_script="/etc/firewall_nat"
firewall_logging="YES"
скрипт ipfw

Код: Выделить всё

#!/bin/sh
####################################################################
####################### Flush all rules ############################
####################################################################
/sbin/ipfw -q flush
/sbin/ipfw -q pipe flush
/sbin/ipfw -q queue flush
/sbin/ipfw -q table 1 flush
####################################################################
####################### Variables ##################################
####################################################################
IPFW="/sbin/ipfw -q"
local="127.0.0.0/8"
INT="bge0" # integrated iface
EXT="bge1" # pci card
EXT_IP="192.168.253.65"
localnet="192.168.200.0/24"
####################################################################
####################### Localhost ##################################
####################################################################
#Allows to use more than 1 pipe for packet
#/sbin/sysctl net.inet.ip.fw.one_pass=0
${IPFW} add allow ip from any to any via lo0
${IPFW} add deny ip from any to ${local}
${IPFW} add deny ip from ${local} to any
####################################################################
##################### Allow Rules ##################################
####################################################################
${IPFW} add allow ip from any to 192.168.253.0/24 in via ${EXT}
${IPFW} add allow ip from any to 192.168.200.0/24 in via ${EXT}
${IPFW} add allow ip from 192.168.253.0/24 to any out via ${EXT}
${IPFW} add allow ip from 192.168.200.0/24 to any out via ${EXT}
####################################################################
##################### Drop RFC 1918 network addresses ##############
####################################################################
${IPFW} add deny ip from any to 10.0.0.0/8 in via ${EXT}
${IPFW} add deny ip from any to 172.16.0.0/12 in via ${EXT}
${IPFW} add deny ip from any to 192.168.0.0/16 in via ${EXT}
${IPFW} add deny ip from any to 0.0.0.0/8 in via ${EXT}
${IPFW} add deny ip from any to 169.254.0.0/16 in via ${EXT}
${IPFW} add deny ip from any to 240.0.0.0/4 in via ${EXT}
${IPFW} add deny log icmp from any to 255.255.255.255 in via ${EXT}
${IPFW} add deny icmp from any to 255.255.255.255 out via ${EXT}
${IPFW} add deny log ip from 10.0.0.0/8 to any out via ${EXT}
${IPFW} add deny ip from 172.16.0.0/12 to any out via ${EXT}
${IPFW} add deny ip from 192.168.0.0/16 to any out via ${EXT}
${IPFW} add deny ip from 0.0.0.0/8 to any out via ${EXT}
${IPFW} add deny ip from 169.254.0.0/16 to any out via ${EXT}
${IPFW} add deny ip from 224.0.0.0/4 to any out via ${EXT}
${IPFW} add deny ip from 240.0.0.0/4 to any out via ${EXT}
####################################################################
######################## TABLES ####################################
####################################################################
${IPFW} table 1 add 192.168.200.10/32
####################################################################
######################## DNS/NTP/ICMP/SSH ##########################
####################################################################
${IPFW} add allow udp from any 53 to any via ${EXT}
${IPFW} add allow udp from any to any 53 via ${EXT}

${IPFW} add allow udp from any to any 123 via ${EXT}

${IPFW} add allow icmp from any to any icmptypes 0,8,11

${IPFW} add allow log tcp from any to any 22 in via ${EXT}
${IPFW} add allow all from any to any in recv ${EXT}
####################################################################
######################## NAT #######################################
####################################################################
${IPFW} add 10 allow ip from any to any via ${INT}
${IPFW} nat 1 config log if bge1 reset same_ports
${IPFW} add 100 nat 1 ip from any to any via ${EXT}

####################################################################
######################## DUMMYNET ##################################
#################### USERS 64Kbit/s ################################
#${IPFW} add 2000 pipe 1 log ip from any to table\(1\) out #To client
#${IPFW} pipe 1 config bw 64Kbit/s
#${IPFW} add 2001 pipe 2 log ip from table\(1\) to any in #From client
#${IPFW} pipe 2 config bw 64Kbit/s
${IPFW} pipe 512 config bw 512Kbit/s mask dst-ip 0xffffffff
${IPFW} add 513 pipe 1 log all from any to table\(1\) via ${EXT}
####################################################################
######################## DROP ALL ##################################
####################################################################
${IPFW} add deny log all from any to any
####################################################################
Собсна труба на 512Kbit/s

Код: Выделить всё

00512: 512.000 Kbit/s    0 ms burst 0
q131584  50 sl. 0 flows (1 buckets) sched 66048 weight 0 lmax 0 pri 0 droptail
 sched 66048 type FIFO flags 0x1 64 buckets 0 active
    mask:  0x00 0x00000000/0x0000 -> 0xffffffff/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
ipfw show

Код: Выделить всё

00010 19653 14099455 allow ip from any to any via bge0
00100 19474 14087440 nat 1 ip from any to any via bge1
00400   104   125949 allow ip from any to 192.168.253.0/24 in via bge1
00500  9588 13639229 allow ip from any to 192.168.200.0/24 in via bge1
[b]00513     0        0 pipe 1 log logamount 50 ip from any to table(1) via bge1[/b]
00600  9954   448722 allow ip from 192.168.253.0/24 to any out via bge1
[b]00700     0        0 allow ip from 192.168.200.0/24 to any out via bge1[/b]
65535    63    22281 deny ip from any to any
Проблема в том что не могу понять почему не заворачивается трафик в трубу? Уже перепробовал десятки вариантов, но трафик все ровно не шейпится.

pendolf
проходил мимо
Сообщения: 3
Зарегистрирован: 2011-08-08 11:23:13

Re: IPFW + kernel NAT + pipe + queue

Непрочитанное сообщение pendolf » 2011-08-09 9:24:06

Решил проблему, благодаря этой статье. Спасибо!

kdesys
рядовой
Сообщения: 20
Зарегистрирован: 2008-09-02 17:49:47

Re: IPFW + kernel NAT + pipe + queue

Непрочитанное сообщение kdesys » 2011-08-11 17:45:06

EARL писал(а): ----------- поскипано -------------
По идее должно заработать.
Ничего не понял.

Пока сделал так, добавив в конце:

# Разрешает шлюзу подключаться к любым хостам
${fwcmd} add allow ip from me to any
# Разрешает шлюзу принимать подключения от любых хостов
${fwcmd} add allow ip from any to me
# Разрешает трафик идущий снаружи в локалку (для работы nat)
${fwcmd} add allow ip from any to 192.168.20.0/24
# Блокируем всё остальное
${fwcmd} add deny log logamount 20000 all from any to any

Еще раз прошу.
Помогите пожалуйста переписать мой скрипт, чтобы работала приотирезация и шлюз был защищен извне.

kdesys
рядовой
Сообщения: 20
Зарегистрирован: 2008-09-02 17:49:47

Re: IPFW + kernel NAT + pipe + queue

Непрочитанное сообщение kdesys » 2011-08-21 16:01:24

*приоритезация