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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
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
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:
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:
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
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:
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:
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)
Offline
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:
-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
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:
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
Time (s) | Query |
---|---|
0.00012 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00084 | 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='3.14.143.149' WHERE u.id=1 |
0.00089 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.14.143.149', 1732746953) |
0.00040 | SELECT * FROM punbb_online WHERE logged<1732746653 |
0.00074 | SELECT topic_id FROM punbb_posts WHERE id=301425 |
0.00096 | SELECT id FROM punbb_posts WHERE topic_id=28616 ORDER BY posted |
0.00061 | 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.00011 | SELECT search_for, replace_with FROM punbb_censoring |
0.00082 | 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.00080 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=28616 |
Total query time: 0.00633 s |