Jump to content
Калькуляторы

IPFW + natd + pipes Проблема ограничения кол-ва сессий

Перерыл весь инет, проделал много экспериментов. Так ничего толком не получилось.

Работа сервера устраивает, но появились торенщики и теперь канал забивается нечего делать. Как каждому IP урезать кол-во сессий до 10?

 

srv1# uname -v
FreeBSD 7.1-RELEASE #2: Sat Feb 21 19:01:45 EET 2009     root@srv1.:/usr/src/sys/i386/compile/GENERIC

 

IPFW привила такие:

ipfw -q -f flush
ipfw -q -f pipe flush
ipfw -q -f queue flush

cmd="ipfw -q add"
DirMask="0xffffffff"
ifout="age0"
ifuser="vr0"
net="192.168.0.0/24"
IPout="192.168.1.5"
ks="keep-state"

# ------- 256K ---------
ipfw table 1 flush
. "/usr/local/my/IPFW/ipfw_table1.sh"

# ------- 512K ---------
ipfw table 2 flush
. "/usr/local/my/IPFW/ipfw_table2.sh"

# ------- 1024K --------
ipfw table 3 flush
. "/usr/local/my/IPFW/ipfw_table3.sh"

# -------- Traff -------
ipfw table 4 flush
. "/usr/local/my/IPFW/ipfw_table4.sh"

# -------- VIP ---------
ipfw table 5 flush
#include `/usr/local/my/IPFW/ipfw_table5.sh`
. "/usr/local/my/IPFW/ipfw_table5.sh"

#========================================================
#================  RULES ITSELF =========================
#========================================================
natd -f /etc/natd.conf -n age0

$cmd check-state

$cmd deny ip from any to any 3128 via vr0

# Deny lo0
$cmd allow ip from any to any via lo0
$cmd deny ip from any to 127.0.0.0/8
$cmd deny log ip from 127.0.0.0/8 to any

# ssh
$cmd allow ip from 192.168.0.0/24 to me 22 via vr0
$cmd deny log ip from any to me 22 via age0

# ---  Defend from ---
# XMAS tree
$cmd deny log tcp from any to any in tcpflags fin,psh,urg recv $ifout
# NULL scan (no flag set at all)
$cmd deny log tcp from any to any in tcpflags !fin,!syn,!rst,!psh,!ack,!urg recv $ifout
# SYN flood (SYN,FIN)
$cmd deny log tcp from any to any in tcpflags syn,fin recv $ifout
# STEALTH FIN scan (FIN,RST)
$cmd deny log tcp from any to any in tcpflags fin,rst recv $ifout
# Forced packet routing
$cmd deny log ip from any to any in ipoptions ssrr,lsrr,rr,ts recv $ifout
$cmd pass all from me to any via $ifout

# Inbound - packets from Internet [in via $ifout] ---
$cmd deny all from 192.168.0.0/16 to any in via $ifout
$cmd deny all from 172.16.0.0/12 to any in via $ifout
$cmd deny all from 10.0.0.0/8 to any in via $ifout
$cmd deny all from 127.0.0.0/8 to any in via $ifout
$cmd deny all from 0.0.0.0/8 to any in via $ifout
$cmd deny all from 169.254.0.0/16 to any in via $ifout
$cmd deny all from 192.0.2.0/24 to any in via $ifout
$cmd deny all from 204.152.64.0/23 to any in via $ifout
$cmd deny all from 224.0.0.0/3 to any in via $ifout
$cmd deny ip from any to 240.0.0.0/4 in via $ifout
$cmd deny log icmp from any to 255.255.255.255 in via $ifout
# Deny public pings
#$cmd deny log icmp from any to any in via $ifout
# Deny ident
$cmd deny tcp from any to any 113 in via $ifout
# Deny all netbios services [137=name; 138=datagram; 139=session]
$cmd deny tcp from any to any 137 in via $ifout
$cmd deny tcp from any to any 138 in via $ifout
$cmd deny tcp from any to any 139 in via $ifout
$cmd deny tcp from any to any 81 in via $ifout
# Deny any late arriving packets
$cmd deny all from any to any frag in via $ifout
# Deny ACK packets that did not match the dynamic rule table
#$cmd deny tcp from any to any established in via $ifout

# Outbound - packets to Internet [out via $ifout]---
$cmd deny log icmp from any to 255.255.255.255 out via $ifout

$cmd allow ip from "table(1)" to any via $ifuser
$cmd allow ip from any to "table(1)" via ${ifuser}

$cmd allow ip from "table(2)" to any via ${ifuser}
$cmd allow ip from any to "table(2)" via ${ifuser}

$cmd allow ip from "table(3)" to any via ${ifuser}
$cmd allow ip from any to "table(3)" via ${ifuser}

$cmd allow ip from "table(4)" to any via ${ifuser}
$cmd allow ip from any to "table(4)" via ${ifuser}

$cmd allow ip from "table(5)" to any via ${ifuser}
$cmd allow ip from any to "table(5)" via ${ifuser}

$cmd deny log ip from any to any via ${ifuser}

#COUNTERS
$cmd 5000 count all from any to any via age0
$cmd 5001 count all from 192.168.0.0/24 to any out via age0

#USER IP OUT from 5100 and so on
. "/usr/local/my/IPFW/ipfw_count_out"

#DNS
$cmd allow udp from any 53 to any via $ifout
$cmd allow udp from any to any 53 via $ifout


# --------------------- PIPES FROM User -----------------------
# --- 256 Kbit/128 Kbit -----------
$cmd pipe 2 ip from "table(1)" to any out via age0
ipfw pipe 2 config bw 32KByte/s mask src-ip ${DirMask}
# --- 512 Kbit/256 Kbit -----------
$cmd pipe 4 ip from "table(2)" to any out via age0
ipfw pipe 4 config bw 32KByte/s queue 40 mask src-ip ${DirMask}
# --- 1 Mbit/512 Kbit --------------
$cmd pipe 6 ip from "table(3)" to any out via age0
ipfw pipe 6 config bw 64KByte/s queue 20 mask src-ip ${DirMask}
# --- 512 Mbit/256 Kbit traf -------
$cmd pipe 8 ip from "table(4)" to any out via age0
ipfw pipe 8 config bw 64KByte/s queue 40 mask src-ip ${DirMask}
#--- FREE -------
$cmd pipe 9 ip from "table(5)" to any out via age0 setup limit src-addr 10
ipfw pipe 9 config bw 64KByte/s mask src-ip ${DirMask}

# NAT
$cmd divert natd all from ${net} to any via ${ifout}
$cmd divert natd all from any to ${IPout} via ${ifout}

$cmd allow icmp from any to any via age0 $ks
$cmd 9000 count all from any to 192.168.0.0/24 in via age0

#USER IP IN from 9100 and so on
. "/usr/local/my/IPFW/ipfw_count_in"

# --------------------- PIPES TO User -----------------------
# --- 256 Kbit/128 Kbit -----------
$cmd pipe 1 ip from any to "table(1)" in via age0
ipfw pipe 1 config bw 34KByte/s mask dst-ip ${DirMask}
# was 40K
# --- 512 Kbit/256 Kbit -----------
$cmd pipe 3 ip from any to "table(2)" in via age0
ipfw pipe 3 config bw 64KByte/s queue 40 mask dst-ip ${DirMask}
# --- 1 Mbit/512 Kbit -------------
$cmd pipe 5 ip from any to "table(3)" in via age0
ipfw pipe 5 config bw 120KByte/s queue 20 mask dst-ip ${DirMask}
# --- 512 Mbit/256 Kbit traf ------
$cmd pipe 7 ip from any to "table(4)" in via age0
ipfw pipe 7 config bw 120KByte/s queue 40 mask dst-ip ${DirMask}
#--- FREE -------
$cmd pipe 10 ip from any to "table(5)" in via age0
ipfw pipe 10 config bw 64KByte/s mask dst-ip ${DirMask}

 

Так вот если пукаю пользователей по 5 таблице, то режет нормально по 10 сессий каждому. Но проблема в том что где-то после 3 человек начинается затык полный. Причем

ipfw -d show

Показывает что у каждого по 10 сессий

В чем может быть проблема?

 

PS. В FreeBSD новичек, просьба помочь. Заранее огромное спасибо.

Share this post


Link to post
Share on other sites

"Затык" означает выше сказаннное: для эксперимента запускаю несколько юзеров по 5 таблице, потом через время пытаюсь зайти сам с 2 компьютеров в инет через 5 таблицу. В результате ничего не открывается. Хотя если сразу начать качать, то инет есть и резет по 10 сессий. К сожалению сильно не поиграешься ибо сервак рабочий а другого пока нет для экспериментов...

 

Share this post


Link to post
Share on other sites
$cmd divert natd all from ${net} to any via ${ifout}

$cmd divert natd all from any to ${IPout} via ${ifout}

 

запускаю несколько юзеров по 5 таблице, потом через время пытаюсь зайти сам с 2 компьютеров в инет через 5 таблицу. В результате ничего не открывается.

natd и небольшой размер хэша для динамических пайпов вполне могут быть причиной "затыка". Нужно делать NAT средствами ядра (libalias или pf), и увеличить net.inet.ip.dummynet.hash_size как минимум до количества юзеров, обслуживаемых данной машиной, хотя его можно и сразу в 16384 поставить, больше все равно не будет.
Edited by photon

Share this post


Link to post
Share on other sites

net.inet.ip.dummynet.hash_size увеличил до мах (16384)

 

## Dynamic rules (12):
06200  38972 1870656 (300s) LIMIT tcp 192.168.0.187 3955 <-> 195.42.128.164 38510
06200  32961 1582128 (300s) LIMIT tcp 192.168.0.187 3947 <-> 213.112.21.186 80
06200  47592 2284416 (300s) LIMIT tcp 192.168.0.187 3968 <-> 93.136.102.34 80
06200  68092 3268416 (300s) LIMIT tcp 192.168.0.187 3945 <-> 79.112.12.210 80
06200  70460 3382080 (300s) LIMIT tcp 192.168.0.187 3950 <-> 81.19.70.1 80
06200  32817 1575216 (300s) LIMIT tcp 192.168.0.187 3970 <-> 140.115.220.240 48451
06200  69472 3334656 (300s) LIMIT tcp 192.168.0.187 3943 <-> 84.208.112.41 80
06200  84313 3792128 (300s) LIMIT tcp 192.168.0.187 3951 <-> 91.203.99.45 80
06200  35712 1714176 (300s) LIMIT tcp 192.168.0.187 3962 <-> 79.116.107.41 80
06200      0       0 (4s) PARENT 10 tcp 192.168.0.187 0 <-> 0.0.0.0 0
06200  36085 1732080 (300s) LIMIT tcp 192.168.0.187 3944 <-> 213.112.21.186 443

 

Тут часом дело не в keep-state? Может нужно как-то использовать skipto. Вот только не хватает думалки 8))

Edited by JohnK

Share this post


Link to post
Share on other sites

Может все дело в

$cmd pipe 10 ip from "table(5)" to any out via age0 setup limit src-addr 50
ipfw pipe 10 config bw 32KByte/s [b]queue 40[/b] mask src-ip ${DirMask}

 

То есть в кол-ве очередей? Очереди и сессии как-то связаны?

Edited by JohnK

Share this post


Link to post
Share on other sites

Наблюдая за активностью пайпов и очередей наткнулся на такую вещь:

00010: 256.000 Kbit/s    0 ms   40 sl. 236 queues (16384 buckets) droptail
    mask: 0x00 0xffffffff/0x0000 -> 0x00000000/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
46 ip    93.186.238.202/0             0.0.0.0/0        5     2248  0    0   0
130 ip      192.168.0.21/0             0.0.0.0/0     1534   161000  0    0   0
132 ip     62.146.191.11/0             0.0.0.0/0       15     7431  0    0   0
134 ip    93.186.238.158/0             0.0.0.0/0        5     2322  0    0   0
148 ip      192.168.0.30/0             0.0.0.0/0     4900   817858  0    0   0
174 ip       192.168.0.3/0             0.0.0.0/0     27898  2028058  0    0   0
218 ip    93.186.238.176/0             0.0.0.0/0        6     2877  0    0   0
232 ip    93.186.238.169/0             0.0.0.0/0        6     3160  0    0   0
234 ip      192.168.0.33/0             0.0.0.0/0     8813   752598  0    0   0
238 ip    93.186.238.170/0             0.0.0.0/0        8     2355  0    0   0

После того как поменял кол-во макс корзин для dummynet (net.inet.ip.dummynet.hash_size=16384) помогло!.

Но теперь растет постоянно кол-во очередей (см. выше 236 queues (16384 buckets)

Боюсь в пиковую нагрузку и через некоторое время может превысить или я ошибаюсь?

 

Полет нормальный, затыков нет.

Через 10 мин кол-во очередей :

00010: 256.000 Kbit/s    0 ms   40 sl. 341 queues (16384 buckets) droptail
    mask: 0x00 0xffffffff/0x0000 -> 0x00000000/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
42 ip    93.186.238.200/0             0.0.0.0/0        5     2026  0    0   0
46 ip    93.186.238.202/0             0.0.0.0/0        5     2248  0    0   0
130 ip      192.168.0.21/0             0.0.0.0/0     2099   226230  0    0   0
132 ip     62.146.191.11/0             0.0.0.0/0       15     7431  0    0   0
134 ip    93.186.238.158/0             0.0.0.0/0        5     2322  0    0   0

 

Почему непрерывно растет? Получается что старые очереди не закрываются\сбрасываются? Или я зря паникую?

 

Гм... Судя по всему я сам с собой разговариваю..

Ну да ладно, может сам и разберусь (мысли в лух) ))

 

Так вот что я нашел. Получается что забиваються все 16 (уже поменял кол-во сессийи с одного IP до 16) соединений и все и не сбрасываются. Даже закрывал браузер чтобы разорвать соединения. Поэтому и происходит "затык".

Внимание вопрос: Где прикол?

 

05900      0        0 (0s) PARENT 16 tcp 192.168.0.187 0 <-> 0.0.0.0 0
05900 175059  8402832 (20s) LIMIT tcp 192.168.0.63 1117 <-> 89.108.120.157 2106
05900  15682   752736 (20s) LIMIT tcp 192.168.0.9 1042 <-> 87.201.164.101 443
05900 246224 11818752 (20s) LIMIT tcp 192.168.0.63 1118 <-> 89.108.120.157 2106
05900  30679  1472592 (20s) LIMIT tcp 192.168.0.187 2095 <-> 81.222.128.13 80
05900  20668   992064 (20s) LIMIT tcp 192.168.0.9 1038 <-> 204.9.163.158 80
05900  10188   489024 (20s) LIMIT tcp 192.168.0.9 1049 <-> 67.86.159.96 443
05900  19542   938016 (20s) LIMIT tcp 192.168.0.187 2104 <-> 81.19.70.7 80
05900   9797   470256 (20s) LIMIT tcp 192.168.0.187 2105 <-> 81.19.70.7 80
05900  15865   761520 (20s) LIMIT tcp 192.168.0.9 1041 <-> 87.201.164.101 13736
05900   9797   470256 (20s) LIMIT tcp 192.168.0.187 2106 <-> 81.19.70.7 80
05900   9797   470256 (20s) LIMIT tcp 192.168.0.187 2107 <-> 81.19.70.7 80
05900  41206  1977888 (20s) LIMIT tcp 192.168.0.51 2745 <-> 77.121.0.251 22441
05900  30595  1468560 (20s) LIMIT tcp 192.168.0.187 2100 <-> 81.19.70.7 80
05900  30595  1468560 (20s) LIMIT tcp 192.168.0.187 2099 <-> 81.19.70.7 80
05900  48963  2350224 (20s) LIMIT tcp 192.168.0.71 1132 <-> 94.100.179.152 80
05900  15477   742896 (20s) LIMIT tcp 192.168.0.9 1045 <-> 91.188.34.220 28708
05900  12718   610464 (20s) LIMIT tcp 192.168.0.71 1144 <-> 94.100.189.32 2041
05900  30686  1472928 (20s) LIMIT tcp 192.168.0.187 2092 <-> 81.19.66.32 80
05900  16020   768960 (20s) LIMIT tcp 192.168.0.71 1140 <-> 94.100.189.32 2041
05900  51379  2466192 (20s) LIMIT tcp 192.168.0.25 3952 <-> 94.100.189.57 443
05900  14879   714192 (20s) LIMIT tcp 192.168.0.71 1150 <-> 94.100.179.153 80
05900  24717  1186416 (20s) LIMIT tcp 192.168.0.25 3954 <-> 94.100.189.33 443
05900  16068   771264 (20s) LIMIT tcp 192.168.0.25 3959 <-> 94.100.189.32 443
05900  10265   492720 (20s) LIMIT tcp 192.168.0.9 1047 <-> 67.86.159.96 8838
05900  45298  2174304 (20s) LIMIT tcp 192.168.0.71 1136 <-> 94.100.179.152 80
....

Edited by JohnK

Share this post


Link to post
Share on other sites

Вот что есть у меня:

srv1# sysctl -A | grep ip.fw

net.inet.ip.fw.dyn_keepalive: 1
net.inet.ip.fw.dyn_short_lifetime: 5
net.inet.ip.fw.dyn_udp_lifetime: 10
net.inet.ip.fw.dyn_rst_lifetime: 1
net.inet.ip.fw.dyn_fin_lifetime: 1
net.inet.ip.fw.dyn_syn_lifetime: 20
net.inet.ip.fw.dyn_ack_lifetime: 300
net.inet.ip.fw.static_count: 135
net.inet.ip.fw.dyn_max: 4096
net.inet.ip.fw.dyn_count: 8
net.inet.ip.fw.curr_dyn_buckets: 256
net.inet.ip.fw.dyn_buckets: 256
net.inet.ip.fw.default_rule: 65535
net.inet.ip.fw.verbose_limit: 10
net.inet.ip.fw.verbose: 1
net.inet.ip.fw.debug: 1
net.inet.ip.fw.one_pass: 0
net.inet.ip.fw.autoinc_step: 100
net.inet.ip.fw.enable: 1

Может из-за net.inet.ip.fw.dyn_keepalive: 1 и висят очереди тем самым блокируя создания новыя из-за ограничения 16 сессий?

Share this post


Link to post
Share on other sites
Может все дело в

$cmd pipe 10 ip from "table(5)" to any out via age0 setup limit src-addr 50
ipfw pipe 10 config bw 32KByte/s [b]queue 40[/b] mask src-ip ${DirMask}

 

То есть в кол-ве очередей? Очереди и сессии как-то связаны?

Прочитайте уже man ipfw. В данном правиле queue 40 -- это просто длина очереди для динамических пайпов. Luigi Rizzo неудачно выбрал название этого параметра, т.к. оно совпадает с названием очередей с дисциплиной WF2Q+. У вас правил, создающих эти queue вообще нет.
Edited by photon

Share this post


Link to post
Share on other sites

Торрентщиков так не побороть, только всем хуже сделал.

Share this post


Link to post
Share on other sites

я думаю, надо подумать над тарифами.

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

 

например утилизировал канал более 50% за полчаса, следующие полчаса сиди на 1/4 от скорости,

либо вообще только по 80-му порту ходи

и сделать двойную/тройную скорость ночью (и утром) - пусть качают когда канал свободен.

 

если люди адекватные, поймут, неадекватных отдать конкуренту :)

Share this post


Link to post
Share on other sites

Ну почему не побороть? Вполне достаточно для закачки + серфинг где-то 25 сессий. Но это никак ни то что генерируют торентщики.

Но тут уже дело принципа. Хочу разобраться в чем тут дело.

 

 

Share this post


Link to post
Share on other sites

Это в офисе админ может решать что достаточно а что нет юзеру, провайдинг совсем другое.

Для таких упёртых обьясню на пальцах.

 

Когда я (обычный быдло-ламо-юзер) открываю браузером маилру то это обычно 3-5 запросов к днс, и по запросу на каждый файл картинки и прочего, и именно при открытии запросто может перевалить и за 25. Потом не понятно сколько оно весит в таблице, и может для открытия след страницы не остаться свободных сессий.

А ещё я люблю что то в гугле искать и открывать по несколько десятков ссылкой подряд...

Это ещё не забываем что включён агент, скайп, мсн и ещё почту нада переодически аутлуком чекать.

 

Когда я (торрент качальщик) вижу что ***г-админ прова тупо зарезал количество сессий до неприемлемого количества, то я либо переключусь в другому прову, либо использую это http://habrahabr.ru/blogs/infosecurity/70367/ , тогда мне хватит и одного коннекта чтобы обойти все лимиты.

Share this post


Link to post
Share on other sites

Во-первых, я хочу чисто технически решить эту задачу ибо есть необходимость.

Во-вторых,

Для таких упёртых обьясню на пальцах
меня интересует (повторюсь) техническое решение а чье-либо личное мнение.

Share this post


Link to post
Share on other sites

Как резать/ограничивать торренты здесь уже обсуждалось не раз.

Как сделать чтобы сервер больше прожёвывал говорили здесь и куче топиков.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this