URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 84002
[ Назад ]

Исходное сообщение
"Недопонимание принципов работы ipfw"

Отправлено Vadim_nsk , 07-Фев-09 16:01 
Здравствуйте
Подключился к местной сети и с собой подключил своих соседей (ранее была сеть для игр). Купил материнку, установил FreeBSD. Инет у всех работает, но есть некоторые неудобства.
Полазил по этому форуму и в силу своего понимания написал следующий конфиг ipfw (некоторое вырезано):

        # set these to your outside interface network and netmask and ip
        cn_if="cn_net"

        # set these to your inside interface network and netmask and ip
        kv_net="192.168.114.0/26"
        kv_mask="0xffffffc0"
        kvXXX_mask="0xfffffff8"
        kv143_if="kv143"
        kv143_net="192.168.114.24/29"
        kv144_if="kv144"
        kv144_net="192.168.114.32/29"
        kv140_if="kv140"
        kv140_net="192.168.114.40/29"
        kv139_if="kv139"
        kv139_net="192.168.114.48/29"
        kvNNN_if="kvNNN"
        kvNNN_net="192.168.114.56/29"

        ${fwcmd} disable one_pass

        ${fwcmd} add 100 check-state

#       setup_loopback
        ${fwcmd} add 200 pass all from any to any via lo0
        ${fwcmd} add 210 deny all from any to 127.0.0.0/8
        ${fwcmd} add 220 deny all from 127.0.0.0/8 to any

        # Stop spoofing
        ${fwcmd} add 400 reject log ip from ${kv_net} to any in via ${cn_if}
        ${fwcmd} add 401 reject log ip from ${kv_net} to any in via ${home_if}
        # Разрешить только розданные IP
        ${fwcmd} add 410 deny log all from not ${kv143_net} to any in via ${kv143_if}
        ${fwcmd} add 411 deny log all from any to not ${kv143_net} out via ${kv143_if}
        ${fwcmd} add 420 deny log all from not ${kv144_net} to any in via ${kv144_if}
        ${fwcmd} add 421 deny log all from any to not ${kv144_net} out via ${kv144_if}
        ${fwcmd} add 430 deny log all from not ${kv140_net} to any in via ${kv140_if}
        ${fwcmd} add 431 deny log all from any to not ${kv140_net} out via ${kv140_if}
        ${fwcmd} add 440 deny log all from not ${kv139_net} to any in via ${kv139_if}
        ${fwcmd} add 441 deny log all from any to not ${kv139_net} out via ${kv139_if}
        ${fwcmd} add 450 deny log all from not ${kvNNN_net} to any in via ${kvNNN_if}
        ${fwcmd} add 451 deny log all from any to not ${kvNNN_net} out via ${kvNNN_if}

        # Stop draft-manning-dsua-03.txt (1 May 2000) nets (includes RESERVED-1,
        # DHCP auto-configuration, NET-TEST, MULTICAST (class D), and class E)
        # on the outside interface
        ${fwcmd} table 1 add 0.0.0.0/8
        ${fwcmd} table 1 add 169.254.0.0/16
        ${fwcmd} table 1 add 192.0.2.0/24
        ${fwcmd} table 1 add 224.0.0.0/4
        ${fwcmd} table 1 add 240.0.0.0/4
        ${fwcmd} add 500 deny all from any to table\(1\) via ${cn_if}
        ${fwcmd} add 501 deny all from table\(1\) to any via ${cn_if}
        ${fwcmd} add 510 deny all from any to table\(1\) via ${home_if}
        ${fwcmd} add 511 deny all from table\(1\) to any via ${home_if}

        ${fwcmd} add 610 allow icmp from any to me in via ${cn_if} icmptype 0,3,4,11,12
        ${fwcmd} add 611 allow icmp from me to any out via ${cn_if} icmptype 3,8,12
        ${fwcmd} add 614 allow icmp from me to any out via ${cn_if} frag
        ${fwcmd} add 615 deny log icmp from any to any in via ${cn_if}
        ${fwcmd} add 620 allow icmp from any to any

        # Разрешить DHCP
        ${fwcmd} add 700 allow ip from any to any 67,68
        # Allow access to DNS
        ${fwcmd} add 710 allow tcp from any to any 53 setup
        ${fwcmd} add 711 allow udp from any to any 53 keep-state
        ${fwcmd} add 712 allow udp from any 53 to any

        # Разрешить ssh
        ${fwcmd} add 1000 allow tcp from any to me ssh
        # Закрыть все привилегированные порты
        ${fwcmd} add 1010 deny log ip from any to me 1-1024

        # Пространоство адресов сети
        ${fwcmd} table 11 add 172.16.0.0/12
        ${fwcmd} table 11 add 91.240.0.0/12
        ${fwcmd} table 11 add 80.64.80.0/20
        ${fwcmd} table 11 add 10.245.192.0/20

        # Настройка счетчиков трафика
        # ...

        # Используем squid для http (настрою позже)
#       ${fwcmd} add 1900 fwd 127.0.0.1,3128 tcp from ${kv_net} to any http out via ${cn_if}

        case ${natd_enable} in
        [Yy][Ee][Ss])
                if [ -n "${natd_interface}" ]; then
                        ${fwcmd} add 2000 divert natd all from any to any via ${natd_interface}
                fi
                ;;
        esac

        # Allow TCP through if setup succeeded
        ${fwcmd} add 2100 pass tcp from any to any established

        # Настройка исходящего общего трафика
        ${fwcmd} add 2200 pipe  1 ip from any to any out via ${natd_interface}
        ${fwcmd} pipe 1 config bw 100Mbit/s     # исходящий общий трафик
        #
        ${fwcmd} add 2201 queue 1 ip from ${kv143_net} to any
        ${fwcmd} add 2202 queue 2 ip from ${kv144_net} to any
        ${fwcmd} add 2203 queue 3 ip from ${kv140_net} to any
        ${fwcmd} add 2204 queue 4 ip from ${kv139_net} to any
        ${fwcmd} add 2205 queue 5 ip from ${kvNNN_net} to any
        ${fwcmd} queue 1 config pipe 1 weight 69 mask dst-ip 0x00000000 # kv143
        ${fwcmd} queue 2 config pipe 1 weight 70 mask dst-ip 0x00000000 # kv144
        ${fwcmd} queue 3 config pipe 1 weight 70 mask dst-ip 0x00000000 # kv140
        ${fwcmd} queue 4 config pipe 1 weight 70 mask dst-ip 0x00000000 # kv139
        ${fwcmd} queue 5 config pipe 1 weight 70 mask dst-ip 0x00000000 # kvNNN

        # Настройка входящего internet-трафика
        ${fwcmd} add 2210 pipe 3 ip from not table\(11\) to any in via ${natd_interface}
        ${fwcmd} pipe 3 config bw 4Mbit/s       # входящий internet-трафик
        #
        ${fwcmd} add 2211 queue 11 ip from not table\(11\) to ${kv143_net}
        ${fwcmd} add 2212 queue 12 ip from not table\(11\) to ${kv144_net}
        ${fwcmd} add 2213 queue 13 ip from not table\(11\) to ${kv140_net}
        ${fwcmd} add 2214 queue 14 ip from not table\(11\) to ${kv139_net}
        ${fwcmd} add 2215 queue 15 ip from not table\(11\) to ${kvNNN_net}
        ${fwcmd} queue 11 config pipe 3 weight 69 mask dst-ip 0x00000000        # kv143
        ${fwcmd} queue 12 config pipe 3 weight 70 mask dst-ip 0x00000000        # kv144
        ${fwcmd} queue 13 config pipe 3 weight 70 mask dst-ip 0x00000000        # kv140
        ${fwcmd} queue 14 config pipe 3 weight 70 mask dst-ip 0x00000000        # kv139
        ${fwcmd} queue 15 config pipe 3 weight 70 mask dst-ip 0x00000000        # kvNNN
        
        # Настройка входящего не_internet-трафика
        ${fwcmd} add 2220 pipe 4 ip from table\(11\) to any in via ${natd_interface}
        ${fwcmd} pipe 4 config bw 100Mbit/s     # входящий не_internet трафик
        #
        ${fwcmd} add 2221 queue 21 ip from table\(11\) to ${kv143_net}
        ${fwcmd} add 2222 queue 22 ip from table\(11\) to ${kv144_net}
        ${fwcmd} add 2223 queue 23 ip from table\(11\) to ${kv140_net}
        ${fwcmd} add 2224 queue 24 ip from table\(11\) to ${kv139_net}
        ${fwcmd} add 2225 queue 25 ip from table\(11\) to ${kvNNN_net}
        ${fwcmd} queue 21 config pipe 4 weight 49 mask dst-ip 0x00000000
        ${fwcmd} queue 22 config pipe 4 weight 50 mask dst-ip 0x00000000
        ${fwcmd} queue 23 config pipe 4 weight 50 mask dst-ip 0x00000000
        ${fwcmd} queue 24 config pipe 4 weight 50 mask dst-ip 0x00000000
        ${fwcmd} queue 25 config pipe 4 weight 50 mask dst-ip 0x00000000
        
        # Настройка пропускной способности каналов
        ${fwcmd} pipe 10 config bw 100Mbit/s
        ${fwcmd} pipe 11 config bw 3Mbit/s      # kv143
        ${fwcmd} pipe 12 config bw 3Mbit/s      # kv144
        ${fwcmd} pipe 13 config bw 3Mbit/s      # kv140
        ${fwcmd} pipe 14 config bw 3Mbit/s      # kv139
        ${fwcmd} pipe 15 config bw 3Mbit/s      # kvNNN
        #
        ${fwcmd} add 2300 pipe 11 ip from not table\(11\) to any out via ${kv143_if}
        ${fwcmd} add 2310 pipe 12 ip from not table\(11\) to any out via ${kv144_if}
        ${fwcmd} add 2320 pipe 13 ip from not table\(11\) to any out via ${kv140_if}
        ${fwcmd} add 2330 pipe 14 ip from not table\(11\) to any out via ${kv139_if}
        ${fwcmd} add 2340 pipe 15 ip from not table\(11\) to any out via ${kvNNN_if}

        # Allow IP fragments to pass through
        ${fwcmd} add 5100 pass all from any to any frag

        ${fwcmd} add 65000 pass all from any to any
#       ${fwcmd} add 65535 deny all from any to any


Что пытался получить:
1. Независимую работу всех интерфейсов (не предлагайте VLAN, уже предлагали)
2. Регулировку ширины internet-канала, не затрагивая доступ к ресурсам локальной сети (правила 2300...2340).
3. Честное (равноправное) использование как входного (2210...2215) так и выходного канала во внешнюю сеть (2200...2205).
4. В планах сделать весь http-трафик через squid. Исходящую почту через локальный сервер (закрыв 25 порт).

А теперь вопросы:
1. На форуме в нескольких местах видел рекомендацию, чтобы правило "pass tcp from any to any established" ставить как можно раньше. Попробовал поставить выше, чем у меня он написан, отвалился инет. Так где его надо писать?
2. Правилами 410...451 пытался запретить подмену IP (как я это понимаю), но там постоянно нарастают счетчики. Что я делаю не так? Какие адреса надо открыть для каждого интерфейса?
3. Без правила: ${fwcmd} add 65000 pass all from any to any ничего не рабоатет. Что я упустил?
4. При запуске данного скрипта на почту рута приходит письмо со следующими строками:


02210 pipe 3 ip from not table(11) to any in via cn_net
02211 queue 11 ip from not table(11) to 192.168.114.24/29
02212 queue 12 ip from not table(11) to 192.168.114.32/29
02213 queue 13 ip from not table(11) to 192.168.114.40/29
02214 queue 14 ip from not table(11) to 192.168.114.48/29
02215 queue 15 ip from not table(11) to 192.168.114.56/29
ipfw: setsockopt(IP_DUMMYNET_CONFIGURE): Invalid argument
ipfw: setsockopt(IP_DUMMYNET_CONFIGURE): Invalid argument
02220 pipe 4 ip from table(11) to any in via cn_net
02221 queue 21 ip from table(11) to 192.168.114.24/29
02222 queue 22 ip from table(11) to 192.168.114.32/29
02223 queue 23 ip from table(11) to 192.168.114.40/29
02224 queue 24 ip from table(11) to 192.168.114.48/29
02225 queue 25 ip from table(11) to 192.168.114.56/29
ipfw: setsockopt(IP_DUMMYNET_CONFIGURE): Invalid argument
ipfw: setsockopt(IP_DUMMYNET_CONFIGURE): Invalid argument
02300 pipe 11 ip from not table(11) to any out via kv143
02310 pipe 12 ip from not table(11) to any out via kv144
02320 pipe 13 ip from not table(11) to any out via kv140
02330 pipe 14 ip from not table(11) to any out via kv139
02340 pipe 15 ip from not table(11) to any out via kvNNN

Что именно "Invalid argument"?
5. Какие у вас есть замечания и рекомендации по данному конфигу?

Содержание

Сообщения в этом обсуждении
"Недопонимание принципов работы ipfw"
Отправлено UserAnonymous , 07-Фев-09 16:21 
отвечу на пару вопросов.
1 - советы одно, на практике нужно понять что в данном случае для вас есть естеблишед. по этому лучше забудьте на какое то время про оное.
2 - пасс нужен,т.к. у вас идут просто шейпы, а по проходу всех шейпов идет правило денай.
т.е. все пакеты проходят шейпы, и далее попадают на результирующее правило - денай, оно и дропает все.
3 - может статические адреса раздать и arp static запустить? либо можно поднять впн и через него пускать все, и вам нагляднее как резать и ограничивать и проблем с подменой адреса не будет.
4 - вам не нужно испрользовать table в данном случае. т.к. при добавлении 192.168.100.1/28 - вы добавляет весь этот блок адресов. т.е. в данном случае оно видимо ругается на то, что уже существуют эти адреса. лучше использовать /32

"Недопонимание принципов работы ipfw"
Отправлено UserAnonymous , 07-Фев-09 16:22 
http://ipfw.ism.kiev.ua/ - для введения в ipfw

"Недопонимание принципов работы ipfw"
Отправлено Vadim_nsk , 07-Фев-09 16:27 
>http://ipfw.ism.kiev.ua/ - для введения в ipfw

Когда писал свой конфиг, в основном, опирался на материал именно этого сайта. Спасибо, сайт отличный, но мне не во всем помог. Похоже есть некоторая узкая грань недопонимания, которую можно уже стереть лишь показав чего достиг и спросив то, что непонятно, что и пытаюсь сделать.


"Недопонимание принципов работы ipfw"
Отправлено Vadim_nsk , 07-Фев-09 16:39 
>[оверквотинг удален]
>всех шейпов идет правило денай.
>т.е. все пакеты проходят шейпы, и далее попадают на результирующее правило -
>денай, оно и дропает все.
>3 - может статические адреса раздать и arp static запустить? либо можно
>поднять впн и через него пускать все, и вам нагляднее как
>резать и ограничивать и проблем с подменой адреса не будет.
>4 - вам не нужно испрользовать table в данном случае. т.к. при
>добавлении 192.168.100.1/28 - вы добавляет весь этот блок адресов. т.е. в
>данном случае оно видимо ругается на то, что уже существуют эти
>адреса. лучше использовать /32

В table(11) я перечислил все серые адреса той, сети, через которую я хожу в инет, т.к. не придумал другого способа описать диапазон белых адресов. Т.е. мне тут нужно отделить серый трафик от белого. И для подсчета трафика и для определения приоритетов доступа. И для введения ограничения на скорость доступа (на инете анлим 3Мбит/сек, а в локальной сети лимит 100Мбит/сек). Чтобы можно было качать одновременно файлы и с инета и из сети, придумал ввести несколько пайпов, написал глядя в примеры, на доступ в инет пытался указать бОльший приоритет доступа (приоритет очереди).
Еще заметил такую вещь, если один из клиентов использует torrent, остальные в инет не могут попасть, торрент съедает весь канал. Для этого и пытаюсь ввести равноправное использование входного internet-канала (not tabble 11). Для скачивания из локальной сети, равноправное использвоание входного локального канала (tabble 11). А для того, чтобы закачка на внешний ftp-сервер не забила выходной канал, использую и равноправные права на выходной канал.


"Недопонимание принципов работы ipfw"
Отправлено Vadim_nsk , 09-Фев-09 05:11 
Переписал часть конфига иначе, заменив table списком адресов, не помогло:

        # set these to your outside interface network and netmask and ip
        cn_if="cn_net"
        home_if="home_net"
        home_net="10.10.0.0/16"

        # set these to your inside interface network and netmask and ip
        kv_nets="192.168.114.0/26"
        kv_mask="0xffffffc0"
        kvXXX_mask="0xfffffff8"
        kv143_if="kv143"
        kv143_net="192.168.114.24/29"
        kv144_if="kv144"
        kv144_net="192.168.114.32/29"
        kv140_if="kv140"
        kv140_net="192.168.114.40/29"
        kv139_if="kv139"
        kv139_net="192.168.114.48/29"
        kvNNN_if="kvNNN"
        kvNNN_net="192.168.114.56/29"

        ...

        bad_nets="0.0.0.0/8,169.254.0.0/16,192.0.2.0/24,224.0.0.0/4,240.0.0.0/4"
        ${fwcmd} add 500 deny all from any to ${bad_nets}
        ${fwcmd} add 501 deny all from ${bad_nets} to any

        ...

        # Пространство адресов сети
        cn_nets="172.16.0.0/12,91.240.0.0/12,80.64.80.0/20,10.245.192.0/20"

        ${fwcmd} add 2000 divert natd all from any to any via ${natd_interface}

        # Allow TCP through if setup succeeded
        ${fwcmd} add 2100 pass tcp from any to any established

        # Настройка исходящего общего трафика
        # Даем всем равные приоритеты на исходящий трафик
        ${fwcmd} add 2200 pipe  1 ip from ${kv_nets} to any out via ${natd_interface}
        ${fwcmd} pipe 1 config bw 100Mbit/s     # исходящий общий трафик
        ${fwcmd} queue 1 config pipe 1 weight 80 mask dst-ip 0x00000007
        ${fwcmd} add 2201 queue 1 ip from ${kv_nets} to any

        # Настройка входящего internet-трафика
        # Даем всем равные приоритеты на входящий internet-трафик
        ${fwcmd} add 2210 pipe 3 ip from not ${cn_nets} to ${kv_nets} in via ${natd_interface}
        ${fwcmd} pipe 3 config bw 4Mbit/s       # входящий internet-трафик
        ${fwcmd} queue 11 config pipe 3 weight 80 mask dst-ip 0x00000007
        ${fwcmd} add 2211 queue 11 ip from not ${cn_nets} to ${kv_nets}

        # Настройка входящего не_internet-трафика
        # Даем всем равные приоритеты на входящий не internet-трафик
        ${fwcmd} add 2220 pipe 4 ip from ${cn_nets} to ${kv_nets} in via ${natd_interface}
        ${fwcmd} pipe 4 config bw 100Mbit/s     # входящий не_internet трафик
        ${fwcmd} queue 21 config pipe 4 weight 80 mask dst-ip 0x00000007
        ${fwcmd} add 2221 queue 21 ip from ${cn_nets} to ${kv_nets}

        # Настройка пропускной способности каналов
        ${fwcmd} add 2300 pipe 11 ip from not ${cn_nets} to any out via ${kv143_if}
        ${fwcmd} add 2310 pipe 12 ip from not ${cn_nets} to any out via ${kv144_if}
        ${fwcmd} add 2320 pipe 13 ip from not ${cn_nets} to any out via ${kv140_if}
        ${fwcmd} add 2330 pipe 14 ip from not ${cn_nets} to any out via ${kv139_if}
        ${fwcmd} add 2340 pipe 15 ip from not ${cn_nets} to any out via ${kvNNN_if}
        # Возьмем для примера разный трафик
        ${fwcmd} pipe 11 config bw 1Mbit/s      # kv143
        ${fwcmd} pipe 12 config bw 2Mbit/s      # kv144
        ${fwcmd} pipe 13 config bw 3Mbit/s      # kv140
        ${fwcmd} pipe 14 config bw 512Kbit/s    # kv139
        ${fwcmd} pipe 15 config bw 256Kbit/s    # kvNNN

В почту приходит опять тоже самое:


02200 pipe 1 ip from 192.168.114.0/26 to any out via cn_net
02201 queue 1 ip from 192.168.114.0/26 to any
02210 pipe 3 ip from not 172.16.0.0/12,91.240.0.0/12,80.64.80.0/20,10.245.192.0/20 to 192.168.114.0/26 in via cn_net
ipfw: setsockopt(IP_DUMMYNET_CONFIGURE): Invalid argument
02211 queue 11 ip from not 172.16.0.0/12,91.240.0.0/12,80.64.80.0/20,10.245.192.0/20 to 192.168.114.0/26
02220 pipe 4 ip from 172.16.0.0/12,91.240.0.0/12,80.64.80.0/20,10.245.192.0/20 to 192.168.114.0/26 in via cn_net
ipfw: setsockopt(IP_DUMMYNET_CONFIGURE): Invalid argument
02221 queue 21 ip from 172.16.0.0/12,91.240.0.0/12,80.64.80.0/20,10.245.192.0/20 to 192.168.114.0/26

Почему "ipfw: setsockopt(IP_DUMMYNET_CONFIGURE): Invalid argument"?
Разве может очередь одного пайпа как-то пересекаться с очередью дрйгого пайпа?
Я специально описал 4 разных канала:
1 весь исходящий трафик через внешний интерфейс
2 входящий internet-трафик через внешний интерфейс
3 входящий не internet-трафик через внешний интерфейс
4 входящий internet-трафик на локальных интерфесах (ограничения на скорость закачки конкретно для каждого клиента)

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