13. april 2004 - 16:24Der er
16 kommentarer og 1 løsning
Routning på baggrund af portnumre
Hejsa!
Jeg har en debian linux router med 3 netkort; IF0 er 2mbit DSL, IF2 er 1mbit kabel og IF1 er LAN. kabel er forbrugsafregnet, og primært tænkt som en redundant forbindelse. Jeg overvejer dog om ikke jeg kan bruge den til Low Latency formål, i det den typisk vil være ubrugt. Mere specifikt, ønsker jeg at route spil-trafik, ssh trafik og ip-telefoni trafik ud over kabel forbindelsen. Dette kræver (så vidt jeg kan se) at der routes på baggrund af portnumre.
Kan dette lade sig gøre i linux, eller skal jeg skifte til FreeBSD?
Hvis det blot var til kendte subnets så kunne du bruge route kommandoen i stil med route add -net 12.0.0.0 netmask 255.0.0.0 dev if1 for at bestemme hvilket interface den skal gå ud af.
Men for at få traffik til diverse porte til at blive spyttet ud af et bestemt interface kan route kommandoen ikke bruges. Til gengæld vil jeg mene at hvis du ved præcist hvilke porte det drejer sig om må du kunne benytte iptables. I iptables er der et target der hedder Redirect, hvor du kan sende trafik med en vis karakteristik over til en anden chain, og derved tvinge trafikken ud gennem et bestemt interface.
Jeg troede ellers at redirect kun kunne bruges med nat, når der nattes mellem ekstern port og intern.. (212.10.10.10:23 -> 10.0.0.1:80) eksempelvis nattes port 23 trafik til port 80..
Jeg er ved at snuse lidt til og bruge ip rule add fwmark X table Y hvor Y tabellen kun indeholder ruten til kabel forbindelsen. Herefter benyttes iptables til at markere alt LL trafik med fwmark 10.
Det er rigtigt at redirect target kun kan benyttes i nat tables. Jeg sidder og læser man sider ligenu. Måske bliver jeg nødt til at trække det forslag tilbage.. I mangle table kan du bruge MARK target som et workaround og senere filtrere på det vil jeg tro.
Men problemet, helt grundlæggende, er vel at der skal bruges 2 router tabeller.
umiddelbart ville jeg mene at min egen løsning med "ip rule add fwmark X table Y" osv. burde virke.. Det gør det bare ikke.. er der nogen måde man kan teste at fwmark virker på?
Jeg kunne forstille mig at det kan være et problem at få en klient til at bruge begge forbindelser til forskellige ting, da den har en veldefineret IP-adresse som "broadcast-address"
Jeg tror det er lige præcist følgende du leder efter. En kombination af iproute og iptables fra Chap 11 i den howto:
As an example, this command marks all packets destined for port 25, outgoing mail:
# iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 25 \ -j MARK --set-mark 1
Let's say that we have multiple connections, one that is fast (and expensive, per megabyte) and one that is slower, but flat fee. We would most certainly like outgoing mail to go via the cheap route.
We've already marked the packets with a '1', we now instruct the routing policy database to act on this:
# echo 201 mail.out >> /etc/iproute2/rt_tables # ip rule add fwmark 1 table mail.out # ip rule ls 0: from all lookup local 32764: from all fwmark 1 lookup mail.out 32766: from all lookup main 32767: from all lookup default
Now we generate a route to the slow but cheap link in the mail.out table:
# /sbin/ip route add default via 195.96.98.253 dev ppp0 table mail.out
And we are done. Should we want to make exceptions, there are lots of ways to achieve this. We can modify the netfilter statement to exclude certain hosts, or we can insert a rule with a lower priority that points to the main table for our excepted hosts.
Og forresten: Note: to mark packets, you need to have some options enabled in your kernel: IP: advanced router (CONFIG_IP_ADVANCED_ROUTER) [Y/n/?] IP: policy routing (CONFIG_IP_MULTIPLE_TABLES) [Y/n/?] IP: use netfilter MARK value as routing key (CONFIG_IP_ROUTE_FWMARK) [Y/n/?]
the_email-> Broadcast adressen spiller ingen rolle med hensyn til routing. Man bruger ARP broadcasts til at finde MAC adresser, og visse protokoller som feks netbios synes at det er smart at bruge broadcast, men det er enten et niveau over eller under OSI modellens Transport og Network layers hvor IP routing beslutninger primært tages.
ja, det var også det jeg snakkede om.. Men det virker simpelthen ikke.. Jeg tror at jeg vil prøve og mangle pakkernes TOS felt, og lade ip rule matche på dette i stedet for. Men det bliver vist først senere i dag..
Har sat flg. routes op.. stsoekris:~# ip route list table main 195.249.9.218 dev ppp0 proto kernel scope link src 80.199.19.216 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.2 62.107.0.0/19 dev eth2 proto kernel scope link src 62.107.24.162 default via 195.249.9.218 dev ppp0 stsoekris:~# stsoekris:~# stsoekris:~# ip route list table 201 195.249.9.218 dev ppp0 proto kernel scope link src 80.199.19.216 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.2 62.107.0.0/19 dev eth2 proto kernel scope link src 62.107.24.162 default via 62.107.31.254 dev eth2 metric 20 default via 195.249.9.218 dev ppp0 metric 40
og har sat flg. regler op:
stsoekris:~# ip rule list 0: from all lookup local 32763: from 62.107.24.162 lookup 201 32764: from all tos lowdelay iif eth1 lookup 201 32765: from all to 212.10.0.0/16 iif eth1 lookup 201 32766: from all lookup main 32767: from all lookup default
og flg i iptables: stsoekris:~# iptables -L PREROUTING -t mangle Chain PREROUTING (policy ACCEPT) target prot opt source destination MARK tcp -- anywhere anywhere tcp dpt:1863 MARK set 0xa MARK tcp -- anywhere anywhere tcp dpt:4000 MARK set 0xa MARK tcp -- anywhere anywhere tcp dpt:6112 MARK set 0xa MARK tcp -- anywhere anywhere TOS match Maximize-Throughput MARK set 0x14 MARK tcp -- anywhere anywhere tcp spt:4662 MARK set 0x14 MARK tcp -- anywhere anywhere tcp spt:4680 MARK set 0x14 MARK all -- anywhere anywhere length 400:1600 MARK set 0x14 DSCP all -- anywhere anywhere length 400:1600 DSCP set 0x04 DSCP tcp -- anywhere anywhere tcp spt:4662 DSCP set 0x04 DSCP tcp -- anywhere anywhere tcp spt:4680 DSCP set 0x04 MARK tcp -- anywhere anywhere tcp dpt:1863 MARK set 0xa TOS tcp -- anywhere anywhere tcp dpt:1863 TOS set Minimize-Delay MARK tcp -- anywhere anywhere tcp dpt:4000 MARK set 0xa TOS tcp -- anywhere anywhere tcp dpt:4000 TOS set Minimize-Delay MARK tcp -- anywhere anywhere tcp dpt:6112 MARK set 0xa TOS tcp -- anywhere anywhere tcp dpt:6112 TOS set Minimize-Delay MARK tcp -- anywhere anywhere TOS match Maximize-Throughput MARK set 0x14 MARK tcp -- anywhere anywhere tcp spt:4662 MARK set 0x14 MARK tcp -- anywhere anywhere tcp spt:4680 MARK set 0x14 MARK all -- anywhere anywhere length 400:1600 MARK set 0x14 DSCP all -- anywhere anywhere length 400:1600 DSCP set 0x04 DSCP tcp -- anywhere anywhere tcp spt:4662 DSCP set 0x04 DSCP tcp -- anywhere anywhere tcp spt:4680 DSCP set 0x04 MARK tcp -- anywhere anywhere tcp dpt:1863 MARK set 0xa TOS tcp -- anywhere anywhere tcp dpt:1863 TOS set Minimize-Delay MARK tcp -- anywhere anywhere tcp dpt:4000 MARK set 0xa TOS tcp -- anywhere anywhere tcp dpt:4000 TOS set Minimize-Delay MARK tcp -- anywhere anywhere tcp dpt:6112 MARK set 0xa TOS tcp -- anywhere anywhere tcp dpt:6112 TOS set Minimize-Delay MARK tcp -- anywhere anywhere TOS match Maximize-Throughput MARK set 0x14 MARK tcp -- anywhere anywhere tcp spt:4662 MARK set 0x14 MARK tcp -- anywhere anywhere tcp spt:4680 MARK set 0x14 MARK all -- anywhere anywhere length 400:1600 MARK set 0x14 DSCP all -- anywhere anywhere length 400:1600 DSCP set 0x04 DSCP tcp -- anywhere anywhere tcp spt:4662 DSCP set 0x04 DSCP tcp -- anywhere anywhere tcp spt:4680 DSCP set 0x04 TOS all -- anywhere anywhere TOS set Normal-Service TOS all -- anywhere anywhere TOS set Normal-Service MARK tcp -- anywhere anywhere tcp dpt:1863 MARK set 0xa TOS tcp -- anywhere anywhere tcp dpt:1863 TOS set Minimize-Delay MARK tcp -- anywhere anywhere tcp dpt:4000 MARK set 0xa TOS tcp -- anywhere anywhere tcp dpt:4000 TOS set Minimize-Delay MARK tcp -- anywhere anywhere tcp dpt:6112 MARK set 0xa TOS tcp -- anywhere anywhere tcp dpt:6112 TOS set Minimize-Delay MARK tcp -- anywhere anywhere TOS match Maximize-Throughput MARK set 0x14 MARK tcp -- anywhere anywhere tcp spt:4662 MARK set 0x14 MARK tcp -- anywhere anywhere tcp spt:4680 MARK set 0x14 MARK all -- anywhere anywhere length 400:1600 MARK set 0x14 DSCP all -- anywhere anywhere length 400:1600 DSCP set 0x04 DSCP tcp -- anywhere anywhere tcp spt:4662 DSCP set 0x04 DSCP tcp -- anywhere anywhere tcp spt:4680 DSCP set 0x04
Dvs. at med iptables laver jeg fwmark til 0x0a (10) på portene 1863, 6112 og 4000. Derudover laver jeg også TOS feltet om til low latency (low delay (0x10)) på samme trafik.
Med ip rule burde jeg fange ovenstående trafik og smide det i tabel 201, som er en 'kopi' af main, men hvor default gw er stofanet forbindelsen.
Det begynder og virke en smule tilfældigt det der sker, fordi noget trafik havner på pppoe forbindelsen og noget på stofanet'en..
ok, men vi er enige om at denne liste af iptables regler:
stsoekris:~# iptables -L PREROUTING -t mangle Chain PREROUTING (policy ACCEPT) target prot opt source destination TOS all -- anywhere anywhere TOS set Normal-Service MARK tcp -- anywhere anywhere tcp dpt:1863 MARK set 0xa TOS tcp -- anywhere anywhere tcp dpt:1863 TOS set Minimize-Delay MARK tcp -- anywhere anywhere tcp dpt:4000 MARK set 0xa TOS tcp -- anywhere anywhere tcp dpt:4000 TOS set Minimize-Delay MARK tcp -- anywhere anywhere tcp dpt:6112 MARK set 0xa TOS tcp -- anywhere anywhere tcp dpt:6112 TOS set Minimize-Delay MARK tcp -- anywhere anywhere TOS match Maximize-Throughput MARK set 0x14 MARK tcp -- anywhere anywhere tcp spt:4662 MARK set 0x14 MARK tcp -- anywhere anywhere tcp spt:4680 MARK set 0x14 MARK all -- anywhere anywhere length 400:1600 MARK set 0x14 DSCP all -- anywhere anywhere length 400:1600 DSCP set 0x04 DSCP tcp -- anywhere anywhere tcp spt:4662 DSCP set 0x04 DSCP tcp -- anywhere anywhere tcp spt:4680 DSCP set 0x04
burde nulstille tos i alle pakker, hvorefter den sætter tos for de pakker der har portnumrene: 1863, 6112 og 4000 ikke?
hmm ja.. og dog.. Kommer du ikke til at sætte mark flere gange på visse pakker på den måde? Der er kun et felt at benytte så den overskriver.
Forstår ikke helt hvor du vil hen med de her to MARK tcp -- anywhere anywhere tcp spt:4662 MARK set 0x14 MARK tcp -- anywhere anywhere tcp spt:4680 MARK set 0x14
Jeg tænker på om den overhovedet bibeholder mark værdier når den skifter til et andet interface. Mener vagt at kunne huske der er et eller andet der.
det betyder i bund og grund at jeg har skrevet: iptables -L PREROUTING -t mangle -p tcp --dport 4662 -j MARK --set-mark 10 iptables -L PREROUTING -t mangle -p tcp --dport 4680 -j MARK --set-mark 10
hvilket betyder at jeg giver pakker med destinationsport 4662 og 4680 en fwmark 10.
Men jeg helgarderer også, ved at bruge tos feltet til at identificere på. Først sætter jeg normal service på alle pakker. så sætter jeg min delay hvis pakken har dport 1863, 6112 og 4000, samt at jeg sætter fwmark derudover. (at jeg sætter fwmark er et lævn fra tidligere)
MARK tcp -- anywhere anywhere tcp spt:4662 MARK set 0x14
Det er vel source port ikke?
Har du nogen fornemmelse af om pakkerne går rigtigt nok ud gennem et interface, men at pakkerne som kommer tilbage fra server går til det forkerte, eller eventuelt et tilfældigt interface?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.