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 4Kbytesipfw 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то инет вообще перестаёт работать.
Очень надеюсь на помощь сообщества!
>[оверквотинг удален]
># Запрещаем всё остальное
>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 + описание где внутренний, а где внешний интерфейс.
>[оверквотинг удален]
>>
>>Подскажите, что не так? Всю голову сломал :-( Предположительно где-то пакеты совершают
>>два прохода, но где - не пойму.. если в правилах указать
>>направления, типа:
>># выпускаем юзеров в инет
>>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 - внутреннийТут косяк со вторым проходом где-то :(
>[оверквотинг удален]
>>
>>А зачем определено значение queue ?
>>Ifconfig + описание где внутренний, а где внешний интерфейс.
>
>дело не в queue.
>
> fxp0 - внешний
> em0 - внутренний
>
>Тут косяк со вторым проходом где-то :(Это понятно что дело не в размере очереди... Просто не вижу глубокого смысла определять размер очерди..
Интересуют IP на интерфейсах. Я правильно понимаю, что 10.101.0.5 это ip пользователя?
>[оверквотинг удален]
>
># Запрещаем всё остальное
>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.0ip1 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.
>[оверквотинг удален]
>>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 - правила для многих юзеров добавляются динамически. Т.е. идея была создать общий пайп для безлимитчиков так, чтобы в него загонять любые ип, поэтому применил маску.. наверное имеет смысл создавать для каждого ип свой пайп..
>>[оверквотинг удален]
> На самом деле начиная с № 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'ом, видешь входящие пакеты на внутренеем интерфейсе при таком написании правил? И поправь конфиги к пайпам, если ты всех в одну трубу загоняешь, то тебе не надо ни масок указыать ни размер очереди определять.