Автор Тема: iptables - IPMARK + tc  (Прочетена 6049 пъти)

samiboy

  • Напреднали
  • *****
  • Публикации: 66
    • Профил
iptables - IPMARK + tc
« -: Dec 23, 2010, 23:00 »
Здравейте, за да обясня точно какъв ми е проблема ще трябва да разкажа малко предистория.

Преди известно време конфигурирах една машина (Xeon X3430 + Supermicro) с около 100 потребителя които трябва да имат SNAT, DNAT и ограничение на скороста в двете посоки. Това решение го реализирах с iptables и tc:
Код
GeSHi (Bash):
  1. iptables -t nat -A POSTROUTING -s $ADDRESS -j SNAT --to $OUTADDRESS
  2. iptables -t nat -A PREROUTING -d $OUTADDRESS -j DNAT --to $ADDRESS
  3. tc qdisc del dev $DEV1 root
  4. tc qdisc del dev $DEV1 handle ffff: ingress
  5. tc qdisc add dev $DEV1 root handle 1 htb default 10
  6. tc class add dev $DEV1 parent 1: classid 1: htb rate 1000Mbit
  7. tc qdisc add dev $DEV1 handle ffff: ingress
  8. echo tc class add dev $DEV1 parent 1: classid 1:$MARKUP htb rate $SPEEDIN burst $BURSTIN quantum 60000
  9. echo tc qdisc add dev $DEV1 parent 1:$MARKUP sfq
  10. echo tc filter add dev $DEV1 parent 1: protocol ip prio 1 u32 match ip dst $IPCLIENT classid 1:$MARKUP
  11. echo tc filter add dev $DEV1 parent ffff: protocol ip prio 20 u32 match ip src $IPCLIENT police rate $SPEEDOUT burst $BURSTOUT action drop flowid :$MARKUP
  12.  

Taka работеше доста добре но потребителите станаха около 400 и особено изходящия трафик започна да дава аномалии. Затова почетох малко и промених конфигурацията като този път включих MARK с iptables.
Код
GeSHi (Bash):
  1. iptables -t nat -A POSTROUTING -s $ADDRESS -j SNAT --to $OUTADDRESS
  2. iptables -t nat -A PREROUTING -d $OUTADDRESS -j DNAT --to $ADDRESS
  3. tc qdisc del dev $DEV1 root
  4. tc qdisc add dev $DEV1 root handle 1: htb default 10
  5. tc qdisc del dev $DEV2 root
  6. tc qdisc add dev $DEV2 root handle 1: htb default 10
  7. iptables -t mangle -A POSTROUTING -d $IPCLIENT -j MARK --set-mark 0x$MARKUP
  8. tc class add dev $DEV1 parent 1: classid 1:$MARKUP htb rate $SPEEDIN ceil $CEIL burst $BURSTIN quantum 60000
  9. tc filter add dev $DEV1 parent 1: protocol ip prio 1 handle 0x$MARKUP fw classid 1:$MARKUP
  10. iptables -t mangle -A PREROUTING -s $IPCLIENT -j MARK --set-mark 0x$MARKUP1
  11. tc class add dev $DEV2 parent 1: classid 1:$MARKUP1 htb rate $SPEEDOUT ceil $CEIL burst $BURSTOUT quantum 60000
  12. tc filter add dev $DEV2 parent 1: protocol ip prio 1 handle 0x$MARKUP1 fw classid 1:$MARKUP1
  13.  

Този пък вариант работеше добре до 600-ния потребител и реших да съкратя малко правила този път като използвам CLASSIFY в iptables като премахна filter в tc.
Код
GeSHi (Bash):
  1. iptables -t nat -A POSTROUTING -s $ADDRESS -j SNAT --to $OUTADDRESS
  2. iptables -t nat -A PREROUTING -d $OUTADDRESS -j DNAT --to $ADDRESS
  3. tc qdisc del dev $DEV1 root
  4. tc qdisc add dev $DEV1 root handle 1: htb default 10
  5. tc qdisc del dev $DEV2 root
  6. tc qdisc add dev $DEV2 root handle 1: htb default 10
  7. iptables -t mangle -A FORWARD -d $IPCLIENT -j CLASSIFY --set-class 1:$MARKUP
  8. tc class add dev $DEV1 parent 1: classid 1:$MARKUP htb rate $SPEEDIN ceil $CEIL burst $BURSTIN quantum 60000
  9. iptables -t mangle -A FORWARD -s $IPCLIENT -j CLASSIFY --set-class 1:$MARKUP1
  10. tc class add dev $DEV2 parent 1: classid 1:$MARKUP1 htb rate $SPEEDOUT ceil $CEIL burst $BURSTOUT quantum 60000
  11.  
CLASSIFY помогна малко, но сега потребителите са 700 и се появи проблем който се състои в повишено латенси на пинга в натоварен момент като 350-400Mbits трафик например. Загуби почти няма но е явно, че пак трябва да се прави някаква оптимизация на трафик контрола. Реших да пробвам FLATTC обаче при мен е нереализуемо по простата причина, че аз имам 9 B class мрежи:
10.121.0.0/16
10.122.0.0/16
10.123.0.0/16
10.124.0.0/16
10.125.0.0/16
10.126.0.0/16
10.127.0.0/16
10.128.0.0/16
10.129.0.0/16
в които има около 40 C class в който имам потребители като:
10.121.5.4/24
10.123.23.12/24
10.125.3.2/24
10.129.8.13/24 и така нататък .....
Това защо е така мисля, че няма нужда да обяснявам да приемем, че е по исторически причини и няма възможност за промяна.
И така, компилирах ipset, поиграх си малко с него разбрах как работи. После компилирах xtables-addons-modules (това e готов пакет p-o-m в Debian) но тук модула на IPMARK гръмна и след неравна борба разбрах, че версията на iptables ми е стара. Така инсталирах версия iptables v1.4.10 и модулите на p-o-m тръгнаха но пък интерфейса на ipset се счупи защото явно не съвпада с версията на iptables но това не е темата сега. Въпроса е за IPMARK. Принципно не съм човек който се дава лесно но сагата IPMARK ми дойде в повече. В документацията на Netfilter има 5 реда от който нищо не отбирам а в Интернет има толкова малко и все грешни или под въпрос примери, че не стигнах до никъде. Разглеждах FLATTC но там примерите са за C class мрежи а и така и не разбрах and и or маските всъщност какво правят и как се връзват с filter.

Ако някой е наясно и може да помогне ще съм благодарен да ми даде само пример или насока как всъщност работи IPMARK и дали има реализация в моя случай с тези 9 B class мрежи ?


Активен

Acho

  • Напреднали
  • *****
  • Публикации: 5280
  • Distribution: Slackware, MikroTik - сървърно
  • Window Manager: console only
    • Профил
    • WWW
Re: iptables - IPMARK + tc
« Отговор #1 -: Dec 24, 2010, 05:59 »
Само да те попитам: как определи кои мрежи са клас B, и кои клас C ? Ти изобщо нямаш клас B или C, а само A.

Защото мрежите 10.xxx.xxx.xxx са от клас A. При теб само маската е различна (/16 или /24), но класовете на всички са все A.


Class A comprises networks 1.0.0.0 through 127.0.0.0. The network number is contained in the first octet. This class provides for a 24-bit host part, allowing roughly 1.6 million hosts per network.

Class B contains networks 128.0.0.0 through 191.255.0.0; the network number is in the first two octets. This class allows for 16,320 nets with 65,024 hosts each.

Class C networks range from 192.0.0.0 through 223.255.255.0, with the network number contained in the first three octets. This class allows for nearly 2 million networks with up to 254 hosts.

Classes D, E, and F addresses falling into the range of 224.0.0.0 through 254.0.0.0 are either experimental or are reserved for special purpose use and don't specify any network. IP Multicast, which is a service that allows material to be transmitted to many points on an internet at one time, has been assigned addresses from within this range.


П.С. И за 700 клиента пак през същия този гейтуей, не е ли много ? Дали се оправя сървъра ти нормално с този баз-бая голям трафик ? Защото 700 клиента са сериозно нещо. Дали успява гейта да смята всичките тия трафици ? В пъти се е увеличило всичко, а като знам лапетиите с тия торенти и с по много едновременни конекции. Нормално е да лагва повече. Дали не трябва да сложите още машини за гейтове.
« Последна редакция: Dec 24, 2010, 06:09 от Acho »
Активен

CPU - Intel Quad-Core Q8400, 2.66 GHz; Fan - Intel Box; MB - Intel G41M-T2; RAM - DDR2-800, Kingston HyperX, 2X2048 MB; VC - onboard, Intel G41 Express Chipset; HDD - Toshiba, 500 GB, SATAII; SB - Realtek HD Audio; DVD-RW - TSSTcorp DVD-RW; LAN - Realtek PCI-E GBE Controller; PSU - Fortron 350 Watt.

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: iptables - IPMARK + tc
« Отговор #2 -: Dec 24, 2010, 12:57 »
FlatTC e "настроен" да ползва /24 мрежи, но нищо не ти пречи да разгледаш сорса и да го промениш според твоите нужди.

Разгледай:
http://www.linux-bg.org/cgi-bin/y/index.pl?id=advices&key=380752598&page=article
и
http://www.linux-bg.org/cgi-bin/y/index.pl?page=article&id=advices&key=386924398
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: iptables - IPMARK + tc
« Отговор #3 -: Dec 24, 2010, 13:00 »
И за 700 клиента пак през същия този гейтуей, не е ли много ? Дали се оправя сървъра ти нормално с този баз-бая голям трафик ? Защото 700 клиента са сериозно нещо. Дали успява гейта да смята всичките тия трафици ? В пъти се е увеличило всичко, а като знам лапетиите с тия торенти и с по много едновременни конекции. Нормално е да лагва повече. Дали не трябва да сложите още машини за гейтове.
Според мен не е толкова проблем броят на потребителите в случая (според мен е твърде малък), колкото наличието на SNAT/DNAT - товари с connection-tracking-a.

Освен това 700 потребителя зад едно ИП са твърде много, ако няма ограничение на броя на връзките (connlimit).
« Последна редакция: Dec 24, 2010, 13:09 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

samiboy

  • Напреднали
  • *****
  • Публикации: 66
    • Профил
Re: iptables - IPMARK + tc
« Отговор #4 -: Dec 24, 2010, 14:36 »
Добре ..., явно попаднах на подходящия човек.
SNAT и DNAT не са зад едно ип, всяко private ip се транслира с public. Под исторически причини имах впредвид, че в началото беше една публична 93.155.130.0/24 мрежа с няколко 10.121.x.x/24 частни които се намират физически на отдалечени места и не са заети изцяло от клиенти. Така сглобих един баш скрипт /etc/init.d/netscript
Код
GeSHi (Bash):
  1. ADDRESS=$(grep -v \# /etc/ipclient | cut -d":" -f1);
  2. for ADDRESS in $ADDRESS; do
  3. OUTADDRESS=$(grep -v \# /etc/ipclient | grep -w -n $ADDRESS | cut -d":" -f3)
  4. iptables -t nat -A POSTROUTING -s $ADDRESS -j SNAT --to $OUTADDRESS
  5. iptables -t nat -A PREROUTING -d $OUTADDRESS -j DNAT --to $ADDRESS
  6. done;
  7.  
  8. DEV1=vlan100
  9. DEV2=vlan149
  10. SPEEDIN=30Mbit
  11. SPEEDOUT=5Mbit
  12. SPEEDIN2=45Mbit
  13. SPEEDOUT2=10Mbit
  14. CEILIN=40Mbit
  15. CEILOUT=5Mbit
  16. BURSTIN=10Mbit
  17. BURSTOUT=2Mbit
  18. tc qdisc del dev $DEV1 root
  19. tc qdisc add dev $DEV1 root handle 1: htb default 10
  20. tc class add dev $DEV1 parent 1: classid 1:1 htb rate $CEILIN
  21. tc qdisc del dev $DEV2 root
  22. tc qdisc add dev $DEV2 root handle 1: htb default 10
  23. tc class add dev $DEV2 parent 1: classid 1:1 htb rate $CEILOUT
  24.  
  25. IPCLIENT=`grep -v \# /etc/ipclient | grep speed1 | cut -d":" -f1`;
  26. for IPCLIENT in $IPCLIENT; do
  27. MARK=$(grep -v \# /etc/ipclient | grep -w -n $IPCLIENT | cut -d":" -f1)
  28. MARKUP=$(($MARK + 2000))
  29. MARKUP1=$(($MARK + 4000))
  30. iptables -t mangle -A FORWARD -d $IPCLIENT -j CLASSIFY --set-class 1:$MARKUP
  31. tc class add dev $DEV1 parent 1:1 classid 1:$MARKUP htb rate $SPEEDIN ceil $CEILIN burst $BURSTIN quantum 60000
  32. tc qdisc add dev $DEV1 parent 1:$MARKUP handle $MARKUP: sfq perturb 10
  33. iptables -t mangle -A FORWARD -s $IPCLIENT -j CLASSIFY --set-class 1:$MARKUP1
  34. tc class add dev $DEV2 parent 1:1 classid 1:$MARKUP1 htb rate $SPEEDOUT ceil $CEILOUT burst $BURSTOUT quantum 60000
  35. tc qdisc add dev $DEV2 parent 1:$MARKUP1 handle $MARKUP1: sfq perturb 10
  36. done;
  37.  
който от един текстов /etc/ipclient файл взима даните:
Код
GeSHi (Bash):
  1. # privateIP:publicIP:speed
  2. 10.127.10.2:93.155.130.41:speed1
  3. 10.122.2.9:93.155.130.42:speed1
  4. 10.123.4.6:93.155.130.43:speed1
  5. 10.127.1.5:93.155.130.44:speed2
  6. 10.126.9.13:93.155.130.45:speed1
  7. 10.125.21.5:93.155.130.46:speed2
  8. 10.126.20.13:93.155.130.47:speed1
  9.  
С течение на времето публините мрежи станаха 4 и частните ип адреси нараснаха до 700. Знам, че звучи странно защо досега е съм махнал NAT-a и затова ще обясня. От една страна частните ип адреси са на отдалечени физически места тоест рутирани през един а някой и през два хопа, за да премахна NAT трябва да нарежа маските на публичните адреси и това ще е ад а също и факта, че една част от клиентитие са магазини, нон стопи или обекти за наблюдения с асоциирани вече ип адреси дадени на клиентитие и така нататък. А що се тонася до контрака съм приложил това решение:
Код
GeSHi (Bash):
  1. echo 1 > /proc/sys/net/ipv4/ip_forward
  2. echo 20000000 > /proc/sys/net/nf_conntrack_max
  3. echo 2048 > /proc/sys/net/netfilter/nf_conntrack_expect_max
  4. echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
  5. echo 1 > /proc/sys/net/ipv4/conf/default/arp_filter
  6. echo 1 > /proc/sys/net/ipv4/conf/all/promote_secondaries
  7. echo 0 > /proc/sys/net/ipv4/conf/default/accept_source_route
  8. echo 0 > /proc/sys/kernel/sysrq
  9. echo 1 > /proc/sys/kernel/core_uses_pid
  10. echo 4194303 > /proc/sys/kernel/pid_max
  11. echo 20000000 > /proc/sys/net/core/rmem_max
  12. echo 20000000 > /proc/sys/net/core/wmem_max
  13. echo 4096 87380 20000000 > /proc/sys/net/ipv4/tcp_rmem
  14. echo 4096 87380 20000000 > /proc/sys/net/ipv4/tcp_wmem
  15. echo 1 > /proc/sys/net/ipv4/tcp_no_metrics_save
  16. echo 1 > /proc/sys/net/netfilter/nf_conntrack_tcp_be_liberal
  17. echo 0 > /proc/sys/net/ipv4/tcp_syncookies
  18. echo 5 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_syn_sent
  19. echo 5 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_syn_sent2
  20. echo 5 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_syn_recv
  21. echo 86400 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
  22. echo 10 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_fin_wait
  23. echo 10 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_close_wait
  24. echo 10 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_close
  25. echo 10 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_last_ack
  26. echo 10 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_time_wait
  27. echo 10 > /proc/sys/net/ipv4/netfilter/ip_conntrack_udp_timeout
  28. echo 180 > /proc/sys/net/ipv4/netfilter/ip_conntrack_udp_timeout_stream
  29. echo 10 > /proc/sys/net/ipv4/netfilter/ip_conntrack_icmp_timeout
  30. echo 600 > /proc/sys/net/ipv4/netfilter/ip_conntrack_generic_timeout
  31.  
Проблема с пинга се появява вечер когато трафика нарасне до 350Mbits или най вече когато се изравни и в двете посоки. Изчистя ли с qdisc del dev и проблема ичезва. Нека да мина направо на въпроса. Както вече си забелязал аз не деля трафика на БГ и ИНТ защото международния канал тук е широк. Прегледал съм това което си написал но не мога да разбера как работи IPMARK и по точно за какво са маските or и and. Ако може да ми помогнеш с един пример с няколко реда:

как може да се направи марк на мрежа 10.0.0.0/8 dst и ограничаване на ип адреси 10.125.3.2 и 10.126.5.5 например ?

Предварително благодаря.
Активен

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: iptables - IPMARK + tc
« Отговор #5 -: Dec 24, 2010, 15:34 »
Прегледал съм това което си написал но не мога да разбера как работи IPMARK и по точно за какво са маските or и and.


IPMARK премахва нуждата от tc филтри - създаваш един единствен "празен" филтър за всеки интерфейс:
Код
GeSHi (Bash):
  1. tc filter add dev eth0 parent 1:0 protocol ip prio 1 fw
Когато филтърът е "празен fw", то TC гледа MARK полето на пакетите и ги насочва къ съответните класове:

Цитат
IPMARK: маркира пакетите, като за стойността на маркера използва стойността на самото IP;
IPMARK: приема като параметри 3 неща - IP-то по което ще маркираме и 2 параметъра за управление на получения MARK;
IPMARK: IP-то по което ше маркираме се взима директно от пакета и в зависимост от това дали --addr параметъра е src или dst, се взима съответно src IP-то или dst IP-то;
IPMARK: 2-та параметъра за управление на получения MARK реализират побитово И и ИЛИ върху стойността на IP адреса;

Ако може да ми помогнеш с един пример с няколко реда:

как може да се направи марк на мрежа 10.0.0.0/8 dst и ограничаване на ип адреси 10.125.3.2 и 10.126.5.5 например ?

не ми става много ясно какво точно искаш - явно имаш клиенти, които не са с един ИП адрес, а цяла (или част) субмрежа.

Тъй като нямаш разделение на трафика, то най-лесно ще ти е да направиш глобално маркиране:
Код
GeSHi (Bash):
  1. iptables -t mangle -A FORWARD -d 10.0.0.0/16 -j IPMARK --addr=dst --and-mask=0x0000FFFF --or-mask=0x00010000

С един единствен ред маркираш целия download трафик, но за /16 субмрежа, тъй като не трябва да "влизаме" в major частта на МАРК полето, което от своя страна определя major номера на tc класа.

т.е взимаш последните 4 шестнайсетични числа от ИП адреса (който в 16 вид e FF.FF.FF.FF) и те стават де факто MARK полето на пакетите.

IPCLASSIFY е съшото като IPMARK - аналогията е CLASSIFY-MARK. Така отпада и "празния" филтър и остава свободата да ползваш MARK полето за собствени нужди.
« Последна редакция: Dec 24, 2010, 23:31 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

martos

  • Напреднали
  • *****
  • Публикации: 110
    • Профил
    • WWW
Re: iptables - IPMARK + tc
« Отговор #6 -: Dec 24, 2010, 15:36 »
Как разпределяш прекъсванията?
Активен

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: iptables - IPMARK + tc
« Отговор #7 -: Dec 24, 2010, 15:37 »
SNAT и DNAT не са зад едно ип, всяко private ip се транслира с public.

Може би ще ти е интересно да видиш NETMAP target-a.
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: iptables - IPMARK + tc
« Отговор #8 -: Dec 24, 2010, 15:38 »
Как разпределяш прекъсванията?

Хех, това ми беше следващият въпрос :)
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

samiboy

  • Напреднали
  • *****
  • Публикации: 66
    • Профил
Re: iptables - IPMARK + tc
« Отговор #9 -: Dec 24, 2010, 18:29 »
Предполагам за прекъсванията и колко се товари машината това е някаква информация.
http://data.itservice-bg.net/screenshot/core2-htop-bmon.png
http://data.itservice-bg.net/screenshot/core2-top-interupts.png

IPMAP е красиво нещо но е огледало на две мрежи. Аз имам 4 публични/24 и доста частни мрежи от рода на 10.121.x.x/24, 10.122.x.x/24, 10.125.x.x/24, 10.125.1.x/24, 10.125.2.x/24, 10.125.3.x/24 и така нататък иначе идеята "кърти".

А за IPMARK нека да опитаме така. Имаш тези ип адреси: http://data.itservice-bg.net/documents/ip.txt ,какви са правилата които ти би използвал ?

След като не може с 10.0.0.0/8 ще го направя 9 правила с 10.121.0.0/16, 10.122.0.0/16, 10.123.0.0/16
..................
На мястото на въпросителните какви стойности да задам и като имам две тарифи съответно две скорости как мога да разделя адресите  ::)

Код
GeSHi (Bash):
  1. iptables -t mangle -A FORWARD -d 10.121.0.0/16 -j IPMARK --addr=dst --and-mask=0x0000FFFF --or-mask=0x00000000
  2.  
  3. tc qdisc add dev $DEV1 root handle 1: htb default 10
  4. tc class add dev $DEV1 parent 1:10 classid $?? htb rate 10Mbit ceil 1000Mbit prio 5
  5. tc qdisc add dev $DEV1 parent 1:0$?? handle $?? sfq perturb 10
  6. tc filter add dev $DEV1 parent 1: protocol ip prio 1 fw
  7.  
« Последна редакция: Dec 24, 2010, 22:19 от samiboy »
Активен

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: iptables - IPMARK + tc
« Отговор #10 -: Dec 24, 2010, 23:17 »
SNAT/DNAT на всяко ИП е голям товар за машината ти - имаш адски много правила (мин. 2 х броя на ИП-тата).  Замени го с NETMAP:
Код
GeSHi (Bash):
  1. iptables -t mangle -A PREROUTING -i eth1 -s 10.121.x.x/24 -j NETMAP --to 93.155.130.0/24
  2. iptables -t mangle -A PREROUTING -i eth0 -s 93.155.130.0/24 -j NETMAP --to  10.121.x.x/24
и.т.н.

Две правила за всяка /24 мрежа! И всъщност ще направиш "пълен" ДМЗ (със SNAT/DNAT трудно ще го направиш). А най-добре е да преминеш към маршрутизиране на публични ИП адреси към клиентите за да отпадне и connection tracking-a.
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: iptables - IPMARK + tc
« Отговор #11 -: Dec 24, 2010, 23:29 »
А за IPMARK нека да опитаме така. Имаш тези ип адреси: http://data.itservice-bg.net/documents/ip.txt ,какви са правилата които ти би използвал ?

След като не може с 10.0.0.0/8 ще го направя 9 правила с 10.121.0.0/16, 10.122.0.0/16, 10.123.0.0/16
..................
На мястото на въпросителните какви стойности да задам и като имам две тарифи съответно две скорости как мога да разделя адресите  ::)

Код
GeSHi (Bash):
  1. iptables -t mangle -A FORWARD -d 10.121.0.0/16 -j IPMARK --addr=dst --and-mask=0x0000FFFF --or-mask=0x00000000
  2.  
  3. tc qdisc add dev $DEV1 root handle 1: htb default 10
  4. tc class add dev $DEV1 parent 1:10 classid $?? htb rate 10Mbit ceil 1000Mbit prio 5
  5. tc qdisc add dev $DEV1 parent 1:0$?? handle $?? sfq perturb 10
  6. tc filter add dev $DEV1 parent 1: protocol ip prio 1 fw
  7.  

Можеш да го направиш с няколко правила, но трябва да използваш --or-mask различна от нула за да не навлезеш в старшата тетрада:

Код
GeSHi (Bash):
  1. iptables -t mangle -A FORWARD -d 10.121.5.0/24 -j IPMARK --addr=dst --and-mask=0x0000FF --or-mask=0x00010100
  2. iptables -t mangle -A FORWARD -d 10.122.8.0/24 -j IPMARK --addr=dst --and-mask=0x0000FF --or-mask=0x00010200
  3. iptables -t mangle -A FORWARD -d 10.19.2.0/24 -j IPMARK --addr=dst --and-mask=0x0000FF --or-mask=0x00010300
  4.  
и т.н.
Т.е. тъй като не използваш цялата 10.0.0.0/8 мрежа, делиш я на /24 мрежи (кото и в момента правиш) и я "номерираш" с --or-mask-ата. Имай предвид, че това е шестнайсетичен код, а не десетичен. Видът й е винаги 0001ХХ00 в твоя случай.

Така ще получиш:

Код
GeSHi (Bash):
  1. tc class add dev $DEV1 parent 1:10 classid XX{IP}  htb rate 10Mbit ceil 1000Mbit prio 5
  2. tc qdisc add dev $DEV1 parent 1: handle XX{IP} sfq perturb 10

където XX{IP} е номерът от --or-mask-ата (XX) и последната група от IP-то ({IP}). Всичко пак в шестнайсетичен код!

Цялата сметка е всъщност набор от побитови операции - първо побитово И върху ИП адреса, след това побитово ИЛИ върху резултата от предходната операция. Съветвам те да вникнеш по-дълбоко в това. В статиите по-горе доста обширно съм обяснявал.
« Последна редакция: Dec 25, 2010, 11:55 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

nemanema

  • Напреднали
  • *****
  • Публикации: 103
    • Профил
Re: iptables - IPMARK + tc
« Отговор #12 -: Dec 25, 2010, 12:27 »
Здрасти !
Не подлагам на съмнение помощта на Владо, и съм сигурен, че много може да се научи от практическият му опит, но за да се улеснят нещата нека питащия да даде малко повече инфо за точния модел дъно !
Т.е. имам идея за нещо и съмнението ми е в чип-а 82574L.
Ако се окажа прав за ситуацията, знам решение и ще го предложа.
В кръга на шегата, решението ще го кажа само и единствено срещу една бира ;)

Весели празници !
Активен

---=== мир и любов ===---

samiboy

  • Напреднали
  • *****
  • Публикации: 66
    • Профил
Re: iptables - IPMARK + tc
« Отговор #13 -: Dec 25, 2010, 13:43 »
Така, поизясниха се нещата с IPMARK. Незнам дали ще мога да го приложа (разбира се ще има тест) но поне разбрах как работи. Трябва да преосмисля основно конфигурацията макар, че топологията на мрежата не мога да я пипам, остава тотална оптимизация на правила (или групиране на такива) с цел пестене на ресурси. От сега усещам как ме очакват забавни моменти по празниците тип проби-грешки. По принцип както казах вече канала тук е широк за потреблението на клиентите и няма нужда да се цепи всеки байт, спра ли qdisc в пиков час трафика стига до 600Mbit без загуби на пакети с пуснат SNAT и DNAT което ясно показва, че машината може да държи трафик и има нужда от оптимизиране на конфигурацията и. Първтото нещо за което си мисля е, че DNAT не е нужен на всички, може да се направи списък на клиентитие само на които и трябва макар и да не знам това дали ще олекоти положението (тази операция мога да я направя чак след нова година). Второто което ми идва на ум е трябва ли да маркирам download трафика, ако използвам u32 класификаторите вместо CLASSIFY дали ще олекоти положението. В краен случаи мога да групирам download трафика в цели мрежи защото така и така върви на половината на uploada (все пак това е в случаи, че не намеря правилното решение с IPMARK)

Бирата ти я пращам още сега  [_]3 също в кръга на шегата  :D Ще е интересно ако споделиш все пак какво имаш впредвид.
Код:
00:00.0 Host bridge: Intel Corporation 3200/3210 Chipset DRAM Controller (rev 01)
Subsystem: Super Micro Computer Inc Device d280
Flags: bus master, fast devsel, latency 0
Capabilities: [e0] Vendor Specific Information: Len=0c <?>
Kernel driver in use: i3200_edac

00:01.0 PCI bridge: Intel Corporation 3200/3210 Chipset Host-Primary PCI Express Bridge (rev 01) (prog-if 00 [Normal decode])
Flags: bus master, fast devsel, latency 0
Bus: primary=00, secondary=01, subordinate=03, sec-latency=0
Memory behind bridge: d8100000-d81fffff
Capabilities: [88] Subsystem: Super Micro Computer Inc Device d280
Capabilities: [80] Power Management version 3
Capabilities: [90] MSI: Enable+ Count=1/1 Maskable- 64bit-
Capabilities: [a0] Express Root Port (Slot+), MSI 00
Capabilities: [100] Virtual Channel
Capabilities: [140] Root Complex Link
Kernel driver in use: pcieport

00:1a.0 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #4 (rev 02) (prog-if 00 [UHCI])
Subsystem: Super Micro Computer Inc Device d280
Flags: bus master, medium devsel, latency 0, IRQ 16
I/O ports at 1820 [size=32]
Capabilities: [50] PCI Advanced Features
Kernel driver in use: uhci_hcd

00:1a.1 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #5 (rev 02) (prog-if 00 [UHCI])
Subsystem: Super Micro Computer Inc Device d280
Flags: bus master, medium devsel, latency 0, IRQ 17
I/O ports at 1840 [size=32]
Capabilities: [50] PCI Advanced Features
Kernel driver in use: uhci_hcd

00:1a.2 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #6 (rev 02) (prog-if 00 [UHCI])
Subsystem: Super Micro Computer Inc Device d280
Flags: bus master, medium devsel, latency 0, IRQ 18
I/O ports at 1860 [size=32]
Capabilities: [50] PCI Advanced Features
Kernel driver in use: uhci_hcd

00:1a.7 USB Controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #2 (rev 02) (prog-if 20 [EHCI])
Subsystem: Super Micro Computer Inc Device d280
Flags: bus master, medium devsel, latency 0, IRQ 18
Memory at d8701000 (32-bit, non-prefetchable) [size=1K]
Capabilities: [50] Power Management version 2
Capabilities: [58] Debug port: BAR=1 offset=00a0
Capabilities: [98] PCI Advanced Features
Kernel driver in use: ehci_hcd

00:1c.0 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 1 (rev 02) (prog-if 00 [Normal decode])
Flags: bus master, fast devsel, latency 0
Bus: primary=00, secondary=05, subordinate=05, sec-latency=0
I/O behind bridge: 00002000-00002fff
Memory behind bridge: d8000000-d80fffff
Prefetchable memory behind bridge: 00000000d8500000-00000000d86fffff
Capabilities: [40] Express Root Port (Slot+), MSI 00
Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit-
Capabilities: [90] Subsystem: Super Micro Computer Inc Device d280
Capabilities: [a0] Power Management version 2
Capabilities: [100] Virtual Channel
Capabilities: [180] Root Complex Link
Kernel driver in use: pcieport

00:1c.4 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 5 (rev 02) (prog-if 00 [Normal decode])
Flags: bus master, fast devsel, latency 0
Bus: primary=00, secondary=0d, subordinate=0d, sec-latency=0
I/O behind bridge: 00003000-00003fff
Memory behind bridge: d8200000-d82fffff
Prefetchable memory behind bridge: 00000000d8800000-00000000d89fffff
Capabilities: [40] Express Root Port (Slot+), MSI 00
Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit-
Capabilities: [90] Subsystem: Super Micro Computer Inc Device d280
Capabilities: [a0] Power Management version 2
Capabilities: [100] Virtual Channel
Capabilities: [180] Root Complex Link
Kernel driver in use: pcieport

00:1c.5 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 6 (rev 02) (prog-if 00 [Normal decode])
Flags: bus master, fast devsel, latency 0
Bus: primary=00, secondary=0f, subordinate=0f, sec-latency=0
I/O behind bridge: 00004000-00004fff
Memory behind bridge: d8300000-d83fffff
Prefetchable memory behind bridge: 00000000d8a00000-00000000d8bfffff
Capabilities: [40] Express Root Port (Slot+), MSI 00
Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit-
Capabilities: [90] Subsystem: Super Micro Computer Inc Device d280
Capabilities: [a0] Power Management version 2
Capabilities: [100] Virtual Channel
Capabilities: [180] Root Complex Link
Kernel driver in use: pcieport

00:1d.0 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1 (rev 02) (prog-if 00 [UHCI])
Subsystem: Super Micro Computer Inc Device d280
Flags: bus master, medium devsel, latency 0, IRQ 23
I/O ports at 1880 [size=32]
Capabilities: [50] PCI Advanced Features
Kernel driver in use: uhci_hcd

00:1d.1 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #2 (rev 02) (prog-if 00 [UHCI])
Subsystem: Super Micro Computer Inc Device d280
Flags: bus master, medium devsel, latency 0, IRQ 22
I/O ports at 18a0 [size=32]
Capabilities: [50] PCI Advanced Features
Kernel driver in use: uhci_hcd

00:1d.2 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3 (rev 02) (prog-if 00 [UHCI])
Subsystem: Super Micro Computer Inc Device d280
Flags: bus master, medium devsel, latency 0, IRQ 18
I/O ports at 18c0 [size=32]
Capabilities: [50] PCI Advanced Features
Kernel driver in use: uhci_hcd

00:1d.7 USB Controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1 (rev 02) (prog-if 20 [EHCI])
Subsystem: Super Micro Computer Inc Device d280
Flags: bus master, medium devsel, latency 0, IRQ 23
Memory at d8701400 (32-bit, non-prefetchable) [size=1K]
Capabilities: [50] Power Management version 2
Capabilities: [58] Debug port: BAR=1 offset=00a0
Capabilities: [98] PCI Advanced Features
Kernel driver in use: ehci_hcd

00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev 92) (prog-if 01 [Subtractive decode])
Flags: bus master, fast devsel, latency 0
Bus: primary=00, secondary=11, subordinate=11, sec-latency=32
I/O behind bridge: 00005000-00005fff
Memory behind bridge: d8400000-d84fffff
Prefetchable memory behind bridge: 00000000d0000000-00000000d7ffffff
Capabilities: [50] Subsystem: Super Micro Computer Inc Device d280

00:1f.0 ISA bridge: Intel Corporation 82801IR (ICH9R) LPC Interface Controller (rev 02)
Subsystem: Super Micro Computer Inc Device d280
Flags: bus master, medium devsel, latency 0
Capabilities: [e0] Vendor Specific Information: Len=0c <?>

00:1f.2 IDE interface: Intel Corporation 82801IR/IO/IH (ICH9R/DO/DH) 4 port SATA IDE Controller (rev 02) (prog-if 8a [Master SecP PriP])
Subsystem: Super Micro Computer Inc Device d280
Flags: bus master, 66MHz, medium devsel, latency 0, IRQ 17
I/O ports at 01f0 [size=8]
I/O ports at 03f4 [size=1]
I/O ports at 0170 [size=8]
I/O ports at 0374 [size=1]
I/O ports at 1c10 [size=16]
I/O ports at 1c00 [size=16]
Capabilities: [70] Power Management version 3
Capabilities: [b0] PCI Advanced Features
Kernel driver in use: ata_piix

00:1f.3 SMBus: Intel Corporation 82801I (ICH9 Family) SMBus Controller (rev 02)
Subsystem: Super Micro Computer Inc Device d280
Flags: medium devsel, IRQ 17
Memory at d8701800 (64-bit, non-prefetchable) [size=256]
I/O ports at 1100 [size=32]
Kernel driver in use: i801_smbus

00:1f.5 IDE interface: Intel Corporation 82801I (ICH9 Family) 2 port SATA IDE Controller (rev 02) (prog-if 85 [Master SecO PriO])
Subsystem: Super Micro Computer Inc Device d280
Flags: bus master, 66MHz, medium devsel, latency 0, IRQ 18
I/O ports at 1c68 [size=8]
I/O ports at 1c5c [size=4]
I/O ports at 1c60 [size=8]
I/O ports at 1c58 [size=4]
I/O ports at 1c30 [size=16]
I/O ports at 1c20 [size=16]
Capabilities: [70] Power Management version 3
Capabilities: [b0] PCI Advanced Features
Kernel driver in use: ata_piix

00:1f.6 Signal processing controller: Intel Corporation 82801I (ICH9 Family) Thermal Subsystem (rev 02)
Subsystem: Super Micro Computer Inc Device 0000
Flags: fast devsel, IRQ 5
Memory at d8700000 (64-bit, non-prefetchable) [size=4K]
Capabilities: [50] Power Management version 3

01:00.0 PCI bridge: Intel Corporation 6700PXH PCI Express-to-PCI Bridge A (rev 09) (prog-if 00 [Normal decode])
Flags: bus master, fast devsel, latency 0
Bus: primary=01, secondary=02, subordinate=02, sec-latency=64
Capabilities: [44] Express PCI/PCI-X Bridge, MSI 00
Capabilities: [5c] MSI: Enable- Count=1/1 Maskable- 64bit+
Capabilities: [6c] Power Management version 2
Capabilities: [d8] PCI-X bridge device
Capabilities: [100] Advanced Error Reporting
Capabilities: [300] Power Budgeting <?>

01:00.1 PIC: Intel Corporation 6700/6702PXH I/OxAPIC Interrupt Controller A (rev 09) (prog-if 20 [IO(X)-APIC])
Subsystem: Super Micro Computer Inc Device d280
Flags: bus master, fast devsel, latency 0
Memory at d8100000 (32-bit, non-prefetchable) [size=4K]
Capabilities: [44] Express Endpoint, MSI 00
Capabilities: [6c] Power Management version 2

01:00.2 PCI bridge: Intel Corporation 6700PXH PCI Express-to-PCI Bridge B (rev 09) (prog-if 00 [Normal decode])
Flags: bus master, fast devsel, latency 0
Bus: primary=01, secondary=03, subordinate=03, sec-latency=64
Capabilities: [44] Express PCI/PCI-X Bridge, MSI 00
Capabilities: [5c] MSI: Enable- Count=1/1 Maskable- 64bit+
Capabilities: [6c] Power Management version 2
Capabilities: [d8] PCI-X bridge device
Capabilities: [100] Advanced Error Reporting
Capabilities: [300] Power Budgeting <?>

01:00.3 PIC: Intel Corporation 6700PXH I/OxAPIC Interrupt Controller B (rev 09) (prog-if 20 [IO(X)-APIC])
Subsystem: Super Micro Computer Inc Device d280
Flags: bus master, fast devsel, latency 0
Memory at d8101000 (32-bit, non-prefetchable) [size=4K]
Capabilities: [44] Express Endpoint, MSI 00
Capabilities: [6c] Power Management version 2

05:00.0 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)
Subsystem: Intel Corporation PRO/1000 PT Dual Port Server Adapter
Flags: bus master, fast devsel, latency 0, IRQ 76
Memory at d8020000 (32-bit, non-prefetchable) [size=128K]
Memory at d8000000 (32-bit, non-prefetchable) [size=128K]
I/O ports at 2000 [size=32]
[virtual] Expansion ROM at d8500000 [disabled] [size=128K]
Capabilities: [c8] Power Management version 2
Capabilities: [d0] MSI: Enable+ Count=1/1 Maskable- 64bit+
Capabilities: [e0] Express Endpoint, MSI 00
Capabilities: [100] Advanced Error Reporting
Capabilities: [140] Device Serial Number 00-15-17-ff-ff-96-77-62
Kernel driver in use: e1000e

05:00.1 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)
Subsystem: Intel Corporation PRO/1000 PT Dual Port Server Adapter
Flags: bus master, fast devsel, latency 0, IRQ 77
Memory at d8060000 (32-bit, non-prefetchable) [size=128K]
Memory at d8040000 (32-bit, non-prefetchable) [size=128K]
I/O ports at 2020 [size=32]
[virtual] Expansion ROM at d8520000 [disabled] [size=128K]
Capabilities: [c8] Power Management version 2
Capabilities: [d0] MSI: Enable+ Count=1/1 Maskable- 64bit+
Capabilities: [e0] Express Endpoint, MSI 00
Capabilities: [100] Advanced Error Reporting
Capabilities: [140] Device Serial Number 00-15-17-ff-ff-96-77-62
Kernel driver in use: e1000e

0d:00.0 Ethernet controller: Intel Corporation 82573E Gigabit Ethernet Controller (Copper) (rev 03)
Subsystem: Super Micro Computer Inc Device 108c
Flags: bus master, fast devsel, latency 0, IRQ 78
Memory at d8200000 (32-bit, non-prefetchable) [size=128K]
I/O ports at 3000 [size=32]
Capabilities: [c8] Power Management version 2
Capabilities: [d0] MSI: Enable+ Count=1/1 Maskable- 64bit+
Capabilities: [e0] Express Endpoint, MSI 00
Capabilities: [100] Advanced Error Reporting
Capabilities: [140] Device Serial Number 00-30-48-ff-ff-d3-ee-38
Kernel driver in use: e1000e

0f:00.0 Ethernet controller: Intel Corporation 82573L Gigabit Ethernet Controller
Subsystem: Super Micro Computer Inc Device 109a
Flags: bus master, fast devsel, latency 0, IRQ 79
Memory at d8300000 (32-bit, non-prefetchable) [size=128K]
I/O ports at 4000 [size=32]
Capabilities: [c8] Power Management version 2
Capabilities: [d0] MSI: Enable+ Count=1/1 Maskable- 64bit+
Capabilities: [e0] Express Endpoint, MSI 00
Capabilities: [100] Advanced Error Reporting
Capabilities: [140] Device Serial Number 00-30-48-ff-ff-d3-ee-39
Kernel driver in use: e1000e

11:04.0 VGA compatible controller: ATI Technologies Inc ES1000 (rev 02) (prog-if 00 [VGA controller])
Subsystem: Super Micro Computer Inc Device d280
Flags: bus master, stepping, fast Back2Back, medium devsel, latency 66, IRQ 22
Memory at d0000000 (32-bit, prefetchable) [size=128M]
I/O ports at 5000 [size=256]
Memory at d8400000 (32-bit, non-prefetchable) [size=64K]
[virtual] Expansion ROM at d8420000 [disabled] [size=128K]
Capabilities: [50] Power Management version 2
Активен

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: iptables - IPMARK + tc
« Отговор #14 -: Dec 25, 2010, 13:52 »
С CLASSIFY/u32 само ще пренесеш филтрирането в iptables/tc - няма много смисъл.

Можеш да погледнеш http://lartc.org/howto/lartc.adv-filter.hashing.html
Преди няколко години го разглеждах, но май имах проблем със SNAT-а ...

Също така Patrick McHardy е имплeментирал tc flow classifier, провокиран от наличието на IPMARK/IPCLASSIFY -
http://www.mail-archive.com/netdev@vger.kernel.org/msg60638.html

http://nfws.edenwall.com/en/?p=92
Цитат
Patrick MCHardy, NFtables
Posted on September 30, 2008 by regit

Iptables and Netfilter problems (bashing iptables)
- Full dump during ruleset update. Userspace is very primitive. Extentions build a blob which is passed to the core. There is no optimisation
- Very little abstraction: UDP and TCP ports for example don’t share port matching code
- Inconsistencies among matches: negation, range, prefixes support defer.
- Iptables parsing code is not in the core and it introduces inconsistencies in command line
- One target per rule: It requires rule duplication and duplicated changes (ex: LOG + DROP, MARK + ACCEPT)
- Static target module parametrization: option of the target expands to constant. You can not use flexible settings of the variable. It leads to build specific modules such as IPMARK, IPCLASSIFY and could lead to a TCPPORTCONNMARK module

« Последна редакция: Dec 25, 2010, 13:55 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Iptables
Настройка на програми
mozly 1 3945 Последна публикация Dec 10, 2002, 23:48
от Vency
iptables
Настройка на програми
sunhater 3 3766 Последна публикация Apr 23, 2003, 15:02
от sunhater
iptables
Настройка на програми
dumdum 4 4360 Последна публикация Apr 30, 2003, 10:40
от dumdum
IPTABLES
Настройка на програми
achird 2 4447 Последна публикация May 20, 2003, 14:14
от achird
Ipmark и ipset едновременно
Хардуерни и софтуерни проблеми
VladSun 0 1002 Последна публикация Jul 27, 2006, 01:32
от VladSun