Policy routing med pf paa tvaers af ISPer

From: Michael Knudsen (none@e--molioner.dk.lh.bsd-dk.dk)
Date: Tue 12 Oct 2004 - 02:23:03 CEST


Date: Tue, 12 Oct 2004 02:23:03 +0200
From: Michael Knudsen <none@e--molioner.dk.lh.bsd-dk.dk>
To: bsd-dk@bsd-dk.dk
Subject: Policy routing med pf paa tvaers af ISPer

Hej paa listen,

en kammerat har to ADSL-forbindelser, Cybercity (default) og TDC, til
sin desktopcomputer derhjemme, og han ville naturligvis gerne kunne
udnytte begge forbindelser. De to forbindelser er forbundet til
computeren gennem eet netkort, og dette er den eneste computer, der skal
anvende disse to forbindelser.

Paa grund af egress-filtering kunne vi ikke blot bruge alm.
route-to/round-robin loadbalancing. Vi endte i stedet med at lave en
noget mere manuel loesning, hvor vi valgte hvilke services, der skulle
anvende en givet forbindelse. Pakker, der ikke skulle over default
route, blev tagget, og til sidst blev pakker med dette tag manuelt
routet over den alternative forbindelse.

For ogsaa at kunne udnytte begge forbindelser til indkommende
forbindelser maatte vi ogsaa handtere disse korrekt og saette routing op
for disse.

Til sidst havde vi et regelsaet i stil med foelgende:

# Macroer
ext_if="xl0"

cc_ip="noget"
cc_gw="andet"
tdc_ip="tredie"
tdc_gw="fjerde"
bekendt="femte"

#
# NAT og redirection
#

nat on $ext_if inet proto tcp from any to any \
        port {22,25,6667} tag TDC -> $tdc_ip

nat on $etc_if from from any to $bekendt tag TDC -> $tdc_ip

#
# Indkommende trafik (default deny)
#

block in on $ext_if

pass in on $ext_if proto tcp from any to $cc_ip \
        port {ssh,smtp,www,https} flags S/SA modulate state

pass in on $ext_if proto icmp all icmp-type echoreq keep state

# Haandtér routing af forbindelser via TDC

pass in on $ext_if reply-to ($ext_if $tdc_gw) inet proto icmp \
        from any to $tdc_ip keep state

pass in on $ext_if reply-to ($ext_if $tdc_gw) proto tcp \
        from any to $tdc_ip port {ssh,smtp,www,https} \
        flags S/SA modulate state

#
# Udgaaende trafik
#

pass out on $ext_if route-to ($ext_if $tdc_gw) proto tcp all \
        tagged TDC modulate state

pass out on $ext_if route-to ($ext_if $tdc_gw) proto {udp,icmp} \
        all tagged TDC keep state

#
# Slut paa regelsaet
#

Der er vist ikke saa meget at forklare, udover at pakker, der matcher en
nat-regel, bliver skrevet om, tagget og til sidst sendt videre til den
alternative router. Brug af tagging gjorde, at vi ikke behoevede at lave
en pass-regel per nat-regel, og det goer det nemt at vedligeholde
regelsaettet.

Det er naturligvis temmeligt uelegant at lave NAT af lokal trafik, og
der skal nok sidde nogle NAT-hadere og IPv6-fanatikere, der ryster paa
hovedet, men der er mig bekendt ingen anden udvej, naar ISPerne benytter
egress filtering. Der var ingen maerkbar forskel i latens, men havde vi
placeret de sidste to pass-regler som de foerste i filtreringsafsnittet
og gjort dem til `quick'-regler (saa evaulering af regelsaettet for
pakken afsluttes med det samme), havde vi kunnet reducere
performancetabet.

Mvh. Michael.

-- 
Winter meant the coming of the lazy wind, which couldn't be bothered to
blow around people and blew right through them instead.
-- (Terry Pratchett, Wyrd Sisters)



This archive was generated by hypermail 2b30 : Wed 15 Nov 2006 - 18:24:44 CET