Avatar billede emmek Nybegynder
13. april 2004 - 16:24 Der 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?

/Steffen
Avatar billede strych9 Praktikant
13. april 2004 - 19:56 #1
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.
Avatar billede emmek Nybegynder
13. april 2004 - 20:23 #2
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.

Nogen tanker omkring dette?
Avatar billede strych9 Praktikant
13. april 2004 - 20:36 #3
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.

Det er et interessant problem..
Avatar billede strych9 Praktikant
13. april 2004 - 20:44 #4
ok, jeg er 99% sikker på at svaret står et sted i den her http://lartc.org/lartc.html

Er også ret sikker på at du ikke behøver at skifte til bsd.

Samtidig får du nok også brug for den her: http://www.linuxjournal.com/article.php?sid=7291&mode=thread&order=0

Jeg vil i hvert fald begynde at pløje dem igennem nu :)
Avatar billede emmek Nybegynder
13. april 2004 - 21:50 #5
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å?
Avatar billede the_email Nybegynder
13. april 2004 - 22:05 #6
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"
Avatar billede strych9 Praktikant
13. april 2004 - 22:07 #7
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.
Avatar billede strych9 Praktikant
13. april 2004 - 22:18 #8
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.
Avatar billede emmek Nybegynder
14. april 2004 - 07:36 #9
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..
Avatar billede emmek Nybegynder
14. april 2004 - 17:58 #10
Ok.. fatter det vist ikke det her..

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..

Er nogen af jer klogere end mig?

/Steffen
Avatar billede strych9 Praktikant
14. april 2004 - 18:22 #11
hmm jeg ved det ikke. Jeg har desværre ikke 2 subnet at slutte den her maskine til, så jeg kan ikke teste efter.
Avatar billede emmek Nybegynder
14. april 2004 - 18:34 #12
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?
Avatar billede strych9 Praktikant
14. april 2004 - 18:41 #13
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.
Avatar billede emmek Nybegynder
14. april 2004 - 19:35 #14
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)

hjælper dette?

/Steffen
Avatar billede strych9 Praktikant
14. april 2004 - 19:44 #15
ok, men det er jo spt der står.

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?
Avatar billede strych9 Praktikant
14. april 2004 - 19:45 #16
humm strike that. Det kan sgu da ikke lade sig gøre.
Avatar billede strych9 Praktikant
14. april 2004 - 19:50 #17
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester