Шукати в цьому блозі

Показ дописів із міткою iptables. Показати всі дописи
Показ дописів із міткою iptables. Показати всі дописи

вівторок, 5 квітня 2011 р.

Lenny: iptables - ipset (netfilter-extensions) и т.д.

Отвык от Lenny, но вот пришлось поиметь с ним дело, поэтому родилась эта зметка:
$ sudo apt-get install ipset
$ sudo apt-get install netfilter-extensions-source
$ uname -a
Linux host.domain.tld 2.6.26-2-686 #1 SMP Fri Mar 13 18:08:45 UTC 2009 i686 GNU/Linux
$ sudo apt-get install linux-headers-2.6.26-2-686
$ sudo m-a build netfilter-extensions
$ sudo m-a update && sudo m-a a-i netfilter-extensions

неділя, 19 грудня 2010 р.

Debian: IPSET, TARPIT и т.д. на ядре 2.6.32 и выше

Для тех кто мучается с netfilter-extension и не понимает, что же делать-то ;)
  1. aptitude install module-assistant xtables-addons-source
  2. module-assistant prepare
  3. module-assistant auto-install xtables-addons-source
  4. depmod -a
Всё! Наслаждаемся екстеншенами.

Новые таржеты для iptables:
  • CHAOS: randomly use REJECT, DELUDE or TARPIT targets. This will fool network scanners by returning random results
  • DELUDE: always reply to a SYN by a SYN-ACK. This will fool TCP half-open discovery
  • DHCPADDR: replace a MAC address from and to a VMware host
  • IPMARK: mark a packet, based on its IP address
  • LOGMARK: log packet and mark to syslog
  • SYSRQ: trigger a sysreq over the network (sending a saK over the network looks like a real funny idea ;)
  • TARPIT: try to slow down (or DoS) remote host by capturing the session and holding it for a long time, using a 0-bytes TCP window. Run that on port 25 if you have no mail server to slow down spammers ;)

Новые совпадения (matches) для iptables:
  • condition: match on boolean value stored in /proc/net/nf_condition/name
  • dhcpaddr: match the DHCP Client Host address in a DHCP message
  • fuzzy: match a rate limit based on a fuzzy logic controller
  • geoip: match a packet by its source or destination country
  • ipp2p: match (certain) p2p protocols
  • portscan: try to match port scanners based on packet contents
  • quota2: named counters

четвер, 4 червня 2009 р.

Как настроить шейпер на локальную сеть, с корректным/справедливым делением входящего и исходящего трафика?

Вместо предисловия.
Задача, для простых конфигураций, состоит из двух этапов решения.
В качестве препроцессора для формирования tc будем использовать tcng. Категорически советую общественности наконец обратить внимание на этот замечательный инструментарий.
Как правило задача ограничить ширину канала из Интернета к локальным хостам не вызывает особых проблем, ведь этот трафик для сервера, по отношению к клиентским хостам, определяется как egress. В основном "мучения" наступают когда надо ограничить ширину канала из локалки в Интернет. Ниже мы постараемся решить и эту небольшую проблему.

Вводные данные.
Пусть ISP на eth0 - 100Мбит/с, и на нём поднимается ppp0. Пропускная способность ppp0 - 1Мбит/с . Локалка eth1 - 100Мбит/с.
Предположим, что ip адрес выданный провайдером на ppp0 - 100.100.100.100, а на eth1 поднят адрес 10.100.1.1/24. В локальной сети есть четыре привилегированных адреса (10.100.1.254, 10.100.1.253, 10.100.1.252 и 10.100.1.251) на которых поровну делится половина канала в Интернет (512Кбит/с по 128Кбит/с на каждый хост), остальные хосты в сети работают на второй половине канала (512Кбит/с) и нас особо не интересует как они между собой поделят эту скорость.

Первый этап решения.
Описываем правила iptables для трафика приходящего к нам из локалки и уходящий в Интернет:
Код:
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
[0:0] -A PREROUTING -s 10.100.1.254/32 -j MARK --set-xmark 1001
[0:0] -A PREROUTING -s 10.100.1.254/32 -j RETURN
[0:0] -A PREROUTING -s 10.100.1.253/32 -j MARK --set-xmark 2002
[0:0] -A PREROUTING -s 10.100.1.253/32 -j RETURN
[0:0] -A PREROUTING -s 10.100.1.252/32 -j MARK --set-xmark 3003
[0:0] -A PREROUTING -s 10.100.1.252/32 -j RETURN
[0:0] -A PREROUTING -s 10.100.1.251/32 -j MARK --set-xmark 4004
[0:0] -A PREROUTING -s 10.100.1.251/32 -j RETURN
COMMIT
В приведенном примере трафик маркируется в PREROUTING, хотя это транзитный трафик и его с таким же успехом можно промаркировать в цепочке FORWARD таблицы mangle.

Дальше, рисуем скрипт для tcng:
Код:
#define IFACE0  ppp0
#define LOCALRT 102400
#define RATE    1024
#define R2Q     7

$rate01 = (RATE/2)/4;
$rate02 = (RATE/2)/4;
$rate03 = (RATE/2)/4;
$rate04 = (RATE/2)/4;
$rate_other = RATE/2;

dev IFACE0 {
egress {
class (<$mark01>)       if meta_nfmark==1001;
class (<$mark02>)       if meta_nfmark==2002;
class (<$mark03>)       if meta_nfmark==3003;
class (<$mark04>)       if meta_nfmark==4004;
class (<$low>)          if 1;
htb ( rate LOCALRT kbps, r2q R2Q ) {
class ( rate RATE kbps ) {
$mark01 = class ( rate $rate01 kbps ) { sfq(); }
$mark02 = class ( rate $rate02 kbps ) { sfq(); }
$mark03 = class ( rate $rate03 kbps ) { sfq(); }
$mark04 = class ( rate $rate04 kbps ) { sfq(); }
$low = class ( rate $rate_other kbps ) { sfq(); }
}
}
}
}
Преобразуем скрипт tcng в правила tc:
Код:
$ tcng -r linuxforum.ru-topic-79544.ppp0.tcc
tc qdisc del dev ppp0 root
tc qdisc del dev ppp0 ingress

# ================================ Device ppp0 ================================

tc qdisc add dev ppp0 handle 1:0 root dsmark indices 8 default_index 0
tc qdisc add dev ppp0 handle 2:0 parent 1:0 htb r2q 7
tc class add dev ppp0 parent 2:0 classid 2:1 htb rate 128000bps
tc class add dev ppp0 parent 2:1 classid 2:2 htb rate 16000bps
tc qdisc add dev ppp0 handle 3:0 parent 2:2 sfq
tc class add dev ppp0 parent 2:1 classid 2:3 htb rate 16000bps
tc qdisc add dev ppp0 handle 4:0 parent 2:3 sfq
tc class add dev ppp0 parent 2:1 classid 2:4 htb rate 16000bps
tc qdisc add dev ppp0 handle 5:0 parent 2:4 sfq
tc class add dev ppp0 parent 2:1 classid 2:5 htb rate 16000bps
tc qdisc add dev ppp0 handle 6:0 parent 2:5 sfq
tc class add dev ppp0 parent 2:1 classid 2:6 htb rate 64000bps
tc qdisc add dev ppp0 handle 7:0 parent 2:6 sfq
tc filter add dev ppp0 parent 2:0 protocol all prio 1 tcindex mask 0x7 shift 0
tc filter add dev ppp0 parent 2:0 protocol all prio 1 handle 5 tcindex classid 2:6
tc filter add dev ppp0 parent 2:0 protocol all prio 1 handle 4 tcindex classid 2:5
tc filter add dev ppp0 parent 2:0 protocol all prio 1 handle 3 tcindex classid 2:4
tc filter add dev ppp0 parent 2:0 protocol all prio 1 handle 2 tcindex classid 2:3
tc filter add dev ppp0 parent 2:0 protocol all prio 1 handle 1 tcindex classid 2:2
tc filter add dev ppp0 parent 1:0 protocol all prio 1 handle 1001 fw classid 1:1
tc filter add dev ppp0 parent 1:0 protocol all prio 1 handle 2002 fw classid 1:2
tc filter add dev ppp0 parent 1:0 protocol all prio 1 handle 3003 fw classid 1:3
tc filter add dev ppp0 parent 1:0 protocol all prio 1 handle 4004 fw classid 1:4
tc filter add dev ppp0 parent 1:0 protocol all prio 2 u32 match u32 0x0 0x0 at 0 classid 1:5
Что имеем на данном этапе? Спроектированный egress для интерфейса ppp0. Жёсткие ограничения в скорости установленные для наших локальных адресов 10.100.1.254, 10.100.1.253, 10.100.1.252 и 10.100.1.251. Все остальные хосты нашей сети используют остаток канала, который останется после распределения нагрузки этих хостов.

Второй этап решения.
Рисуем скрипт tcng для eth1:
Код:
#define IFACE0  eth1
#define LOCALRT 102400
#define RATE    1024
#define R2Q     7
#define MY_IP   10.100.1.1

$rate01 = (RATE/2)/4;
$rate02 = (RATE/2)/4;
$rate03 = (RATE/2)/4;
$rate04 = (RATE/2)/4;
$rate_other = RATE/2;

$localrate = LOCALRT-RATE;

dev IFACE0 {
egress {
class (<$local>)        if ip_src == MY_IP && ip_dst/24 == 10.100.1.0;
class (<$mark01>)       if ip_dst == 10.100.1.254;
class (<$mark02>)       if ip_dst == 10.100.1.253;
class (<$mark03>)       if ip_dst == 10.100.1.252;
class (<$mark04>)       if ip_dst == 10.100.1.251;
class (<$low>)          if ip_dst/24 == 10.100.1.0;
htb ( rate LOCALRT kbps, r2q R2Q ) {
class ( rate $localrate kbps ) {
$local = class ( rate $localrate kbps ) { sfq(); }
}
class ( rate RATE kbps ) {
$mark01 = class ( rate $rate01 kbps ) { sfq(); }
$mark02 = class ( rate $rate02 kbps ) { sfq(); }
$mark03 = class ( rate $rate03 kbps ) { sfq(); }
$mark04 = class ( rate $rate04 kbps ) { sfq(); }
$low = class ( rate $rate_other kbps ) { sfq(); }
}
}
}
}
Преобразуем скрипт tcng в правила tc:
Код:
$ tcng -r linuxforum.ru-topic-79544.eth1.tcc
tc qdisc del dev eth1 root
tc qdisc del dev eth1 ingress

# ================================ Device eth1 ================================

tc qdisc add dev eth1 handle 1:0 root dsmark indices 8 default_index 0
tc qdisc add dev eth1 handle 2:0 parent 1:0 htb r2q 7
tc class add dev eth1 parent 2:0 classid 2:1 htb rate 12672000bps
tc class add dev eth1 parent 2:1 classid 2:2 htb rate 12672000bps
tc qdisc add dev eth1 handle 3:0 parent 2:2 sfq
tc class add dev eth1 parent 2:0 classid 2:3 htb rate 128000bps
tc class add dev eth1 parent 2:3 classid 2:4 htb rate 16000bps
tc qdisc add dev eth1 handle 4:0 parent 2:4 sfq
tc class add dev eth1 parent 2:3 classid 2:5 htb rate 16000bps
tc qdisc add dev eth1 handle 5:0 parent 2:5 sfq
tc class add dev eth1 parent 2:3 classid 2:6 htb rate 16000bps
tc qdisc add dev eth1 handle 6:0 parent 2:6 sfq
tc class add dev eth1 parent 2:3 classid 2:7 htb rate 16000bps
tc qdisc add dev eth1 handle 7:0 parent 2:7 sfq
tc class add dev eth1 parent 2:3 classid 2:8 htb rate 64000bps
tc qdisc add dev eth1 handle 8:0 parent 2:8 sfq
tc filter add dev eth1 parent 2:0 protocol all prio 1 tcindex mask 0x7 shift 0
tc filter add dev eth1 parent 2:0 protocol all prio 1 handle 6 tcindex classid 2:8
tc filter add dev eth1 parent 2:0 protocol all prio 1 handle 5 tcindex classid 2:7
tc filter add dev eth1 parent 2:0 protocol all prio 1 handle 4 tcindex classid 2:6
tc filter add dev eth1 parent 2:0 protocol all prio 1 handle 3 tcindex classid 2:5
tc filter add dev eth1 parent 2:0 protocol all prio 1 handle 2 tcindex classid 2:4
tc filter add dev eth1 parent 2:0 protocol all prio 1 handle 1 tcindex classid 2:2
tc filter add dev eth1 parent 1:0 protocol all prio 1 u32 match u32 0xa640101 0xffffffff at 12 match u32 0xa640100 0xffffff00 at 16 classid 1:1
tc filter add dev eth1 parent 1:0 protocol all prio 1 u32 match u32 0xa6401fe 0xffffffff at 16 classid 1:2
tc filter add dev eth1 parent 1:0 protocol all prio 1 u32 match u32 0xa6401fd 0xffffffff at 16 classid 1:3
tc filter add dev eth1 parent 1:0 protocol all prio 1 u32 match u32 0xa6401fc 0xffffffff at 16 classid 1:4
tc filter add dev eth1 parent 1:0 protocol all prio 1 u32 match u32 0xa6401fb 0xffffffff at 16 classid 1:5
tc filter add dev eth1 parent 1:0 protocol all prio 1 u32 match u32 0xa640100 0xffffff00 at 16 classid 1:6
Собственно все. Не мудрствуя лукаво мы решили поставленную задачу.

Послесловие.
Естественно, что правила в tcng можно/нужно рисовать свои условия - они индивидуальны для каждого.
Этот пример носят лишь характер "для справки" и способствуют систематизации некоторых знаний :)

О параметрах QoS. Значения dscp. (практически для Linux)

Подводя итоги к статье "Implementing Quality of Service Policies with DSCP" и скрещивая "ёжика с бегемотом", т.е. Linux с Cisco, хочу облегчить (?) труд последующим поколениям (да и себе, на случай "если забуду").

Вот некоторые сводные таблицы по терминам и значениям.
ToS Byte
Код:
┌────┬────┬────┬────┬────┬────┬─────┬─────┐
│ 1  │ 0  │ 1  │ T2 │ T1 │ T0 │ CU2 │ CU0 │
└────┴────┴────┴────┴────┴────┴─────┴─────┘
IP precedence—three bits (P2 to P0)
Delay, Throughput and Reliability—three bits (T2 to T0)
CU (Currently Unused)—two bits(CU1-CU0)
DiffServ Field
Код:
┌────┬────┬────┬────┬────┬────┬─────┬─────┐
│DS5 │DS4 │DS3 │DS2 │DS1 │DS0 │ ECN │ ECN │
└────┴────┴────┴────┴────┴────┴─────┴─────┘
DSCP—six bits (DS5-DS0)
ECN—two bits
Код:
┌────────────┬────────────────────────────────┐
│ Precedence │          Description           │
│   Level    │                                │
├────────────┼────────────────────────────────┤
│ 7          │ Stays the same (link layer and │
│            │ routing protocol keep alive)   │
├────────────┼────────────────────────────────┤
│ 6          │ Stays the same (used for IP    │
│            │ routing protocols)             │
├────────────┼────────────────────────────────┤
│ 5          │ Express Forwarding (EF)        │
├────────────┼────────────────────────────────┤
│ 4          │ Class 4                        │
├────────────┼────────────────────────────────┤
│ 3          │ Class 3                        │
├────────────┼────────────────────────────────┤
│ 2          │ Class 2                        │
├────────────┼────────────────────────────────┤
│ 1          │ Class 1                        │
├────────────┼────────────────────────────────┤
│ 0          │ Best effort                    │
└────────────┴────────────────────────────────┘
Код:
┌────────┬────────┬────────┬────────┬────────┐
│  Drop  │ Class 1│ Class 2│ Class 3│ Class 4│
│        │  CS1   │  CS2   │  CS3   │  CS4   │
├────────┼────────┼────────┼────────┼────────┤
│ Low    │ AF11   │ AF21   │ AF31   │ AF41   │
│        │ DSCP 10│ DSCP 18│ DSCP 26│ DSCP 34│
│        │ 001010 │ 010010 │ 011010 │ 100010 │
│        │ 0x0a   │ 0x12   │ 0x1a   │ 0x22   │
├────────┼────────┼────────┼────────┼────────┤
│ Medium │ AF12   │ AF 22  │ AF32   │ AF42   │
│        │ DSCP 12│ DSCP 20│ DSCP 28│ DSCP 36│
│        │ 001100 │ 010100 │ 011100 │ 100100 │
│        │ 0x0c   │ 0x14   │ 0x1c   │ 0x24   │
├────────┼────────┼────────┼────────┼────────┤
│ High   │ AF13   │ AF23   │ AF33   │ AF43   │
│        │ DSCP 14│ DSCP 22│ DSCP 30│ DSCP 38│
│        │ 001110 │ 010110 │ 011110 │ 100110 │
│        │ 0x0e   │ 0x16   │ 0x1e   │ 0x26   │
└────────┴────────┴────────┴────────┴────────┘
Подводя итог всему вышесказанному:
Код:
--set-dscp-class af11     Match packets with AF11 dscp              (001010), --set-dscp 0x0a
--set-dscp-class af12     Match packets with AF12 dscp              (001100), --set-dscp 0x0c (dec 12)
--set-dscp-class af13     Match packets with AF13 dscp              (001110), --set-dscp 0x0e (dec 14)
--set-dscp-class af21     Match packets with AF21 dscp              (010010), --set-dscp 0x12 (dec 18)
--set-dscp-class af22     Match packets with AF22 dscp              (010100), --set-dscp 0x14 (dec 20)
--set-dscp-class af23     Match packets with AF23 dscp              (010110), --set-dscp 0x16 (dec 22)
--set-dscp-class af31     Match packets with AF31 dscp              (011010), --set-dscp 0x1a (dec 26)
--set-dscp-class af32     Match packets with AF32 dscp              (011100), --set-dscp 0x1c (dec 28)
--set-dscp-class af33     Match packets with AF33 dscp              (011110), --set-dscp 0x1e (dec 30)
--set-dscp-class af41     Match packets with AF41 dscp              (100010), --set-dscp 0x22 (dec 34)
--set-dscp-class af42     Match packets with AF42 dscp              (100100), --set-dscp 0x24 (dec 36)
--set-dscp-class af43     Match packets with AF43 dscp              (100110), --set-dscp 0x26 (dec 38)
--set-dscp-class cs0      Match packets with default dscp           (000000), --set-dscp 0x00 (dec 00)
--set-dscp-class cs1      Match packets with CS1(precedence 1) dscp (001000), --set-dscp 0x08 (dec 08)
--set-dscp-class cs2      Match packets with CS2(precedence 2) dscp (010000), --set-dscp 0x10 (dec 16)
--set-dscp-class cs3      Match packets with CS3(precedence 3) dscp (011000), --set-dscp 0x18 (dec 24)
--set-dscp-class cs4      Match packets with CS4(precedence 4) dscp (100000), --set-dscp 0x20 (dec 32)
--set-dscp-class cs5      Match packets with CS5(precedence 5) dscp (101000), --set-dscp 0x28 (dec 40)
--set-dscp-class cs6      Match packets with CS6(precedence 6) dscp (110000), --set-dscp 0x30 (dec 48)
--set-dscp-class cs7      Match packets with CS7(precedence 7) dscp (111000), --set-dscp 0x38 (dec 56)
--set-dscp-class ef       Match packets with EF dscp                (101110), --set-dscp 0x2e (dec 46)

Задействуем функционал QoS (ToS) (решение для Linux)

Собственно, в связи с тем, что сеть Датасвит поддерживает функционал QoS:
Цитата:
Сообщение от Fire Посмотреть сообщение
DSCP to 802.1p
IP TOS Precedence to Priority Queue Mapping
802.1P Priority to Priority Queue Mapping
TOS/Differentiated Service Enable
Flow Control
Port Priority
Попытаться реализовать "под себя" этот функционал можно переопределив значения поля DSCP, через iptables в таблице mangle:
Код:
*mangle
:PREROUTING ACCEPT [178941:94642599]
:INPUT ACCEPT [121227:85510027]
:FORWARD ACCEPT [18238:2053107]
:OUTPUT ACCEPT [126752:85537218]
:POSTROUTING ACCEPT [133655:86846914]
[0:0] -A INPUT -j DSCP --set-dscp 0x0a
[0:0] -A INPUT -p gre -j DSCP --set-dscp 0x2e
[0:0] -A INPUT -p icmp -m icmp --icmp-type any -j DSCP --set-dscp 0x1a
[0:0] -A INPUT -p tcp -m tcp --dport 80 -j DSCP --set-dscp 0x22
[0:0] -A INPUT -p tcp -m tcp --dport 22 -j DSCP --set-dscp 0x24
[0:0] -A FORWARD -j DSCP --set-dscp 0x0a
[0:0] -A FORWARD -j DSCP --set-dscp 0x0a
[0:0] -A FORWARD -p gre -j DSCP --set-dscp 0x2e
[0:0] -A FORWARD -p gre -j DSCP --set-dscp 0x2e
[0:0] -A FORWARD -p icmp -m icmp --icmp-type any -j DSCP --set-dscp 0x1a
[0:0] -A FORWARD -p icmp -m icmp --icmp-type any -j DSCP --set-dscp 0x1a
[0:0] -A FORWARD -p tcp -m tcp --dport 80 -j DSCP --set-dscp 0x22
[0:0] -A FORWARD -p tcp -m tcp --sport 80 -j DSCP --set-dscp 0x22
[0:0] -A FORWARD -p tcp -m tcp --dport 8085 -j DSCP --set-dscp 0x2e
[0:0] -A FORWARD -p tcp -m tcp --sport 8085 -j DSCP --set-dscp 0x2e
[0:0] -A FORWARD -p tcp -m tcp --dport 22 -j DSCP --set-dscp 0x24
[0:0] -A FORWARD -p tcp -m tcp --sport 22 -j DSCP --set-dscp 0x24
[0:0] -A OUTPUT -j DSCP --set-dscp 0x0a
[0:0] -A OUTPUT -p gre -j DSCP --set-dscp 0x2e
[0:0] -A OUTPUT -p icmp -m icmp --icmp-type any -j DSCP --set-dscp 0x1a
[0:0] -A OUTPUT -p tcp -m tcp --sport 80 -j DSCP --set-dscp 0x22
[0:0] -A OUTPUT -p tcp -m tcp --sport 22 -j DSCP --set-dscp 0x24
[0:0] -A OUTPUT -p udp -m udp --sport 4569 -j DSCP --set-dscp 0x2e
[0:0] -A OUTPUT -p udp -m udp --sport 10000:20000 -j DSCP --set-dscp 0x2e
[0:0] -A OUTPUT -p udp -m udp --sport 5060 -j DSCP --set-dscp 0x18
Если у Вас всего один компьютер, то определять цепочку FORWARD не нужно.
Ну и, естественно, что значения поля dscp и условия для его установки могут отличаться от предложенных выше. На вкус и цвет, как говориться... ;) Только помните, что если весь Ваш поток "закинуть" в EF, то он перестанет быть "гарантированным", надеюсь понимаете почему? ;)
Отдельно хочется отметить, что инструкция -j DSCP --set-dscp не является терминирующей, как DROP, ACCEPT или REJECT, поэтому наиболее общие условия для установки DSCP необходимо описывать раньше, чем частные решения.

PS: Ну и опять таки - это не панацея от всех бед, а лишь один из кирпичиков в Вашем тетрисе :)