[Rozw.] Dwa łącza markowanie pakietów - iproute2, fwmark

Serwery i sieci oparte na Slackware, wszelkiego rodzaju usługi, troubleshooting.

Moderatorzy: Moderatorzy, Administratorzy

Awatar użytkownika
olek
Moderator
Posty: 63
Rejestracja: 2004-05-22, 00:37
Lokalizacja: Warszawa
Kontakt:

[Rozw.] Dwa łącza markowanie pakietów - iproute2, fwmark

Post autor: olek » 2009-11-07, 11:28

Witam, długo minie tu nie było może ktoś jeszcze mnie pamięta :)

Mam problem z kierowaniem ruchu na dwa łącza z wykorzystaniem markowania pakietów, będę wdzięczny za pomoc lub wskazówki.

Ale do początku. Tak wygląda konfiguracja sieci PRZED całą operacją.

Kod: Zaznacz cały

interfejsy sieciowe:
root@brama:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:30:4f:24:ed:e1
          inet addr:62.xxx.xxx.126  Bcast:62.xxx.xxx.127  Mask:255.255.255.240

eth1      Link encap:Ethernet  HWaddr 00:08:02:f7:d5:cb
          inet addr:10.211.1.44  Bcast:10.211.1.255  Mask:255.255.255.0

eth2      Link encap:Ethernet  HWaddr 00:11:95:d8:61:b3
          inet addr:95.yyy.yyy.30  Bcast:95.yyy.yyy.31  Mask:255.255.255.248

bramy dla łącz:          
eth1 62.xxx.xxx.126 -> GW 62.xxx.xxx.113
eth2 95.yyy.yyy.30 -> GW 95.yyy.yyy.24

routing:
root@brama:~# ip ro
95.yyy.yyy.24/29 dev eth2  proto kernel  scope link  src 95.yyy.yyy.30
62.xxx.xxx.112/28 dev eth0  proto kernel  scope link  src 62.xxx.xxx.126
10.211.1.0/24 dev eth1  proto kernel  scope link  src 10.211.1.44
127.0.0.0/8 dev lo  scope link
default via 62.xxx.xxx.113 dev eth0  metric 1

root@brama:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
95.yyy.yyy.24    0.0.0.0         255.255.255.248 U     0      0        0 eth2
62.xxx.xxx.112  0.0.0.0         255.255.255.240 U     0      0        0 eth0
10.211.1.0      0.0.0.0         255.255.255.0   U     0      0        0 eth1
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         62.xxx.xxx.113  0.0.0.0         UG    1      0        0 eth0

ip rule:
root@brama:~# ip ru ls
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

natowanie:
root@brama:~# cat /etc/rc.d/rc.firewall | grep SNAT
$IPT -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 62.xxx.xxx.126
$IPT -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 95.yyy.yyy.30
Tak wygląda konfiguracja po dodaniu tabel T1 i T2 dla obułącz , zasad routingu i markowania pakietów.

Kod: Zaznacz cały

dodane tablice routingu T1 T2:
root@brama:~# cat /etc/iproute2/rt_tables
255     local
254     main
253     default
0       unspec
1       T1
2       T2

tablica T1 dla eth0 62.xxx.xxx.126:
root@brama:~# ip ro ls t T1
95.yyy.yyy.24/29 dev eth2  scope link
62.xxx.xxx.112/28 dev eth0  scope link  src 62.xxx.xxx.126
10.211.1.0/24 dev eth1  scope link
127.0.0.0/8 dev lo  scope link
default via 62.xxx.xxx.113 dev eth0

tablica T2 dla eth2 95.yyy.yyy.30:
root@brama:~# ip ro ls t T2
95.yyy.yyy.24/29 dev eth2  scope link  src 95.yyy.yyy.30
62.xxx.xxx.112/28 dev eth0  scope link
10.211.1.0/24 dev eth1  scope link
127.0.0.0/8 dev lo  scope link
default via 95.yyy.yyy.25 dev eth2

ip rule, m.in. mrakowanie 0x2 skierowane do tablicy T2
[ ip rule add fwmark 2 table T2 ]
root@brama:~# ip ru
0:      from all lookup local
32763:  from all fwmark 0x2 lookup T2
32764:  from 95.yyy.yyy.30 lookup T2
32765:  from 62.xxx.xxx.126 lookup T1
32766:  from all lookup main
32767:  from all lookup default

tablica main:
root@brama:~# ip ro ls t main
95.yyy.yyy.24/29 dev eth2  proto kernel  scope link  src 95.yyy.yyy.30
62.xxx.xxx.112/28 dev eth0  proto kernel  scope link  src 62.xxx.xxx.126
10.211.1.0/24 dev eth1  proto kernel  scope link  src 10.211.1.44
127.0.0.0/8 dev lo  scope link
default via 62.xxx.xxx.113 dev eth0

markowanie pakietów:
root@brama:~# cat /etc/rc.d/rc.firewall | grep CONNMARK
iptables -t mangle -A PREROUTING -m connmark --mark 2 -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -s 10.211.1.216 -j CONNMARK --set-mark 2
Opisana konfiguracja nie działa. Komputer z sieci lokalnej 10.211.1.216 nie ma dostępu do internetu, pakiety nie pojawiają się na interfejsie eth2, "giną" gdzieś za interfejsem eth1 10.211.1.44 . Po usunięciu markowania host 10.211.1.216 wychodzi przez łącze eth0.
Mogę skierować hosta 10.211.1.216 na łącze eth2 podając w nacie adres źródłowy

Kod: Zaznacz cały

iptables -t nat -A POSTROUTING -s 10.211.1.216 -j SNAT --to-source 95.yyy.yyy.30
ale wolałbym żeby działało markowanie pakietów. Podobne polecenie ale z dodaniem interfejsu wyjściowego

Kod: Zaznacz cały

iptables -t nat -A POSTROUTING -s 10.211.1.216 -o eth2 -j SNAT --to-source 95.yyy.yyy.30
już nie działa.

Samo Markowanie pakietów działa poprawnie widać przyrost markowanych pakietów

Kod: Zaznacz cały

root@brama:~# iptables -t mangle -L PREROUTING -n -v
Chain PREROUTING (policy ACCEPT 253K packets, 120M bytes)
 pkts bytes target     prot opt in     out     source               destination
  896  189K CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0           connmark match 0x2 CONNMARK restore
  762  181K CONNMARK   all  --  *      *       10.211.1.216         0.0.0.0/0           CONNMARK xset 0x2/0xffffffff
Nat tez wygląda poprawnie:

Kod: Zaznacz cały

root@brama:~# iptables -t nat -L POSTROUTING -n -v
Chain POSTROUTING (policy ACCEPT 195 packets, 10182 bytes)
 pkts bytes target     prot opt in     out     source               destination
 1669  108K SNAT       all  --  *      eth0    0.0.0.0/0            0.0.0.0/0           to:62.233.175.126
    0     0 SNAT       all  --  *      eth2    0.0.0.0/0            0.0.0.0/0           to:95.50.201.30
oczywiście po dodaniu -t nat -A POSTROUTING -s 10.211.1.216 -j SNAT --to-source 95.yyy.yyy.30 widać też ruch na eth2.

Podejrzewam że pakiety z hosta 10.211.1.216 nie są kierowane na wyjście interfejsem eth2 z powodu złych tras lub zasad routingu. Dlaczego? ... albo jak to dalej diagnozować?
Ostatnio zmieniony 2009-11-08, 22:19 przez olek, łącznie zmieniany 3 razy.
Olek
slackware 7.1, 8.1, 9.1, 10.1, 11.1, 12.2 | www.olek.waw.pl | sklep.12a.pl

Awatar użytkownika
Outlaw
Administrator
Posty: 2861
Rejestracja: 2004-06-29, 22:23
Lokalizacja: eth0
Kontakt:

Re: [Rozw.] Dwa łącza markowanie pakietów - iproute2, fwmark

Post autor: Outlaw » 2009-11-07, 19:28

Ja robie marka tak:

Kod: Zaznacz cały

$IPT -t mangle -A PREROUTING -p tcp -s 192.168.0.100/32 -j MARK --set-mark 2
Pokaż reguły routingu jakie masz wpisane.

Awatar użytkownika
olek
Moderator
Posty: 63
Rejestracja: 2004-05-22, 00:37
Lokalizacja: Warszawa
Kontakt:

Re: [Rozw.] Dwa łącza markowanie pakietów - iproute2, fwmark

Post autor: olek » 2009-11-08, 13:27

Reguły routingu są wylistowane w poście powyżej. Tutaj polecenia tworzące te reguły (zresztą skrypcik chyba jest z forum), w nazwach zmiennych jest pewna niekonsekwencja ale interfejsy zgadzają się z nr IP

Kod: Zaznacz cały

root@brama:~# cat /root/rc.route
#!/bin/bash

ip route flush t T1
ip route flush t T2

IF0="eth1"
IF1="eth0"
IF2="eth2"

IP1="62.xxx.xxx.126"
IP2="95.yyy.yyy.30"
P1="62.xxx.xxx.113"
P2="95.yyy.yyy.25"
P0_NET="10.211.1.0/24"
P1_NET="62.xxx.xxx.112/28"
P2_NET="95.yyy.yyy.24/29"


# 2 trasy do dwoch bram
ip route add $P1_NET dev $IF1 src $IP1 table T1
ip route add default via $P1 table T1
ip route add $P2_NET dev $IF2 src $IP2 table T2
ip route add default via $P2 table T2

#pakiety z sieci danego laczaa wysylamy na jego gateway
ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2

#trasa domyslna
ip route add default via $P1

#konfiguracja tablic routingu
ip rule add from $IP1 table T1
ip rule add from $IP2 table T2

#dodatkowe wpisy dla LAN
ip route add $P0_NET     dev $IF0 table T1
ip route add $P2_NET     dev $IF2 table T1
ip route add 127.0.0.0/8 dev lo   table T1
ip route add $P0_NET     dev $IF0 table T2
ip route add $P1_NET     dev $IF1 table T2
ip route add 127.0.0.0/8 dev lo   table T2

# markowanie

ip rule add fwmark 2 table T2

ip route flush cache
echo 12
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo  0 > $f
done
W międzyczasie myślałem że problemem jest FORWARD w firewallu, ale po dodaniu defaultowego ACCEPT tez nie działa to jak powinno.

Kod: Zaznacz cały

    0     0 ACCEPT     esp  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    0     0 ACCEPT     ah   --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
  283 93720 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
   26  3178 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    6   360 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
   13   712 ACCEPT     tcp  --  eth1   eth0    10.211.1.0/24        0.0.0.0/0           state NEW
   22  1947 ACCEPT     udp  --  eth1   eth0    10.211.1.0/24        0.0.0.0/0           state NEW
    6   360 ACCEPT     icmp --  eth1   eth0    10.211.1.0/24        0.0.0.0/0           state NEW
    0     0 ACCEPT     esp  --  eth1   eth0    10.211.1.0/24        0.0.0.0/0           state NEW
    0     0 ACCEPT     ah   --  eth1   eth0    10.211.1.0/24        0.0.0.0/0           state NEW
    0     0 ACCEPT     tcp  --  eth1   eth2    10.211.1.0/24        0.0.0.0/0           state NEW
    0     0 ACCEPT     udp  --  eth1   eth2    10.211.1.0/24        0.0.0.0/0           state NEW
    0     0 ACCEPT     icmp --  eth1   eth2    10.211.1.0/24        0.0.0.0/0           state NEW
    0     0 ACCEPT     esp  --  eth1   eth2    10.211.1.0/24        0.0.0.0/0           state NEW
    0     0 ACCEPT     ah   --  eth1   eth2    10.211.1.0/24        0.0.0.0/0           state NEW
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0
Też próbowałem markować przy pomocy -j MARK, efekt bez zmian.

---

Jeszcze jedno spostrzeżenie. Ruch z komputera 10.211.1.216 (próba otwarcia strony onetu).
Na interfejsie eth2 (łącze nr 2) są pakiety wychodząca z adresem ip łącza nr 1

Kod: Zaznacz cały

root@brama:~# tcpdump -i eth2 src 213.180.146.27 or dst 213.180.146.27 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth2, link-type EN10MB (Ethernet), capture size 96 bytes
13:43:57.785126 IP 62.xxx.xxx.126.56013 > 213.180.146.27.80: Flags [.], ack 3048476566, win 16425, length 0
13:43:57.785813 IP 62.xxx.xxx.126.56013 > 213.180.146.27.80: Flags [P.], ack 1, win 16425, length 395
13:43:58.081705 IP 62.xxx.xxx.126.56013 > 213.180.146.27.80: Flags [P.], ack 1, win 16425, length 395
13:43:58.682724 IP 62.xxx.xxx.126.56013 > 213.180.146.27.80: Flags [P.], ack 1, win 16425, length 395

[...]
a na interfejsie eth0 (łącze nr 1) pojawia się jeden pakiet wychodzący i pakiety przychodzace

Kod: Zaznacz cały

root@brama:/etc/rc.d# tcpdump -i eth0 src 213.180.146.27 or dst 213.180.146.27 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
13:43:57.776128 IP 62.xxx.xxx.126.56013 > 213.180.146.27.80: Flags [S], seq 2944183871, win 8192, options [mss 1460,nop,wscale 2,n                       op,nop,sackOK], length 0
13:43:57.784681 IP 213.180.146.27.80 > 62.xxx.xxx.126.56013: Flags [S.], seq 3048476565, ack 2944183872, win 5840, options [mss 14                       60,nop,wscale 5], length 0
13:44:02.254721 IP 213.180.146.27.80 > 62.xxx.xxx.126.56013: Flags [S.], seq 3048476565, ack 2944183872, win 5840, options [mss 14                       60,nop,wscale 5], length 0
13:44:08.255731 IP 213.180.146.27.80 > 62.xxx.xxx.126.56013: Flags [S.], seq 3048476565, ack 2944183872, win 5840, options [mss 14                       60,nop,wscale 5], length 0

[...]
---

I jeszcze coś ruch ICMP z komputera 10.211.1.216 wychodzi przez eth0 (łącze nr 1) mimo markowania które przyrasta w tablicy mangle

Kod: Zaznacz cały

root@brama:/etc/rc.d# tcpdump -i eth0 src 213.180.146.27 or dst 213.180.146.27 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
13:57:34.882566 IP 62.xxx.xxx.126 > 213.180.146.27: ICMP echo request, id 1, seq 1121, length 40
13:57:34.891667 IP 213.180.146.27 > 62.xxx.xxx.126: ICMP echo reply, id 1, seq 1121, length 40
13:57:35.883594 IP 62.xxx.xxx.126 > 213.180.146.27: ICMP echo request, id 1, seq 1122, length 40
13:57:35.892599 IP 213.180.146.27 > 62.xxx.xxx.126: ICMP echo reply, id 1, seq 1122, length 40
13:57:36.883610 IP 62.xxx.xxx.126 > 213.180.146.27: ICMP echo request, id 1, seq 1123, length 40
13:57:36.893631 IP 213.180.146.27 > 62.xxx.xxx.126: ICMP echo reply, id 1, seq 1123, length 40
13:57:37.883641 IP 62.xxx.xxx.126 > 213.180.146.27: ICMP echo request, id 1, seq 1124, length 40
13:57:37.892604 IP 213.180.146.27 > 62.xxx.xxx.126: ICMP echo reply, id 1, seq 1124, length 40


root@brama:/etc/rc.d# tcpdump -i eth2 src 213.180.146.27 or dst 213.180.146.27 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth2, link-type EN10MB (Ethernet), capture size 96 bytes
po usunięciu wpisu w tablicy routingu main domyslnego gw

Kod: Zaznacz cały

route del default gw 62.xxx.xxx.113
ruch ICMP też zamiera (tak jak TCP). Pozostają wpisy default gw w tablicach T1 i T2 ale widać że nie działają.
Ostatnio zmieniony 2009-11-08, 14:57 przez olek, łącznie zmieniany 7 razy.
Olek
slackware 7.1, 8.1, 9.1, 10.1, 11.1, 12.2 | www.olek.waw.pl | sklep.12a.pl

Awatar użytkownika
matryc
Użytkownik
Posty: 74
Rejestracja: 2005-10-30, 09:51
Lokalizacja: Dąbrowa Tarnowska

Re: [Rozw.] Dwa łącza markowanie pakietów - iproute2, fwmark

Post autor: matryc » 2009-11-08, 17:18

Witam!!
Jeśli chesz wrzucić konkretne IP do innej tablicy to:

Kod: Zaznacz cały

ip rule add prio 1001 from 10.211.1.216 table T2
Ja znacze pakiety jesli dotyczą określonych portów i wrzucam właśnie za pomocą fwmark np.:

Kod: Zaznacz cały

iptables -t mangle -A PREROUTING -i eth1 -p icmp -s 10.211.1.216 -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -i eth1 -p tcp -s 10.211.1.216 --dport 80 -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -i eth1 -p udp -s 10.211.1.216 --dport 80 -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -m mark --mark 0x2 -j CONNMARK --save-mark

Awatar użytkownika
olek
Moderator
Posty: 63
Rejestracja: 2004-05-22, 00:37
Lokalizacja: Warszawa
Kontakt:

Re: [Rozw.] Dwa łącza markowanie pakietów - iproute2, fwmark

Post autor: olek » 2009-11-08, 22:17

matryc, dziekuję pomogła zmiana sposobu markowania

Swoją drogą ciekawe dlaczego poprzednio nie działało? Sposób markowania który stosowałem był wymieniany w sieci wiele razy.
Olek
slackware 7.1, 8.1, 9.1, 10.1, 11.1, 12.2 | www.olek.waw.pl | sklep.12a.pl

ODPOWIEDZ