Zwei kernel patches für netfilter (traffic shaping)

Ghost

Neuer User
Mitglied seit
27 Apr 2005
Beiträge
77
Punkte für Reaktionen
0
Punkte
6
Hi,

damit man ipp2p ordentlich benutzen kann, benötigt man "connection tracking mark" support im kernel ist ja auch auf der ipp2p webpage so beschrieben.

Da ich es damit dann aber immer noch nicht geschafft hatte irgendwie das TOS bit früh genug zu setzen (vor dem Traffic Shaper der Box), hab ich den CONNMARK match nen bissel umgebaut (zweiter patch), so dass dieser direkt das TOS bit passend setzen kann. Ansonsten ging das erst innerhalb der POSTROUTING queue in der mangle Table.. das ist aber definitiv zu spät.. und zeigt keinerlei Wirkung auf das Traffic Shaping.

Mit beiden patches von mir funktioniert das Traffic Shaping hier recht gut in Verbindung mit Amule auf dem PC.. da amule kein TOS bit setzen kann, macht das nun iptables auf der Fritzbox.. mit den passenden Regeln.. meine sind da:
Code:
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
iptables -t mangle -A PREROUTING -m ipp2p --edk --winmx -j MARK --set-mark 0x8002
iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
Wenn also beim --set-mark das bit 0x8000 gesetzt ist, dann wird das untere byte als TOS (type of service) verwendet (hier also 2.. was minimize cost entspricht..)

Für andere Filesharing Tools muss man den iptables aufruf mit dem -m ipp2p entsprechend ändern (--edk --winmx) .. kann man auf der ipp2p webseite anschauen, was es sonst noch so gibt.

und in der ar7.cfg hab ich dann sowas:
Code:
                        name = "Fritz!Box";
                        limiters {
                                name = "default-out";
                                bps_limit {
                                        limit_total = 100;
                                        limit_p0 = 95;
                                        limit_p1 = 60;
                                        limit_p2 = 60;
                                        limit_p3 = 0;
                                }
und
Code:
                        out_rules {
                                name = "minimize delay";
                                filter = "ip[1] = 0x10";
                                priority = 3;
                                limiters = "default-out";
                        } {
                                name = "minimize cost";
                                filter = "ip[1] = 2";
                                priority = 0;
                                limiters = "default-out";
                        } {
                                name = "fon-rtp (maximize throughput)";
                                filter = "ip[1] = 8 or udp[8] = 0x80 or udp por
 5060";
                                priority = 3;
                                limiters = "default-out";
                        } {
                                name = "download-tcp-ack";
                                filter = "tcp and (len <= 64)";
                                priority = 2;
                                limiters = "default-out";
                        } {
                                name = "dns";
                                filter = "udp port 53";
                                priority = 2;
                                limiters = "default-out";
                        } {
                                name = "remote";
                                filter = "tcp and (port 23 or port 22 or port 3
89)";
                                priority = 1;
                                limiters = "default-out";
                        } {
                                name = "http-get/put-requests and https";
                                filter = "tcp[32:4] = 0x47455420 or tcp[32:4] =
0x50555420 or tcp dst port 443";
                                priority = 2;
                                limiters = "default-out";
                        } {
                                name = "email";
                                filter = "tcp and (dst port 110 or dst port 995
";
                                priority = 2;
                                limiters = "default-out";
                        } {
                                name = "pri-out";
                                filter = "icmp";
                                priority = 2;
                                limiters = "default-out";
                        } {
                                name = "default";
                                filter = "";
                                priority = 1;
                                limiters = "default-out";
                        }

Damit kann ich hier trotz vollem upload in Amule nebenbei surfen und telefonieren.. allerdings sollte man es wie ja schon bekannt mit der maximalen Anzahl an Verbindungen nicht übertreiben. (hier auf 200... ggf. noch niedriger setzen)

Achso.. ich hab da noch diesen "minimize delay" eintrag drinn.. damit kann man ggf. in iptables noch nach beliebigen kriterien durch setzen des TOS bits auf 0x10 pakete priorisieren (selbe stufe wie Telefonie) .. wenn man z.B. von einem Rechner in seinem Netz immer mit max priorität ins Netz möchte, so kann man dann sowas machen
Code:
iptables -t mangle -A PREROUTING -s 192.168.0.24 -j TOS --set-tos 16

Ansonsten wäre da noch das ip[1] = 8 beim "fon-rtp" .. um zu erreichen, dass die fritzbox selber bei den rtp sip paketen das TOS bit auf 8 setzt musste ich hier im WebIf der Box unter Telefonie->Internettelefonie->Erweiterte Einstellungen das "SIP-Pakete kennzeichnen" und "RTP-Pakete kennzeichnen" auf den Wert 2 setzen.. (hier auf der 7050 Software 14.03.101 bzw. 14.04.01) keine Ahnung ob das bei den neuen Versionen auch so ist.. auf jedenfall kann man das mit dem FritzBox Paketmitschnitt und Ethereal überprüfen. Das ganze sollte aber eigentlich nicht nötig sein, da die Erkennung der Pakete ja auch über dieses udp[8] = 0x80 gemacht wird.

Eventuell wirds ja dann in den dsmod eingebaut..

cya
 

Anhänge

  • 315-netfilter-connmark.patch.bz2
    3.3 KB · Aufrufe: 21
  • 320-netfilter-connmark_set_tos.patch.bz2
    1 KB · Aufrufe: 16
Zuletzt bearbeitet:
Schöne Arbeit! Vielen Dank für die ausführliche Erklärung. Verändert dein Patch das Standard-Verhalten von iptables? Wenn nicht würde ich die Patches gerne in den ds-mod übernehmen.

Mfg,
danisahne
 
Hi,

nein es ändert nichts am standard Verhalten von iptables.. ist einfach nur der zusätzliche CONNMARK target/match.. der ist auch in älteren Versionen von patch-o-matic drinn..(ich hab den aus "20050918").

Und halt diese Erweiterung, damit das TOS bit direkt von dem CONNMARK kram gesetzt wird. (normalerweise setzt das in den Paketen nur so interne iptables marks... diese kann aber der Fritzbox Traffic Shaper nicht benutzen)

Mein erster Versuch mit dem standard CONNMARK netfilter sah so aus (das ist in etwa das, was man auf der ipp2p Webpage auch findet):
Code:
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
iptables -t mangle -A PREROUTING -m ipp2p --edk --winmx -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
iptables -t mangle -A POSTROUTING -m mark --mark 1 -j TOS --set-tos 2

Das sah auch im Paketmitschnitt der Fritzbox beim anschauen mit Ethereal gut aus (sprich das TOS bit 0x02 ist gesetzt).. aber zeigte keinerlei Wirkung auf das Traffic Shaping der Box... das setzen vom TOS direkt in der PREROUTING chain klappte auch nicht.. da wurden dann nicht alle Pakete mit dem TOS bit markiert.

Sprich wenn man die extension verwendet kann man die Pakete nachher mit iptables regeln über das tos bit und über die mark matchen.. sofern in der Ursprungs mark das bit 0x8000 gesetzt war. (z.B. iptables -t mangle -A POSTROUTING -m mark --mark 0x8002 -J DROP .... oder iptables -t mangle -A POSTROUTING -m tos --tos 2 -J DROP)

cu
 
Zuletzt bearbeitet:
Vorläufig doch noch mal gelöscht.. muss noch was prüfen..
cya
 
Zuletzt bearbeitet:
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.