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

Вот одному приятелю настругал такой Firewall для создания маленькой локалки у него дома:
PS. Уже 2й год работает без перебоев.

Условие было такое:
1е, коннект по ADSL
2е, раздача в сеть по префиксу (остальных в бан)
3е, вывод графиков
4е, урезание скорости части портов (в данном случае скорость и количество потоков для торент-качалок и ему подобных)

PS. С того времени как был создан этот Firewall — уже много чего в нем добавилось (в плане полос пропускания, новых IP, поэтому я приведу для примера только парочку)

На тот момент в голову пришло такое:

#!/bin/sh
####rc.firewall
ipfw=»/sbin/ipfw -q»
ADSL=»tun0″
Lan=»vr0″
In=»ed0″
IpLAN=»192.168.0.1″
NetLAN=»192.168.0.0″
NetMask=»24″
proxy=»127.0.0.1″
user_prefix=’192.168.0′
NoFWDport=»20,21,22,23,25,110,3128,5190,8080,8081,80,443,777″

${ipfw} -f flush
${ipfw} -f pipe flush
${ipfw} -f queue flush

#####0.Подсчёт трафика для графиков..
###Iface_inet
${ipfw} add 50 count ip from any to any in via ${In}
${ipfw} add 51 count ip from any to any out via ${In}
###In_Inet
${ipfw} add 52 count ip from any to any in via ${ADSL}
${ipfw} add 53 count ip from any to any out via ${ADSL}
###LAN
${ipfw} add 54 count ip from any to any in via ${Lan}
${ipfw} add 55 count ip from any to any out via ${Lan}
###my_FTP
${ipfw} add 56 count ip from 192.168.0.0/24 to me 20,21
${ipfw} add 57 count ip from me 20,21 to 192.168.0.0/24
###Users_inet
${ipfw} add 58 count ip from any to 192.168.0.0/24 not src-ip me
${ipfw} add 59 count ip from 192.168.0.0/24 to any not dst-ip me
###Proxy_traffic
${ipfw} add 60 count ip from any 80 to me
###Apache
${ipfw} add 62 count ip from me 80 to any
${ipfw} add 63 count ip from any to me 80
##End_0.
###Настраиваем локальный интерфейс (localhost)
#${ipfw} add 1001 check-state
${ipfw} add 1002 allow ip from any to any via lo0
${ipfw} add 1003 deny ip from any to 127.0.0.0/8
${ipfw} add 1004 deny ip from 127.0.0.0/8 to any
####Разрешаем доступ к серверу с мира по ssh
${ipfw} add 1007 allow ip from any to me 22
${ipfw} add 1008 allow ip from me 22 to any
######2.Рубим частные сeти на внешнем интерфейсе (там же ADSL, нафиг там эти пакеты?)
##По интерфейсу на котором ADSL
${ipfw} add 1010 deny ip from any to 10.0.0.0/8 in via ${In}
${ipfw} add 1011 deny ip from any to 172.16.0.0/12 in via ${In}
${ipfw} add 1012 deny ip from any to 192.168.0.0/16 in via ${In}
${ipfw} add 1013 deny ip from any to 0.0.0.0/8 in via ${In}
#рубим автоконфигуреную частную сеть
${ipfw} add 1014 deny ip from any to 169.254.0.0/16 in via ${In}
#рубаем мультикастовые рассылки
${ipfw} add 1015 deny ip from any to 240.0.0.0/4 in via ${In}
#рубим фрагментированные icmp
${ipfw} add 1016 deny icmp from any to any frag
#рубим широковещательные icmp на внешнем интерфейсе
${ipfw} add 1017 deny log icmp from any to 255.255.255.255 in via ${In}
${ipfw} add 1018 deny log icmp from any to 255.255.255.255 out via ${In}
##По тунелю поднятом в мир (ADSL)
${ipfw} add 1020 deny ip from any to 10.0.0.0/8 in via ${ADSL}
${ipfw} add 1021 deny ip from any to 172.16.0.0/12 in via ${ADSL}
${ipfw} add 1022 deny ip from any to 192.168.0.0/16 in via ${ADSL}
${ipfw} add 1023 deny ip from any to 0.0.0.0/8 in via ${ADSL}
#рубим автоконфигуреную частную сеть
${ipfw} add 1024 deny ip from any to 169.254.0.0/16 in via ${ADSL}
#рубаем мультикастовые рассылки
${ipfw} add 1025 deny ip from any to 240.0.0.0/4 in via ${ADSL}
#рубим фрагментированные icmp
${ipfw} add 1026 deny icmp from any to any frag
#рубим широковещательные icmp на внешнем интерфейсе
${ipfw} add 1027 deny log icmp from any to 255.255.255.255 in via ${ADSL}
${ipfw} add 1028 deny log icmp from any to 255.255.255.255 out via ${ADSL}
#####End_2.
#####Прозрачные прокси
#3.Для http-трафика
${ipfw} add 1032 fwd $proxy,3128 tcp from ${NetLAN}/${NetMask} to me dst-port 3128
${ipfw} add 1033 fwd $proxy,3128 tcp from ${NetLAN}/${NetMask} to any http via ${ADSL}
###End_3.
${ipfw} add 1041 allow all from me to any via ${In}
${ipfw} add 1042 allow all from any to me via ${In}
##4.Теперь включаем NAT — эта штука преобразовует локальные адреса в инет и назад (короче, раздает инет по всем портам)
${ipfw} add 1101 divert natd ip from ${NetLAN}/${NetMask} to any out via ${ADSL}
${ipfw} add 1102 divert natd ip from any to me in via ${ADSL}
${ipfw} add 1105 allow ip from any to any via lo0
${ipfw} add 1106 deny ip from any to 127.0.0.0/8
${ipfw} add 1107 deny ip from 127.0.0.0/8 to any
${ipfw} add 1108 allow all from me to any via ${ADSL}
${ipfw} add 1109 allow all from any to me via ${ADSL}
#5.рубим траффик к частным сетям через внешний интерфейс
${ipfw} add 1111 deny ip from 10.0.0.0/8 to any out via ${In}
${ipfw} add 1112 deny ip from 172.16.0.0/12 to any out via ${In}
${ipfw} add 1113 deny ip from 192.168.0.0/16 to any out via ${In}
${ipfw} add 1114 deny ip from 0.0.0.0/8 to any out via ${In}
#рубим автоконфигуреную частную сеть
${ipfw} add 1115 deny ip from 169.254.0.0/16 to any out via ${In}
#рубаем мультикастовые рассылки
${ipfw} add 1116 deny ip from 224.0.0.0/4 to any out via ${In}
#рубаем мультикастовые рассылки
${ipfw} add 1117 deny ip from 240.0.0.0/4 to any out via ${In}
#рубим траффик к частным сетям через внешний интерфейс
${ipfw} add 1121 deny ip from 10.0.0.0/8 to any out via ${ADSL}
${ipfw} add 1122 deny ip from 172.16.0.0/12 to any out via ${ADSL}
${ipfw} add 1123 deny ip from 192.168.0.0/16 to any out via ${ADSL}
${ipfw} add 1124 deny ip from 0.0.0.0/8 to any out via ${ADSL}
#рубим автоконфигуреную частную сеть
${ipfw} add 1125 deny ip from 169.254.0.0/16 to any out via ${ADSL}
#рубаем мультикастовые рассылки
${ipfw} add 1126 deny ip from 224.0.0.0/4 to any out via ${ADSL}
#рубаем мультикастовые рассылки
${ipfw} add 1127 deny ip from 240.0.0.0/4 to any out via ${ADSL}
#########End_5.
##Разрешаем то что уже проходит через сервер
#${ipfw} add 1131 allow tcp from any to any established
##Разрешаем серверу в инет 🙂
${ipfw} add 1132 allow ip from me to any out xmit ${ADSL}
#####Здесь можно прописать непосредственно порты которые нам нужны, или все сразу
#${ipfw} add 1133 allow udp from any 53 to any via ${ADSL}
#${ipfw} add 1134 allow udp from any to any 53 via ${ADSL}
#${ipfw} add 1135 allow udp from any to any 123 via ${ADSL}
#${ipfw} add 1136 allow tcp from any to me 20,21 via ${ADSL}
#${ipfw} add 1137 allow tcp from any to me 49152-65535 via ${ADSL}
#${ipfw} add 1138 allow icmp from ${NetLAN}/${NetMask} to me icmptypes 0,8,11
#${ipfw} add 1139 allow icmp from ${NetLAN}/${NetMask} to me icmptypes 0,8,11 via ${Lan}
#${ipfw} add 1138 allow icmp from any to any icmptypes 0,8,11 via ${ADSL}
##########End
###Разрешаем серверу отвечать в сетку (LAN)
#${ipfw} add 1134 allow ip from any to ${NetLAN}/${NetMask} via ${Lan}
#${ipfw} add 1136 allow ip from any to ${NetLAN}/${NetMask} via ${ADSL}
#${ipfw} add 1136 allow ip from ${NetLAN}/${NetMask} to any via ${ADSL}
##Разрешаем отвечать на пинги серверу из локалки
${ipfw} add 1142 allow icmp from me to ${NetLAN}/${NetMask} icmptypes 0,8,11 via ${Lan}
#Разрешаем из мира ходить на порты сервера
${ipfw} add 1143 allow tcp from any to me 80 via ${ADSL}
${ipfw} add 1144 allow tcp from any to me 22 via ${ADSL}
${ipfw} add 1145 allow tcp from any to me 25 via ${ADSL}
${ipfw} add 1146 allow tcp from any to me 143 via ${ADSL}
${ipfw} add 1147 allow tcp from any to me 110 via ${ADSL}
###Разрешаем серверу ходить через этот интерфейс (ADSL) на остальн╕е порты
#${ipfw} add 1148 allow ip from me to any via ${ADSL}
#${ipfw} add 1149 allow ip from any to me via ${ADSL}
###Разрешаем на внутреннем интерфейсе
##6.Всем
#${ipfw} add 1151 allow ip from any to any via ${Lan}
###End_6.
###7.Доступ конкретному пользователю
#${ipfw} add 2001 allow ip from ${user_prefix}.2 to any via ${Lan}
#${ipfw} add 2002 allow ip from ${user_prefix}.2 to any via ${ADSL}
#${ipfw} add 2002 allow ip from any to ${user_prefix}.2
#####Режем скорость юзерам
###Даем юзерам инет и режем им скорость
##Dlya_dobavleniya_novogo_clienta-copiruem_5strochek_i_delaem_na_ih_osnovanii_novye_pravila
##Komp_osnovnoy
${ipfw} pipe 11 config bw 256Kbit/s queue 64kbit/s #ot usera dlya tor
${ipfw} pipe 12 config bw 2Mbit/s queue 64kbit/s #kanal s ineta useru
${ipfw} add 2201 pipe 11 all from ${user_prefix}.2 to any src-port 1000-999999 limit src-addr 16 not dst-port ${NoFWDport} not dst-ip me
${ipfw} add 2202 pipe 12 all from any to ${user_prefix}.2 not src-ip me
${ipfw} add 2203 allow ip from ${user_prefix}.2 to any via ${Lan}
##NOut_MOY
${ipfw} pipe 13 config bw 256Kbit/s queue 64kbit/s #ot usera dlya tor
${ipfw} pipe 14 config bw 1Mbit/s queue 64kbit/s #kanal s ineta useru
####Vkonce_stroki_dobavlyat_porty_neobhodimye_kotorye_rezat_ne_nuzhno_posle_dst-port
${ipfw} add 2204 pipe 13 all from ${user_prefix}.3 to any src-port 1000-999999 limit src-addr 16 not dst-port ${NoFWDport} not dst-ip me
${ipfw} add 2205 pipe 14 all from any to ${user_prefix}.3 not src-ip me
${ipfw} add 2206 allow ip from ${user_prefix}.3 to any via ${Lan}
###Nout_papik
${ipfw} pipe 15 config bw 256Kbit/s queue 64kbit/s #ot usera dlya tor
${ipfw} pipe 16 config bw 1Mbit/s queue 64kbit/s #kanal s ineta useru
${ipfw} add 2207 pipe 15 all from ${user_prefix}.4 to any src-port 1000-999999 limit src-addr 16 not dst-port ${NoFWDport} not dst-ip me
${ipfw} add 2208 pipe 16 all from any to ${user_prefix}.4 not src-ip me
${ipfw} add 2209 allow ip from ${user_prefix}.4 to any via ${Lan}
#####Новые клиенты, по анологии
#End_7.
###End_4.
#${ipfw} add 4997 allow ip from ${NetLAN}/${NetMask} to any via ${Lan} #otkryt’ vsem
${ipfw} add 4998 allow tcp from any to any established
${ipfw} add 4999 deny ip from any to any

Теперь я попытаюсь описать как можно делить канал, то что было применено выше.

/sbin/ipfw pipe 1 config bw 1000Kbit/s
/sbin/ipfw queue 1 config pipe 1 weight 50 mask dst-ip 0x00000000
/sbin/ipfw add queue 1 ip from any to 192.168.0.0/24

Это правило справедливо разделит пропускную способность в 1 мегабит между всеми пользователями сети, т.к. очереди равноприоритетны (пакеты будут выходить из пользовательских очередей «по очереди»)

А вот пример, как сделать очередь приоритетов (то есть, одни выше, другие ниже):

/sbin/ipfw pipe 1 config bw 1000Kbit/s
/sbin/ipfw queue 1 config pipe 1 weight 50 mask dst-ip 0x00000000
/sbin/ipfw queue 2 config pipe 2 weight 75 mask dst-ip 0x00000000
/sbin/ipfw add queue 1 ip from any to 192.168.0.1/25
/sbin/ipfw add queue 2 ip from any to 192.168.0.128/25

Это правило даст некоторый приоритет в использовании канала пользователям с адресами, большими 192.168.0.128 (VIP-группа).
В данном примере получится так:
Если VIP-группе в данный момент канал не нужен, то обычные пользователи (ниже 192.168.0.128) делят между собой пропускную способность поровну, но если VIP-абоненту понадобились услуги — простые пользователи автоматически подвигаются на задний план.
Также, можно сделать очередь определенных портов. Например для sip, skype, game-servers и др.

ПРИМЕРЫ ИЗ ЖИЗНИ:

ipfw add allow tcp from 192.168.0.0/24 to any via fxp1 setup limit src-addr 10
ipfw add allow tcp from any to me limit src-addr 4
Данное правило ограничивает число соединений, которое может быть открыто пользователем.
_________________________________
ipfw add pipe 101 ip from any to 192.168.168.0:255.255.255.246 via ed0
ipfw pipe config 101 delay 100ms plr 0.65
Это правило может быть полезно для «проштрафившихся» пользователей, например, которые не оплачивают работу долгое время. Работать-то можно, но теряется большая часть пакетов (65%) и задержка оставшихся составляет 100 мс, следовательно, страницы будут открываться очень при очень медленно.
_________________________________
ipfw add pipe 1025 tcp from me to any 25 out via fxp0
ipfw pipe 1025 config bw 128Kbit/s delay 120ms
В данном примере скорость ограничивается значением 128Кбит/с, но при этом задержка каждого пакета составляет 120 мс.
_________________________________
ipfw add pipe 23 ip from any to 192.168.0.87 out
ipfw add pipe 24 ip from 192.168.0.87 to any in
ipfw pipe 23 config 57600bit/s
ipfw pipe 24 config 33600bit/s
Эмуляция полнодуплексного канала, более похожая на работу по протоколу V.90. Здесь трафик имеет асимметричных характер: относительно пользователя 192.168.0.87 трафик имеет асимметричный характер — скорость входящего трафика 57600 бит/с, а скорость исходящего трафика — 33600 бит/с.
_________________________________
ipfw add prob 0.33 pipe 1 ip from A to B
ipfw add prob 0.5 pipe 2 ip from A to B
ipfw add pipe 3 ip from A to B
ipfw pipe 1 config …
ipfw pipe 2 comfig …
ipfw pipe 3 config …
Одной из положительных особенностей новой версии dummynet является способность имитировать множество путей между отправителем и получателем. Это делается с использованием вероятностей величины prob. При условии, что пакет является правильным (т. е. он циркулирует от хоста А к хосту В), первое правило будет выполняться с вероятностью 1/3; в оставшихся 2/3 случаях будет происходить переход ко 2-му правилу, которое будет выполняться с вероятностью 1/2 (0.5) (так что 1/2*2/3=1/3); в оставшихся 1/3 случаев будет происходить переход к третьему правилу, которое имеет вероятность 1. Мы можем конфигурировать эти 3 канала по желанию, чтобы эмулировать, например, такие явления, как повторный запрос пакета и т. д.
_________________________________
ipfw add queue 16 tcp from any to 192.168.0.110 out via ed0
ipfw add queue 17 tcp from 192.168.0.110 to any in via ed0
ipfw queue 16 config weight 10 pipe 160
ipfw queue 17 config weight 7 pipe 160
ipfw pipe 160 config bw 128Kbit/s
Это более сложный пример, когда трафик, направляемый компьютеру с адресом 192.168.0.110 имеет более высокий приоритет, чем получаемый от него. Это может иметь смысл, чтобы, например, отправляемая почта больших размеров не мешала ходить по сайтам.
_________________________________
ipfw add queue 10 tcp from any 20,21 to any 1024-65535 in via fxp0
ipfw add queue 20 tcp from any 1024-65535 to any 20,21 out via fxp0
ipfw add queue 10 tcp from any 1024-65535 to any 1024-65535 in via fxp0
ipfw add queue 10 tcp from any 1024-65535 to any 1024-65535 out via fxp0
ipfw queue 10 config weight 1 pipe 10
ipfw queue 20 config weight 1 pipe 20
ssh

ipfw add queue 50 tcp from any 22 to any 1024-65535 in via fxp0
ipfw add queue 60 tcp from any 1024-65535 to any 22 out via fxp0
ipfw queue 50 config pipe 10 weight 100
ipfw queue 60 config pipe 20 weight 100
pipes

ipfw add pipe 10 tcp from any to any in via fxp0
ipfw pipe 10 config
ipfw add pipe 20 tcp from any to any out via fxp0
ipfw pipe 20 config
all traffic (весь остальной трафик).

ipfw add check-state
ipfw deny tcp from any to any established
ipfw allow tcp from 192.168.0.0/24 to any setup keep-state
Это пример динамического правила.

Напоминаю всем копирующим мой контент о существовании закона "Об авторском праве".
В связи с этим, прошу во избежании конфликтов при копировании данного материала, ставить на него ссылку:

http://noted.org.ua/?p=109


Также, вы можете отблагодарить меня переслав любую сумму на любой кошелек WebMoney, для поддержания данного ресурса. Или просто админу на пиво ;)

Кошельки для получения благодарности:
R386985788805
U234140473141
Z147712360455

На данной странице нет комментариев, возможно они закрыты. Если Вы хотите оставить свой комментарий, перейдите на специально созданный раздел

Add your comment now

You must be logged in to post a comment.