Привет всем. Решил перейти с ipfw на pf(packet filter). Вот немогу никак разобраться с скоростьюВот схема сети
(inet)---(freebsd 192.168.100.1)---(linux 192.168.100.2, 192.168.0.1)---(users 192.168.0.0)
в линухе все прозрачно в фаерволе все разрешено
Версия FreeBSD 7.1-Release
Проблема заключается в том что исходящий трафик нормально в очередь становится и забивается под пропускную способность, которую я указал, но вот вхоящий вообще мимо очереди проходит.
Вот мой конфиг pf
#-------------------------
# Variables and Macros
#-------------------------# interfaces
inet_if = "tun0"
ext_if = "em0"
int_if = "xl0"#-------------------------
# ip addresses
#-------------------------extnet = "{ 10.0.0.0/8, 192.168.252.0/24 }"
lannet = "{ 192.168.0.0/24, 192.168.2.0/24, 192.168.100.0/24 }"
ext_ip = "xxx"
lhc = "192.168.100.1"
server = "192.168.0.1"
igmp_net = "224.0.0.0/4"
private_nets = "{ 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 }"
table <uaix> persist file "/etc/pf/prefixes.txt"#-------------------------
# Ports
#-------------------------sshlhc = "54390"
sshserver = "54391"
server_ports = "{ http, " $sshlhc $sshserver ", rdp, smtp, pop3, ftp, ftp-data, domain }"#-------------------------
# Options
#-------------------------# Default policy
set block-policy drop
# Type of optimization
set optimization normal
# State-policy
set state-policy floating
# skip pf on lo0 interface
set skip on lo0
# Normaliztion for all interfaces
scrub in all
set ruleset-optimization basic#-------------------------
# Queue & Speed Control
#-------------------------# altqs
altq on $int_if cbq bandwidth 1000Mb queue { def_download }
altq on $inet_if cbq bandwidth 1000Mb queue { def_upload }queue def_download on $int_if bandwidth 100% cbq(default) { 192.168.0.10_ii, 192.168.0.10_ui }
queue def_upload on $inet_if bandwidth 100% cbq(default) { 192.168.0.10_io, 192.168.0.10_uo }
# users1 queues
# users2 queues
queue 192.168.0.10_ii bandwidth 512Kb cbq(ecn)
queue 192.168.0.10_io bandwidth 256Kb cbq(ecn)
queue 192.168.0.10_ui bandwidth 5120Kb cbq(ecn)
queue 192.168.0.10_uo bandwidth 512Kb cbq(ecn)#--------------------------
# NAT & Redirect
#--------------------------# Nat from local net to inet
nat on $inet_if from $lannet to any -> $ext_ip
# Nat from local net to ext_net
nat on $ext_if from $lannet to $extnet -> ($ext_if)
# Redirect ports
# to server ssh
rdr on $inet_if proto tcp from any to $ext_ip port 54391 -> $server port 22
# to igor
rdr on $inet_if proto tcp from any to $ext_ip port rdp -> 192.168.0.8 port 3389
# to virtual terminal
#rdr on $inet_if proto tcp from any to $ext_ip port 3390 -> 192.168.0.17 port 3389#--------------------------
# Filter Rules
#--------------------------
block all
#--------------------------
# Out Connections
#--------------------------
pass out from (self) to any
#--------------------------
# Inet to Users
#--------------------------# users1 filters
# users2 filters
pass out on $inet_if from any to 192.168.0.10 queue 192.168.0.10_ii
pass in on $int_if from 192.168.0.10 to any queue 192.168.0.10_io
# unlim users filters
когда я комментирую строчку pass out on $inet_if from any to 192.168.0.10 queue 192.168.0.10_ii , то интернет у пользователя всеравно есть.
Я заметил на то что pass out from (self) to any это правило влияет.Вот непонятно почему пакет не проходит по pass out on $inet_if from any to 192.168.0.10 queue 192.168.0.10_ii этому правилу?? как сделать чтобы он прошел по нему?
Я уже измучался. Заранее благодарю
У вас на инетовский интерфейс(на котором все натится) весь трафик приходит для адреса 192.168.100.1 и уходит с него же. Стоит это учитывать. Это ответ на Ваш вопрос про то как влияет правило pass out from (self) to any:)
Вторым моментом является то, что если внимательно почитать библии и маны про шейпинг, то будет ясно, что шейпить есть смысл только исходящий трафик. Или я неправльно догадался о том, какой интерфейс у Вас за что отвечает(на схеме не указали), либо Вы пытаетесь шейпить входящий трафик....
Что нибудь типа вот такого попробуйте
pass out on $inet_if from 192.168.0.10 to any queue 192.168.0.10_uo
pass out on $int_if from any to 192.168.0.10 queue 192.168.0.10_ui
Первое правило загоняет в очередь 512К исходящие пакеты на инетовском интерфейсе(исходящий трафик юзера), второе исходящие пакеты на локальную сеть(входящий трафик для юзера). Хотя и без второго правила все будет шейпится...Не поможет - пишите будеи разбираться дальше.
>[оверквотинг удален]
>трафик. Или я неправльно догадался о том, какой интерфейс у Вас
>за что отвечает(на схеме не указали), либо Вы пытаетесь шейпить входящий
>трафик....
>Что нибудь типа вот такого попробуйте
>pass out on $inet_if from 192.168.0.10 to any queue 192.168.0.10_uo
>pass out on $int_if from any to 192.168.0.10 queue 192.168.0.10_ui
>Первое правило загоняет в очередь 512К исходящие пакеты на инетовском интерфейсе(исходящий трафик
>юзера), второе исходящие пакеты на локальную сеть(входящий трафик для юзера). Хотя
>и без второго правила все будет шейпится...Не поможет - пишите будеи
>разбираться дальше.Спасибо за ответ. Про то что шейпить имеет смысл только исходящий трафик я в курсе давно, только немного непонимаю как точно делать это в PF. по поводу какой интерфей за что отвечает вот:
ifconfig -a
em0: flags=8a43<UP,BROADCAST,RUNNING,ALLMULTI,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
ether 00:0c:64:77:8a:56
inet 10.8.170.22 netmask 0xffffff00 broadcast 10.8.170.255
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
xl0: flags=8a43<UP,BROADCAST,RUNNING,ALLMULTI,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=9<RXCSUM,VLAN_MTU>
ether 00:04:75:dа:00:cf
inet 192.168.100.1 netmask 0xffffff00 broadcast 192.168.100.255
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x5
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
tun0: flags=8251<UP,POINTOPOINT,RUNNING,ALLMULTI,MULTICAST> metric 0 mtu 1492
inet xxxx --> yyyy netmask 0xffffffff
Opened by PID 450инет подключается через em0 и организует тунель через pppoe посредством которого создается интерфейс tun0 который нужен для подключения к инету.
Я думаю достаточно ясно картину обрисовал?:) если нет то поправьте:)
завтра проверю Ваши правила.Но все-таки непонятно, отличие от ipfw вот например в ipfw необходимо указать 2 правила чтобы пакет прошел...а тут получается одного хватает?:
pass in on $int_if from 192.168.0.10 to any queue 192.168.0.10_io
И еще вопрос - чего Вы указали очереди с окончанием 192.168.0.10_uo и 192.168.0.10_ui?они же закомментины? или это техническая ошибка?)
Еслиб Вы начали пользоваться pf с более ранних версий бсды, то наверняка встретились бы с ситуацией, что нужно прописывать правила вот так:pass out on $inet_if from 192.168.0.10 to any queue 192.168.0.10_io keep state
keep state в данном случае означает то, что фаерволл автоматом пропустит "обратные" пакеты. Если Вам надо пропустить только пакеты наружу, то
pass out on $inet_if from 192.168.0.10 to any queue 192.168.0.10_io no state
А начиная с 7 бсды keep state - это правило,применяемое к пакетам по-умолчанию, если даже оно явно не указано.
Вот и получается, что одно правило заменяет два.Почему я именно взял эти две очереди? Потому, что я расшифровал uo - user out, ui - user in:))) так что можно назвать это ошибкой телепата-неудачника:))))
>[оверквотинг удален]
>pass out on $inet_if from 192.168.0.10 to any queue 192.168.0.10_io no state
>
>
>А начиная с 7 бсды keep state - это правило,применяемое к пакетам
>по-умолчанию, если даже оно явно не указано.
>Вот и получается, что одно правило заменяет два.
>
>Почему я именно взял эти две очереди? Потому, что я расшифровал uo
>- user out, ui - user in:))) так что можно назвать
>это ошибкой телепата-неудачника:))))Извиняюсь за долгий ответ, отдыхал просто:) Возвращаемся к нашим баранам
pass out on $inet_if from 192.168.0.10 to any queue 192.168.0.10_io
pass out on $int_if from any to 192.168.0.10 queue 192.168.0.10_iiпоставил как вы и сказали, пробовал - но нефига:( даже пробовал с no state параметром.
Более прикольно то - что в этом случае вообще никакое ограничение не действует, даже на исходящий трафик:(Куда еще можно порыть?
Может ли ктото скинуть работающий конфиг с ограничением скорости пожалуйста
>Вторым моментом является то, что если внимательно почитать библии и маны про
>шейпинг, то будет ясно, что шейпить есть смысл только исходящий
>трафик.зачем злой провайдер вопреки всем библиям и прочим манам шейпит мой upload? ведь для него это download!