Jump to content

Recommended Posts

Posted

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

Работа сервера устраивает, но появились торенщики и теперь канал забивается нечего делать. Как каждому 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 новичек, просьба помочь. Заранее огромное спасибо.

Posted

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

 

Posted (edited)
$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
Posted (edited)

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
Posted (edited)

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

$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
Posted (edited)

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

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
Posted

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

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 сессий?

Posted (edited)
Может все дело в

$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
Posted

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

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

 

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

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

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

 

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

Posted

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

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

 

 

Posted

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

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

 

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

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

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

 

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

Posted

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

Во-вторых,

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

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

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.