Страница 1 из 2

Оптимизация фаервола ipfw

СообщениеДобавлено: 21 дек 2009, 02:02
dd2r
Доброго!
Есть роутер,
FreeBSD 6.4-RELEASE
который шейпит (dummynet), и натит (pf).
Стоят карточки Intel с драйверами от яндекса.
Когда трафика через роутер проходит больше ~300 мегабит, сервер начинает дропать пакеты.
Отключаю dymmynet и дропы проходят.
Что оптимизнуть еще ?


Правила ipfw :

Код: Выделить всё
01000 divert 8888 ip from table(100) to not me via vlan111
01001 divert 8888 ip from not 192.168.0.0/16 to table(100) via vlan111
03500 allow ip from me to any
03500 allow ip from any to me
06000 pipe 8 ip from not table(111) to table(1) out
06002 pipe 4 ip from not table(111) to table(2) out
06004 pipe 1 ip from not table(111) to table(3) out
06006 pipe 2 ip from not table(111) to table(4) out
06008 pipe 3 ip from not table(111) to table(5) out
06010 pipe 4 ip from not table(111) to table(6) out
06012 pipe 5 ip from not table(111) to table(7) out
06014 pipe 6 ip from not table(111) to table(8) out
06016 pipe 5 ip from not table(111) to table(9) out
06018 pipe 6 ip from not table(111) to table(10) out
-<skip->
06101 pipe 118 ip from table(1) to not table(111) in
06103 pipe 113 ip from table(2) to not table(111) in
06105 pipe 111 ip from table(3) to not table(111) in
06107 pipe 112 ip from table(4) to not table(111) in
06109 pipe 113 ip from table(5) to not table(111) in
06111 pipe 114 ip from table(6) to not table(111) in
06113 pipe 115 ip from table(7) to not table(111) in
06115 pipe 116 ip from table(8) to not table(111) in
06117 pipe 115 ip from table(9) to not table(111) in
06119 pipe 116 ip from table(10) to not table(111) in
-<skip->
50000 allow ip from table(100) to any
50001 allow ip from any to table(100)
65535 deny ip from any to any


Код: Выделить всё
###Pipe DST
 ipfw pipe 1 config mask dst-ip 0xffffffff bw 64Kbit/s
  ipfw pipe 2 config mask dst-ip 0xffffffff bw 256Kbit/s
   ipfw pipe 3 config mask dst-ip 0xffffffff bw 384Kbit/s
    ipfw pipe 4 config mask dst-ip 0xffffffff bw 512Kbit/s
  -<skip->

 ###Pipe SRC
  ipfw pipe 111 config mask src-ip 0xffffffff bw 64Kbit/s
   ipfw pipe 112 config mask src-ip 0xffffffff bw 256Kbit/s
    ipfw pipe 113 config mask src-ip 0xffffffff bw 384Kbit/s
     ipfw pipe 114 config mask src-ip 0xffffffff bw 512Kbit/s
  -<skip->



/etc/syscl.conf
Код: Выделить всё
net.isr.direct=1
net.inet.icmp.drop_redirect=1
net.inet.ip.dummynet.hash_size=16384
net.inet.ip.dummynet.expire=0
net.inet.ip.dummynet.io_fast=1
net.inet.ip.redirect=0



Код: Выделить всё
netstat -w1
            input        (Total)           output
   packets  errs      bytes    packets  errs      bytes colls
     37022     0   22099596      35286     0   21749490     0
     37360     0   22011616      35528     0   21347836     0
     37725     0   22415413      36078     0   21885994     0
     35915     0   20433160      34055     0   20229192     0
     37613     0   21515754      36192     0   21298763     0
     36372     0   20944890      34760     0   20687527     0
     36240     0   20884364      34757     0   20716686     0
     37227     0   21448024      35241     0   20821458     0
     36178     0   22039028      34803     0   21692352     0
     37899     0   22194868      35889     0   21648754     0
     35659     0   20748108      34122     0   20346314     0
     36268     0   20797240      34760     0   20705586     0
     36221     0   21590996      34398     0   20750023     0
     36619     0   21370536      34821     0   20948217     0
     36931     0   21977213      35096     0   21217615     0
     34554     0   20297866      32773     0   19969300     0
     34834     0   20036878      33334     0   19663359     0
     36875     0   21161292      34726     0   20671711     0
     35163     0   21006220      33600     0   20346644     0



используется 1 сетевой интерфейс для всех вланов, включая вланы к 2 аплинкам, от которых принимается 2 full-viev-a. Так же принимается \22 блок адрсеов своих. Которые натятся pool-naf от внутренних адресов pf-ом.
Есть возможность разнести аплинкеров по 2 физическим интерфесам, будет ли толк ?
+ интересуют примеры использования в фаерволе - pipe tablearg, skipto. И разнесения таблиц по пайпам.

Re: Оптимизация фаервола ipfw

СообщениеДобавлено: 21 дек 2009, 13:58
root
1. чему равна переменная net.inet.ip.fw.one_pass ?
Код: Выделить всё
sysctl net.inet.ip.fw.one_pass


2.
dd2r писал(а):и натит (pf).

а правила с divert это на счетчик трафика ? сколько проца он отъедает ?

3. рассписал бы по номерам таблиц, что они там описывают и зачем их так много ?
сколько примерно записей (IPшников) содержится в таблицах ?

4.
dd2r писал(а):используется 1 сетевой интерфейс для всех вланов, включая вланы к 2 аплинкам

так конечно можно, но я бы все же не стал так делать при трафике более 300 мбит
в чем сложно разделить на два ифейса ? один "вниз", а второй "наверх".

5. по своему опыту могут сказать, что лично я ушел от шейпинга по таблам, т.к. это реально грузит тачку
т.е. все обычные правила, все что можно я загоняю в таблицы, а вот шейп нет, правила идут для каждого IP, у меня так работает быстрее и стабильнее, но у меня нет такого кол-ва шейпов, один шейп "вверх", другой "вниз"

6.
dd2r писал(а):интересуют примеры использования в фаерволе - pipe tablearg, skipto

например:
Код: Выделить всё
65000 skipto 65003 ip from table(6,0) to any
65000  skipto 65003 ip from table(6,80) to any limit src-addr 80


7. какова нагрузка на CPU этой тачки ?

8. а ты не хочешь разделить процессы по разнысм тачкам ? а то у тя получается все в одном: NAT, шейп, считалка трафика (как я понимаю). Все это отъедает проц.
Можно/нужно некоторые службы убрать на другую машину/машины.

Re: Оптимизация фаервола ipfw

СообщениеДобавлено: 21 дек 2009, 16:44
dd2r
1.: net.inet.ip.fw.one_pass: 1
2. Правила divert "запрещают" попадать трафу к коллектор (ipcad)
3. Каждая таблица начиная от 1 до 10 содержит IP адреса юзеров согласно тарифам, а в среднем в каждой таблице по 300 записей.
В общем - 2000. Таблиц всего 30.
4. Т.е раскидать каждого аплинка на отдельный интерфейс, так же как и юзеров?
В чем я выиграю?
5. интересуют примеры использования в фаерволе - pipe tablearg, skipto для моего случая
С таблицами - удобно, меньше правил - меньше загрузки.

Код: Выделить всё
6last pid: 21844;  load averages:  1.69,  1.55,  1.55                                                                                                                                                                 up 0+01:43:25  18:37:36
84 processes:  7 running, 65 sleeping, 12 waiting
CPU 0:  2.6% user,  0.0% nice, 12.4% system, 16.5% interrupt, 68.4% idle
CPU 1:  8.3% user,  0.0% nice, 23.3% system,  0.0% interrupt, 68.4% idle
CPU 2:  4.7% user,  0.0% nice, 23.3% system,  0.0% interrupt, 72.0% idle
CPU 3:  5.4% user,  0.0% nice, 19.5% system,  0.4% interrupt, 74.7% idle
Mem: 491M Active, 12M Inact, 49M Wired, 18M Buf, 5235M Free
Swap: 1103M Total, 1103M Free


Код: Выделить всё
  PID USERNAME PRI NICE   SIZE    RES STATE  C   TIME   WCPU COMMAND
   10 root     171   52     0K    16K RUN    3  68:26 72.95% idle: cpu3
   12 root     171   52     0K    16K RUN    1  62:08 72.85% idle: cpu1
   13 root     171   52     0K    16K CPU0   0  51:27 68.31% idle: cpu0
   11 root     171   52     0K    16K RUN    2  73:23 67.14% idle: cpu2
   14 root     -44 -163     0K    16K WAIT   0  36:51 16.80% swi1: net
   26 root     -68    0     0K    16K -      2  23:23  3.42% dummynet

Re: Оптимизация фаервола ipfw

СообщениеДобавлено: 21 дек 2009, 18:58
root
dd2r, не обязательно цитировать весь мой пост целиком, чтобы ответить в одну строчку ;)
твое сообщение отредактировал

а на мои вопросы то ответишь ?

Re: Оптимизация фаервола ipfw

СообщениеДобавлено: 21 дек 2009, 21:07
dd2r
Как обстоят дела на 7-ке с SMP и сетью ?
Что прийдется изменить в моей конфигурации фаервола в 7,2 ?

Re: Оптимизация фаервола ipfw

СообщениеДобавлено: 22 дек 2009, 19:08
root
dd2r писал(а):2. Правила divert "запрещают" попадать трафу к коллектор (ipcad)

насколько я вижу они ничего не запрещают, они дивертят на порт 8888 трафик

dd2r писал(а):В общем - 2000. Таблиц всего 30.

не мало, тогда собственно понятно откуда нагрузка

dd2r писал(а):4. Т.е раскидать каждого аплинка на отдельный интерфейс, так же как и юзеров?

я предложил раскинуть юзеров и аплинков по разным интерфейсам, а не на каждого по интерфейсу
    1 ифейс - влан(ы) с юзерами
    2 ифейс - влан(ы) с аплинками
dd2r писал(а):В чем я выиграю?

не будет затыков при большом кол-ве пакетов в секунду через интерфейс

dd2r писал(а):5. интересуют примеры использования в фаерволе - pipe tablearg, skipto для моего случая

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

dd2r писал(а):С таблицами - удобно, меньше правил - меньше загрузки.

то что удобно не спорю, а вот со вторым я поспорю
правил меньше не становится, т.к. каждая таблица, в последствии, все равно "разворачивается" в правило, а для этого нужно найти совпадения, на что так же требудется время
что и сказывается и отражается в проблемах при большом кол-ве пакетов в секунду, которые проходят через firewall

ту загрузку что ты привел это сделано в "пиковые" моменты или обычные ?

кстати а POLLING ты не пробавл на интерфейсе включить ?

dd2r писал(а):Как обстоят дела на 7-ке с SMP и сетью ?

нормально обстоят

dd2r писал(а):Что прийдется изменить в моей конфигурации фаервола в 7,2 ?

нет, в ipfw ничего не менялось

Re: Оптимизация фаервола ipfw

СообщениеДобавлено: 03 янв 2010, 09:44
dd2r
С потерей пакетов разобрался, проблема была на стороне второго аплинка )))))
Возвращаюсь к вопросу оптимизации правил.

Хочу упростить конструкцию:

Код: Выделить всё
01000 pipe 8 ip from not table(111) to table(1) out
01002 pipe 4 ip from not table(111) to table(2) out
01004 pipe 1 ip from not table(111) to table(3) out

01101 pipe 118 ip from table(1) to not table(111) in
01103 pipe 113 ip from table(2) to not table(111) in
01105 pipe 111 ip from table(3) to not table(111) in



К использованию tablearg:

Код: Выделить всё
ipfw add 50010 pipe tablearg ip from not "table(111)" to "table(121)" out
ipfw add 50011 pipe tablearg ip from "table(122)" to not "table(111)" in 

Т.е использовать 2 таблицы.
121- На вход
122 -На выход
Каждому IP адресу в таблице будет соответствовать аргумент, который будет соответствовать номеру трубы.

Трубы описываются так:

Код: Выделить всё
ipfw pipe 256 config mask dst-ip 0xffffffff bw 256Kbit/s
ipfw pipe 1256 config mask src-ip 0xffffffff bw 256Kbit/s


В таблицы адреса попадают так :

Код: Выделить всё
ipfw table 121 add 192.168.5.5 256
ipfw table 122 add 192.168.5.5 256


Будут ли попадать в трубы юзеры, если схема подключения их и интернету к серверу такая:

em0
vlan1 -- 1 ISP
vlan2 -- 2 ISP
(NAT всех юзеров в 2 прова)
em1
vlan3 - 1 User 192.168.0.0/16
vlan4 - 2 User Real IP 123.123.123.0/24
vlan5 - User 172.16.0.0/12

Re: Оптимизация фаервола ipfw

СообщениеДобавлено: 04 янв 2010, 12:29
root
dd2r писал(а):Будут ли попадать в трубы юзеры


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

но мне кажется что стоит написать свою группу правил для каждого из vlan`ов с указанием интерфейса

Re: Оптимизация фаервола ipfw

СообщениеДобавлено: 05 янв 2010, 00:37
dd2r
Т.е оставить pipe какие есть и сделать:

Код: Выделить всё
ipfw add 500 pipe tablearg ip from not "table(111)" to "table(121)" out via vlan3 #  User 192.168.0.0/16
ipfw add 501 pipe tablearg ip from "table(122)" to not "table(111)" in  via vlan3 

ipfw add 510 pipe tablearg ip from not "table(111)" to "table(121)" out via vlan3 #  User Real IP 123.123.123.0/24
ipfw add 511 pipe tablearg ip from "table(122)" to not "table(111)" in  via vlan4 

ipfw add 520 pipe tablearg ip from not "table(111)" to "table(121)" out via vlan5 #  User 172.16.0.0/12
ipfw add 521 pipe tablearg ip from "table(122)" to not "table(111)" in  via vlan5 



Или вынести юзеров на L3 свитч и сделать к ним маршрут через отдельный vlan на сервере.

Добавить только 2 строчки pipe tablearg к примеру для шейпа, например :

Код: Выделить всё
ipfw add 50010 pipe tablearg ip from not "table(111)" to "table(121)" out via vlan100   
ipfw add 50011 pipe tablearg ip from "table(122)" to not "table(111)" in  via vlan100


Правильный ли будет шейп в этом случае ?

Re: Оптимизация фаервола ipfw

СообщениеДобавлено: 06 янв 2010, 12:04
root
dd2r писал(а):Правильный ли будет шейп в этом случае ?

главное не забывать, что все что для твоего интерфейса IN то для юзера это OUT и соответственно наоборот, все что для твоего ифейса OUT это IN для юзера
соответственно составляя трубы и сами правила нужно не забывать об этом
иначе или не будет работать вовсе или работать не правильно.

можно сделать и немного по другому, т.е. правила для исходящего шейпа (для юзера) вешать на интерфейс за котором он и находится, а правила входящего шейпа (для юзера) вешать на ифейсе в сторону прова.
в этом случае работа шейпера будет 100% верной, только не забывай что оба правила, в этом случае, будут иметь IN direction для обоих ифейсов (и юзерского и прововского)