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

Исходное сообщение
"Помогите разобраться в правилах?"

Отправлено asphix , 09-Июл-08 00:35 
hi, all!

FreeBSD 6.0

Есть скрипт файрволла. В целом работает, но есть две проблемки, решение которых ниасилил, сколько вариантов не пробовал:

1. Исходящая скорость юзера ровно в два раза меньше размера пайпа, со входящей всё нормально.

2. Если юзер начинает качать с торрента, то, к примеру при пайпе в 64Кбит/с такую скорость он получает с каждого пира, что в итоге приводит к забиванию канала :(

Сам скрипт:
# Сброс текущих правил, пайпов и таблиц
ipfw -f flush
ipfw -f pipe flush

# юзерский сегмент
ipfw table 1 flush

# Описания интерфейсов
ext="fxp0"
int="em0"
srv="em1"

# Пайпы для безлимитных тарифов
ipfw pipe 1 config mask dst-ip 0xffffffff bw 64Kbit/s queue 4Kbytes
ipfw pipe 2 config mask src-ip 0xffffffff bw 64Kbit/s queue 4Kbytes

ipfw pipe 3 config mask dst-ip 0xffffffff bw 128Kbit/s queue 8Kbytes
ipfw pipe 4 config mask src-ip 0xffffffff bw 128Kbit/s queue 8Kbytes

# some security
ipfw add 30 pass all from any to any via lo0
ipfw add 40 deny all from any to 127.0.0.0/8
ipfw add 50 deny all from 127.0.0.0/8 to any

# NAT
ipfw add 70 divert natd ip from any to any out via ${ext}
ipfw add 80 divert natd ip from any to me in via ${ext}

# Разрешаем icmp-протокол
ipfw add 90 pass icmp from any to any in icmptype 0,3,4,11,12
ipfw add 100 pass icmp from any to any out icmptype 3,8,12

# Разрешаем раздачу адресов по DHCP
ipfw add 110 pass udp from 0.0.0.0 68 to me 67 in recv ${int}
ipfw add 120 pass udp from any 68 to 255.255.255.255 67 in recv ${int}
ipfw add 130 pass udp from me 67 to 255.255.255.255 68 out xmit ${int}

# Разрешаем юзерам подключатся к серверу для авторизации
ipfw add 165 pass tcp from 'table(1)' to me via ${int}
ipfw add 170 pass udp from 'table(1)' to me 5555 in via ${int}
ipfw add 180 pass udp from me 5555 to 'table(1)' out via ${int}

# Разрешаем dns-запросы и ntp для всех
ipfw add 190 pass udp from any to any 53,123
ipfw add 200 pass udp from any 53,123 to any

# Разрешаем роутеру связь с миром
ipfw add 210 pass ip from me to any keep-state

# выпускаем юзеров в инет
ipfw add 30000 pipe 2 ip from any to 10.101.0.5
ipfw add 30010 pipe 1 ip from 10.101.0.5 to any

# Запрещаем всё остальное
ipfw add 65530 deny all from any to any
-------------------8<---------------------------

Подскажите, что не так? Всю голову сломал :-( Предположительно где-то пакеты совершают два прохода, но где - не пойму.. если в правилах указать направления, типа:
# выпускаем юзеров в инет
ipfw add 30000 pipe 2 ip from any to 10.101.0.5 in
ipfw add 30010 pipe 1 ip from 10.101.0.5 to any out

то инет вообще перестаёт работать.

Очень надеюсь на помощь сообщества!


Содержание

Сообщения в этом обсуждении
"Помогите разобраться в правилах?"
Отправлено RSG , 14-Июл-08 10:41 
>[оверквотинг удален]
># Запрещаем всё остальное
>ipfw add 65530 deny all from any to any
>-------------------8<---------------------------
>
>Подскажите, что не так? Всю голову сломал :-( Предположительно где-то пакеты совершают
>два прохода, но где - не пойму.. если в правилах указать
>направления, типа:
># выпускаем юзеров в инет
>ipfw add 30000 pipe 2 ip from any to 10.101.0.5 in
>ipfw add 30010 pipe 1 ip from 10.101.0.5 to any out

А зачем определено значение queue ?
Ifconfig + описание где внутренний, а где внешний интерфейс.


"Помогите разобраться в правилах?"
Отправлено asphix , 14-Июл-08 11:41 
>[оверквотинг удален]
>>
>>Подскажите, что не так? Всю голову сломал :-( Предположительно где-то пакеты совершают
>>два прохода, но где - не пойму.. если в правилах указать
>>направления, типа:
>># выпускаем юзеров в инет
>>ipfw add 30000 pipe 2 ip from any to 10.101.0.5 in
>>ipfw add 30010 pipe 1 ip from 10.101.0.5 to any out
>
>А зачем определено значение queue ?
>Ifconfig + описание где внутренний, а где внешний интерфейс.

дело не в queue.

fxp0 - внешний
em0 - внутренний

Тут косяк со вторым проходом где-то :(


"Помогите разобраться в правилах?"
Отправлено RSG , 15-Июл-08 09:48 
>[оверквотинг удален]
>>
>>А зачем определено значение queue ?
>>Ifconfig + описание где внутренний, а где внешний интерфейс.
>
>дело не в queue.
>
> fxp0 - внешний
> em0 - внутренний
>
>Тут косяк со вторым проходом где-то :(

Это понятно что дело не в размере очереди... Просто не вижу глубокого смысла определять размер очерди..

Интересуют IP на интерфейсах. Я правильно понимаю, что 10.101.0.5 это ip пользователя?


"Помогите разобраться в правилах?"
Отправлено RSG , 15-Июл-08 10:10 
>[оверквотинг удален]
>
># Запрещаем всё остальное
>ipfw add 65530 deny all from any to any
>два прохода, но где - не пойму.. если в правилах указать
>направления, типа:
># выпускаем юзеров в инет
>ipfw add 30000 pipe 2 ip from any to 10.101.0.5 in
>ipfw add 30010 pipe 1 ip from 10.101.0.5 to any out
>
> то инет вообще перестаёт работать.

Правила 30000 и 30010 срабатывают на внутреннем интерфейсе em0, по этому правильнее было бы писать

ipfw add 30000 pipe 2 ip from any to 10.101.0.5 out
ipfw add 30010 pipe 1 ip from 10.101.0.5 to any in

Как я понимаю надо ограничить ширину канала для 10.101.0.5 т.е. для одного Ip-адреса. И для этого одного адреса есть один пайп. Как результат указывать маску в конфиге пайпа не нужно.

Потом... так как у Вас написано, в пайпе 1 маска из конфига применяется к dst-ip, т.е. канал выделяется для каждого отдельного ипа на который идет соединение. С пайпом 2 все с точности до наобарот.


На заметку :

MASK SRC-IP/DST-IP mask - инвертированая маска.  /24 - 0.255.255.255
однако /32 - 255.255.255.255, all - 0.0.0.0

                                 ip1        ip2
                                1.1.1.1   1.1.2.1
mask src-ip/dst-ip   0.0.0.ff  0.0.0.ff
result                      0.0.0.1 = 0.0.0.1 => одна труба


                                  ip1        ip2
                              1.1.1.1    1.1.2.1
mask src-ip/dst-ip   0.0.ff.ff  0.0.ff.ff
result                      0.0.1.1 <> 0.0.2.1 => разные трубы


Есть возможность указать сразу префикс сети, и для каждого ипа из этого  префикса установить ширину канала:

Например:

ipfw pipe 1 config bw 64KB/s mask dst-ip 0xffffffff
ipfw add 50 pipe 1 ip from any to 10.0.0.0/24

При этом _каждый_ хост из диапазона 10.0.0.1-10.0.0.254 получит полосу
по 64KB/s, т.е. на каждый IP будет создана отдельная pipe.


"Помогите разобраться в правилах?"
Отправлено asphix , 15-Июл-08 12:46 
>[оверквотинг удален]
>>ipfw add 30000 pipe 2 ip from any to 10.101.0.5 in
>>ipfw add 30010 pipe 1 ip from 10.101.0.5 to any out
>>
>> то инет вообще перестаёт работать.
>
>Правила 30000 и 30010 срабатывают на внутреннем интерфейсе em0, по этому правильнее
>было бы писать
>
>ipfw add 30000 pipe 2 ip from any to 10.101.0.5 out
>ipfw add 30010 pipe 1 ip from 10.101.0.5 to any in

так тоже пробовал. Инет таки не пашет.. почему и грешу на проходы..


>Как я понимаю надо ограничить ширину канала для 10.101.0.5 т.е. для одного
>Ip-адреса. И для этого одного адреса есть один пайп. Как результат
>указывать маску в конфиге пайпа не нужно.

На самом деле начиная с № 30000 - правила для многих юзеров добавляются динамически. Т.е. идея была создать общий пайп для безлимитчиков так, чтобы в него загонять любые ип, поэтому применил маску.. наверное имеет смысл создавать для каждого ип свой пайп..



"Помогите разобраться в правилах?"
Отправлено RSG , 15-Июл-08 14:31 
>>[оверквотинг удален]
> На самом деле начиная с № 30000 - правила для многих
>юзеров добавляются динамически. Т.е. идея была создать общий пайп для безлимитчиков
>так, чтобы в него загонять любые ип, поэтому применил маску.. наверное
>имеет смысл создавать для каждого ип свой пайп..

Макски то зачем если всех в один пайп пихаешь?
Можно сделать несколько правил с таблицами. На каждое правило свой пайп без всяких масок. Пользователей динамически помещать в нужную таблицу и они будут делить между собой этот общий пайп.

>ipfw add 30000 pipe 2 ip from any to 10.101.0.5 out
>ipfw add 30010 pipe 1 ip from 10.101.0.5 to any in
>так тоже пробовал. Инет таки не пашет.. почему и грешу на проходы..

Посмотри tcpdump'ом, видешь входящие пакеты на внутренеем интерфейсе при таком написании правил? И поправь конфиги к пайпам, если ты всех в одну трубу загоняешь, то тебе не надо ни масок указыать ни размер очереди определять.