JohnK Posted January 11, 2010 Posted January 11, 2010 Перерыл весь инет, проделал много экспериментов. Так ничего толком не получилось. Работа сервера устраивает, но появились торенщики и теперь канал забивается нечего делать. Как каждому 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 новичек, просьба помочь. Заранее огромное спасибо. Вставить ник Quote
terrible Posted January 12, 2010 Posted January 12, 2010 а что конкретно по вашему означает "затык полный" ? Вставить ник Quote
JohnK Posted January 12, 2010 Author Posted January 12, 2010 "Затык" означает выше сказаннное: для эксперимента запускаю несколько юзеров по 5 таблице, потом через время пытаюсь зайти сам с 2 компьютеров в инет через 5 таблицу. В результате ничего не открывается. Хотя если сразу начать качать, то инет есть и резет по 10 сессий. К сожалению сильно не поиграешься ибо сервак рабочий а другого пока нет для экспериментов... Вставить ник Quote
photon Posted January 12, 2010 Posted January 12, 2010 (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 January 12, 2010 by photon Вставить ник Quote
JohnK Posted January 12, 2010 Author Posted January 12, 2010 (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 January 12, 2010 by JohnK Вставить ник Quote
JohnK Posted January 12, 2010 Author Posted January 12, 2010 (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 January 12, 2010 by JohnK Вставить ник Quote
JohnK Posted January 12, 2010 Author Posted January 12, 2010 (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 January 12, 2010 by JohnK Вставить ник Quote
JohnK Posted January 12, 2010 Author Posted January 12, 2010 Вот что есть у меня: 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 сессий? Вставить ник Quote
photon Posted January 13, 2010 Posted January 13, 2010 (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 January 13, 2010 by photon Вставить ник Quote
Ivan_83 Posted January 13, 2010 Posted January 13, 2010 Торрентщиков так не побороть, только всем хуже сделал. Вставить ник Quote
Giga-Byte Posted January 13, 2010 Posted January 13, 2010 я думаю, надо подумать над тарифами. сделать какие-нибудь ограничения по скорости или по объёму выкачаного трафика за какой-то период например утилизировал канал более 50% за полчаса, следующие полчаса сиди на 1/4 от скорости, либо вообще только по 80-му порту ходи и сделать двойную/тройную скорость ночью (и утром) - пусть качают когда канал свободен. если люди адекватные, поймут, неадекватных отдать конкуренту :) Вставить ник Quote
JohnK Posted January 13, 2010 Author Posted January 13, 2010 Ну почему не побороть? Вполне достаточно для закачки + серфинг где-то 25 сессий. Но это никак ни то что генерируют торентщики. Но тут уже дело принципа. Хочу разобраться в чем тут дело. Вставить ник Quote
Ivan_83 Posted January 16, 2010 Posted January 16, 2010 Это в офисе админ может решать что достаточно а что нет юзеру, провайдинг совсем другое. Для таких упёртых обьясню на пальцах. Когда я (обычный быдло-ламо-юзер) открываю браузером маилру то это обычно 3-5 запросов к днс, и по запросу на каждый файл картинки и прочего, и именно при открытии запросто может перевалить и за 25. Потом не понятно сколько оно весит в таблице, и может для открытия след страницы не остаться свободных сессий. А ещё я люблю что то в гугле искать и открывать по несколько десятков ссылкой подряд... Это ещё не забываем что включён агент, скайп, мсн и ещё почту нада переодически аутлуком чекать. Когда я (торрент качальщик) вижу что ***г-админ прова тупо зарезал количество сессий до неприемлемого количества, то я либо переключусь в другому прову, либо использую это http://habrahabr.ru/blogs/infosecurity/70367/ , тогда мне хватит и одного коннекта чтобы обойти все лимиты. Вставить ник Quote
JohnK Posted January 16, 2010 Author Posted January 16, 2010 Во-первых, я хочу чисто технически решить эту задачу ибо есть необходимость. Во-вторых, Для таких упёртых обьясню на пальцахменя интересует (повторюсь) техническое решение а чье-либо личное мнение. Вставить ник Quote
Ivan_83 Posted January 17, 2010 Posted January 17, 2010 Как резать/ограничивать торренты здесь уже обсуждалось не раз. Как сделать чтобы сервер больше прожёвывал говорили здесь и куче топиков. Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.