Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2016-05-13 07:32:40

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

[SOLVED] Dodawanie marków w iptables

Czy ktoś orientuje się tutaj w targetach CONNMARK i MARK w kwestii dodawania marków? Przykładowo, jak się używa standardowych reguł typu [b]-j MARK --set-mark 4[/b] , to są marki przepisywane i ustawiane na wartość, która widnieje w --set-mark, czyli w tym przypadku każdy dopasowany pakiet by został przepisany i jego mark by był zmieniony na 4. Problem w tym jest taki, że gdy wchodzi drugi mechanizm markujący, to się zaczynają kłopoty. xD Dlatego wymyślono te maski w tych w/w targetach ale za bardzo nie mam pojęcia jak to działa. Rozpatrzmy sobie przykład mwan3. On ma za zadanie robić load balancing/failover łącza w oparciu o marki w pakietach. Pakiety są oznaczane w iptables i kierowane do odpowiedniej tablicy routingu w oparciu o ustawiony mark. Poniżej na fotce są reguły iptables, które ten mechanizm sobie stworzył:

[img]http://i.imgur.com/LE5SWCW.png[/img]

I teraz czy ktoś potrafi powiedzieć co się dokładnie dzieje z tymi markami w przypadku gdy do filtra wpada pakiet na:

1: port 80/443
2: jakiś inny port niż te w 1

Ostatnio edytowany przez morfik (2016-05-17 21:52:42)

Offline

 

#2  2016-05-13 19:07:55

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: [SOLVED] Dodawanie marków w iptables

W sumie nadal nie wiem co się dzieje tam w tych regułach ale sam mechanizm udało się zrobić. xD Musiałem tylko podzielić markowanie na dwa etapy: przed routingiem i po routingu, tak jak to jest na tej fotce widoczne:

[img]http://i.imgur.com/MrSZogo.png[/img]

Czyli reguły od mwan3 idą w mangle do łańcuchów PREROUTING oraz OUTPUT, a moja kontrola ruchu idzie w mangle do INPUT i POSTROUTING. Można by pewnie wszystko ogarnąć w tych samych łańcuchach ale skoro można to zrobić przed i po routingu, to czemu nie. xD W efekcie moje reguły wyglądają mniej więcej tak:

Kod:

iptables -t mangle -A qos_lan -p tcp -m multiport --sports 80,443,20,21 -j MARK --set-xmark 0x0002/0x00ff

Czyli skoro mwan3 miał marki typu 0x0100/0xff00 , no to ja dałem 0x0002/0x00ff i w efekcie mamy 8 niekłócących się bitów do dyspozycji z tych 16. No i jak wman3 oznacza pakiet 0x0100/0xff00, to drukuje mark 256 (0x0100) i przy pomocy maski 0xff00 zapisuje go. Później w oparciu o ten mark leci pakiet do odpowiedniej tablicy routingu, a jak z niej wyskoczy to wpada do mojego markowania i tam jest do niego dodawany 2 (0x0002), no bo w sumie maska jest 0x00ff . W efekcie wychodzi mark 258 i to w oparciu o niego TC operuje i klasyfikuje ruch.

Jedyny problem jaki mi został, to ogarnięcie reguł TC. Nie mogę nigdzie znaleźć dokumentacji na temat składni poleceń "tc filter". Niby obecnie mam coś w stylu:

Kod:

    tc filter add dev $if_wan parent 1:0 prio 20 protocol ip handle 65282 fw classid 1:200
    tc filter add dev $if_wan parent 1:0 prio 20 protocol ip handle 514 fw classid 1:200
    tc filter add dev $if_wan parent 1:0 prio 20 protocol ip handle 258 fw classid 1:200
    tc filter add dev $if_lan parent 2:0 prio 20 protocol ip handle 65282 fw classid 2:200
    tc filter add dev $if_lan parent 2:0 prio 20 protocol ip handle 514 fw classid 2:200
    tc filter add dev $if_lan parent 2:0 prio 20 protocol ip handle 258 fw classid 2:200

Czyli dla każdego z tych 3 przypadków, tj. czy pakiet idzie przez łącze pierwszego ISP, drugiego ISP lub ruch jest równoważony, muszę pisać osobne reguły uwzględniające odpowiedni mark. Da radę tutaj tą maskę zastosować? Próbowałem tak jak w iptables, tj. 0x0002/0x00ff ale nie działa. xD Próbowałem także 0x0002 0x00ff ale też nie chciało przyjąć. Jakiś pomysł?

Offline

 

#3  2016-05-13 21:47:37

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: [SOLVED] Dodawanie marków w iptables

Zainteresuj się CONNMARK - ten markuje śledzone połączenie w tablicy CONNTRACK.

Z resztą tutaj się gimnastykowaliśmy z podobnym tematem:
https://forum.dug.net.pl/viewtopic.php?id=25070

PS:
Podobno IMQ wraca do życia:
https://github.com/imq/linuximq

PS2:
Te marki widać w /proc/net/ip_conntrack:

Kod:

iptables -t mangle -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N QOS
-A OUTPUT -o eth+ -j QOS
-A QOS -m cgroup --cgroup 1 -j MARK --set-xmark 0x1/0xffffffff
-A QOS -m cgroup --cgroup 2 -j MARK --set-xmark 0x2/0xffffffff
-A QOS -m cgroup --cgroup 3 -j MARK --set-xmark 0x3/0xffffffff
-A QOS -m cgroup --cgroup 4 -j MARK --set-xmark 0x4/0xffffffff
-A QOS -m cgroup --cgroup 5 -j MARK --set-xmark 0x5/0xffffffff
-A QOS -m cgroup --cgroup 6 -j MARK --set-xmark 0x6/0xffffffff
-A QOS -m cgroup --cgroup 7 -j MARK --set-xmark 0x7/0xffffffff
-A QOS -m cgroup --cgroup 8 -j MARK --set-xmark 0x8/0xffffffff
-A QOS -m cgroup --cgroup 9 -j MARK --set-xmark 0x9/0xffffffff
-A QOS -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff

Regułki do nich:

Kod:

iptables -t mangle -A QOS -m cgroup --cgroup 1 -j MARK --set-mark 1
iptables -t mangle -A QOS -m cgroup --cgroup 2 -j MARK --set-mark 2
iptables -t mangle -A QOS -m cgroup --cgroup 3 -j MARK --set-mark 3
iptables -t mangle -A QOS -m cgroup --cgroup 4 -j MARK --set-mark 4
iptables -t mangle -A QOS -m cgroup --cgroup 5 -j MARK --set-mark 5
iptables -t mangle -A QOS -m cgroup --cgroup 6 -j MARK --set-mark 6
iptables -t mangle -A QOS -m cgroup --cgroup 7 -j MARK --set-mark 7
iptables -t mangle -A QOS -m cgroup --cgroup 8 -j MARK --set-mark 8
iptables -t mangle -A QOS -m cgroup --cgroup 9 -j MARK --set-mark 9
iptables -t mangle -A QOS -j CONNMARK --save-mark

Pozdro

Ostatnio edytowany przez Jacekalex (2016-05-13 22:02:15)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#4  2016-05-14 10:10:17

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: [SOLVED] Dodawanie marków w iptables

Mógłbyś sprawiać chociaż pozory, że czytasz moje wypociny. xD Tu nie chodzi o samo markowanie i zapisywanie tych marków w połączeniach, bo to jest banał. Problem jest, gdy korzystasz z kilku mechanizmów markujących. W tym co ty podałeś, to zastanów się, co się stanie z markiem pakietu, który przykładowo zostanie dopasowany do dwóch z tych twoich reguł, które mają -j MARK --set-mark 1 oraz -j MARK --set-mark 2 (bez znaczenia na podstawie czego dopasowujesz). Jaki otrzymasz mark? Jeśli te te reguły będą w takiej kolejności jak podałeś, to mark=2, w odwrotnej, to mark=1. Zatem ty nie dasz rady uzyskać oznaczenia na poniższych warunkach:

- jeśli pakiet na dport 443, mark=1
- jeśli pakiet na dst 11.22.33.44, mark=2
- jeśli pakiet na dport 433 i dst 11.22.33.44, mark=?

No właśnie jaki mark? Możesz pewnie robić osobną regułę w iptables i ustawić mark=3. I to zwykle wystarcza ale nie, gdy masz kilka mechanizmów markujących, bo wtedy marki będą przepisywane i nie trafią tam, gdzie trzeba. Dlatego się korzysta z tych masek i na ich podstawie iptables potrafi marki sumować. Zatem jeśli ten 3 przypadek wyżej weźmiesz pod uwagę, to wystarczy zamaskować odpowiednie bity i nie trzeba na sztywno marka określać. To ma taką zaletę, że jak dodajesz x+2, to zawsze wynikowy mark będzie o 2 większy i na takiej podstawie możesz oznaczać dalej pakiety.

Tam w liście reguł podałeś coś w stylu:

Kod:

-j MARK --set-xmark 0x1/0xffffffff
-j MARK --set-xmark 0x2/0xffffffff

Widzisz jak wygląda tutaj maska: 0xffffffff? To powoduje, że... dokładnie nie wiem co (FIXME). xD Ale wiem, że jeśli są ustawione te wszystkie te bity, to zostanie ustawiony mark taki jak tu określiłeś. Zatem jak pakiet wpadnie i zostanie dopasowany do pierwszej reguły, zostanie mu ustawiony 0x1 ale jak wpadnie też do drugiej, to wyczyszczony zostanie ten 0x1 i nadpisany przez 0x2. Jeśli teraz byś dał maskę 0xfffffff0, czyli ostatni bit olać, to po przejściu przez obie reguły pakiet będzie miał 0x3.

Dokładnie nie wiem jak to działa ale tak to działa. xD Zobacz sobie jak u mnie wygląda cały ten mechanizm póki co: http://pastebin.com/0d4YNakR

Offline

 

#5  2016-05-17 21:50:13

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: [SOLVED] Dodawanie marków w iptables

Udało mi się rozwiązać ten problem w końcu. Weźmy se przykład pakietu, który już ma ustawiony mark, powiedzmy 0x4. Teraz ten pakiet przechodzi przez kolejną regułę w iptables, która ma ustawić kolejny mark, tym razem za pomocą reguły [b]-j MARK --set-xmark 0x100/0xff00[/b] . Schemat wygląda tak:


Kod:

       MARK 0000 0000 0000 0100    (0x4)
       MASK 1111 1111 0000 0000    (0xff00)
    AND NOT -------------------    w MASK trzeba poodwracać bity (0->1, 1->0), po czym dać logiczny AND z MARK
     RESULT 0000 0000 0000 0100    w ten sposób stary mark zawsze zostaje
  SET XMARK 0000 0001 0000 0000    (0x100)
        XOR -------------------
     RESULT 0000 0001 0000 0100

       MARK    0x104 --> 260

Czyli nie ma znaczenia jako taki uprzedni mark przy zastosowaniu odpowiedniej maski. Wartość tego poprzedniego marka zostanie po prostu dodana do wartości nowego marka. Gdyby tutaj zamiast 0x4 był 0x8, to wynikowy mark byłby 0x108, czyli 256+8=264. Dlatego te marki w iptables można sumować ze sobą, tylko trzeba pilnować maski.

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)

[ Generated in 0.008 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00012 SET CHARSET latin2
0.00007 SET NAMES latin2
0.00109 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='18.118.144.109' WHERE u.id=1
0.00061 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.118.144.109', 1732994751)
0.00036 SELECT * FROM punbb_online WHERE logged<1732994451
0.00052 SELECT topic_id FROM punbb_posts WHERE id=301450
0.00095 SELECT id FROM punbb_posts WHERE topic_id=28616 ORDER BY posted
0.00065 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=28616 AND t.moved_to IS NULL
0.00006 SELECT search_for, replace_with FROM punbb_censoring
0.00077 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=28616 ORDER BY p.id LIMIT 0,25
0.00068 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=28616
Total query time: 0.00588 s