====== Source routing con iproute2 ====== Un server dual homed su due connessioni Internet (provider A e provider B) che abbia un solo default gateway (verso il provider A), utilizza quest'ultimo per il **traffico di risposta** indipendentemente dall'interfaccia su cui è stato contattato. Questo in generale non è ciò che si desidera, inoltre il provider A potrebbe scartare il pacchetto se l'IP di origine appartiene al provider B. E’ necessario eseguire il source routing, in modo che il server contattato sull’indirizzo B risponda tramite il provider B e non sulla rotta di default. Si risolve il problema con ''**iproute2**'' creando una seconda tabella di routing. Ricordare che sono necessarie le due opzioni del kernel: ''**CONFIG_IP_ADVANCED_ROUTER=y**'' e ''**CONFIG_IP_MULTIPLE_TABLES=y**''. L'interfaccia **eth2** è quella che viene usata per il //source routing//, mentre la default route tradizionale passa per un'altra interfaccia, es. eth1. **/etc/iproute2/rt_tables** # reserved values # 255 local 254 main 253 default 0 unspec # # local # 1 inr.ruhep # # Special table for source routing. # See /etc/network/interfaces. 102 eth2_tbl Il file diventa operativo appena modificato. **/etc/network/interfaces** auto eth2 iface eth2 inet static address 217.19.150.6 netmask 255.255.255.0 network 217.19.150.0 broadcast 217.19.150.255 # gateway 217.19.150.1 # Put a line "102 eth2_tbl" into /etc/iproute2/rt_tables up /sbin/ip rule add from 217.19.150.6 table eth2_tbl || true up /sbin/ip route add 217.19.150.0/24 dev eth2 table eth2_tbl || true up /sbin/ip route add default via 217.19.150.1 table eth2_tbl || true down /sbin/ip route del default via 217.19.150.1 table eth2_tbl || true down /sbin/ip route del 217.19.150.0/24 dev eth2 table eth2_tbl || true down /sbin/ip rule del from 217.19.150.6 table eth2_tbl || true Per verificare lo stato della nuova tabella di routing: ip route show table eth2_tbl 217.19.150.0/24 dev eth2 scope link default via 217.19.150.1 dev eth2 ip rule show 0: from all lookup local 32765: from 217.19.150.6 lookup eth2_tbl 32766: from all lookup main 32767: from all lookup default Attenzione alla **priorità delle regole** (rules)! Il numero più basso ha priorità maggiore, se non viene indicato il parametro **''priority''** nel comando **''ip rule add''** viene assegnato automaticamente un numero decrescente a partire da **32767** (unsigned int). Secondo questa priorità automatica quindi **la regola inserita per ultima ha priorità maggiore**. ====== Source IP con ip route ====== Altro sistema per selezionare un indirizzo IP sorgente diverso in base all'host di destinazione. in questo esempio si configura un **IP principale 62.48.51.128** e un indirizzo **IP alias 62.48.51.127**, per raggiungere un host specifico si utilizza l'alias: ifconfig eth0 62.48.51.128 netmask 255.255.255.0 route add default gw 62.48.51.1 ifconfig eth0:0 62.48.51.127 netmask 255.255.255.0 ip route add 78.47.114.234/32 via 62.48.51.1 src 62.48.51.127 ====== Routing in base al servizio ====== Vedere [[http://linux-ip.net/html/adv-multi-internet.html|questa pagina]] con informazioni abbastanza dettagliate. Un firewall GNU/Linux con **tre scehde di rete** in questa la configurazione: ^ eth0 | 192.168.1.1 | LAN 192.168.1.0/24 | ^ eth1 | 88.38.109.33 | Primo accesso a internet, rotta di default | ^ eth2 | 217.19.150.13 | Secondo accesso a internet, per traffico SMTP | Si vuole che un il traffico di tipo **SMTP** prenda un **routing diverso da quello di default**, uscendo per eth2 mentre la rotta di default indicherebbe di passare per eth1. Come nell'esempio precedente si crea in **''/etc/iproute2/rt_tables''** una table di nome **eth2_tbl**: # Special table for source routing. # See /etc/network/interfaces. 102 eth2_tbl Con gli opportuni comandi **''ip''**, si aggiunge una regola di routing per i pacchetti marcati **fwmark 25** (numero intero arbitrario) e una rotta di default, solo per questa tabella, verso il gateway eth2. ip rule add fwmark 25 table eth2_tbl ip route add default via 217.19.150.1 table eth2_tbl Queste istruzioni possono essere abbinate alla configurazione di eth2 in **''/etc/network/interfaces''** (sistema Debian GNU/Linux): iface eth2 inet static address 217.19.150.13 netmask 255.255.255.0 broadcast 217.19.150.255 up /sbin/ip rule add fwmark 25 table eth2_tbl || true up /sbin/ip route add default via 217.19.150.1 table eth2_tbl || true down /sbin/ip rule del fwmark 25 table eth2_tbl || true down /sbin/ip route del default via 217.19.150.1 table eth2_tbl || true Poi si sistema la cosa a livello di **FORWARD** dall LAN (eth0) verso internet. Si vuole anche che il traffico sia mascherato (**SNAT**) da eth2, in modo analogo a quanto avviene su eth1. iptables -A PREROUTING -t mangle -s 192.168.1.0/24 -i eth0 --protocol tcp --dport 25 -j MARK --set-mark 25 iptables -A POSTROUTING -t nat -s 192.168.1.0/24 -o eth2 -j MASQUERADE Con queste due regole si dice: - **Marcare** con un **fwmark** 25 tutto il traffico che viene dalla LAN e destinato alla porta 25 (SMTP). - **Mascherare** il traffico proveniente dall LAN che esce da eth2 Infine si deve instradare in modo simile il traffico generato localmente dal firewall: iptables -A OUTPUT -t mangle -s 88.38.109.33 --protocol tcp --dport 25 -j MARK --set-mark 25 iptables -A POSTROUTING -t nat -s 88.38.109.33 -o eth2 -j SNAT --to-source 217.19.150.13 Con queste regole si ottiene che il firewall: - **Marca** con un **fwmark** 25 tutto il traffico generato localmente e destinato alla porta 25 (SMTP). - Modifica **SNAT** l'IP sorgente predefinito con quello di eth2. Come si nota l'indirizzo IP di origine del traffico locale sarebbe quello associato alla rotta di default, si deve pertanto effettuare SNAT. ====== Firewall dual homed e source routing con Shorewall ====== **Esempio**: collegamento a internet con due interfacce, **eth0** (217.58.174.226, ADSL) e **eth2** (94.94.64.138, HDSL). La rotta predefinita è su eth0, parte del traffico viene dirottato su eth2 tramite regole di ''iptables''. La **LAN** 10.22.20.0/24 è collegata su **eth1**. Queste le accortezze da utilizzare: * In **''/etc/shorewall/interfaces''** si indicano le due interfacce collegate alla zona **net**. * In **''/etc/shorewall/shorewall.conf''** si imposta **ROUTE_FILTER=No**, altrimenti il traffico in uscita dalla eth2 viene filtrato come //martian source//. * In **''/etc/shorewall/interfaces''** **NON** ci deve essere l'opzione **routefilter=1** (misura anti-spoofing), per lo stesso motivo di cui sopra. **ATTENZIONE**: Se in ''shorewall.conf'' c'è l'opzione ''ROUTE_FILTER=Yes'', impostare qui ''routefilter=0'' non è sufficiente. * In **''/etc/shorewall/interfaces''** l'opzione **sourceroute=[0|1]** (non accetta/accetta pacchetti source routed dall'interfaccia) è importante? FIXME **''/etc/iproute2/rt_tables''** # Special table for source routing. # See /etc/network/interfaces. 102 eth2_tbl **''/etc/network/interfaces''** auto eth2 iface eth2 inet static address 94.94.64.138 netmask 255.255.255.248 broadcast 94.94.64.143 # gateway 94.94.64.137 up /sbin/ip rule add from 94.94.64.138 table eth2_tbl || true up /sbin/ip rule add fwmark 102 table eth2_tbl || true up /sbin/ip route add 94.94.64.136/29 dev eth2 table eth2_tbl || true up /sbin/ip route add default via 94.94.64.137 table eth2_tbl || true down /sbin/ip route del default via 94.94.64.137 table eth2_tbl || true down /sbin/ip route del 94.94.64.136/29 dev eth2 table eth2_tbl || true down /sbin/ip rule del fwmark 102 table eth2_tbl || true down /sbin/ip rule del from 94.94.64.138 table eth2_tbl || true **''/etc/shorewall/snat''** (per il nuovo Shorewall v.5) SNAT(217.58.174.226) 192.168.1.0/24 eth0 # LAN to internet via HDSL SNAT(94.94.64.138) 192.168.1.0/24 eth2 # LAN to internet via ADSL **''/etc/shorewall/masq''** (per il vecchio Shorewall v.4) eth0 10.22.20.0/24 # LAN to internet via HDSL eth2 10.22.20.0/24 # LAN to internet via ADSL **''/etc/shorewall/start''** # Packets source-routed via eth2 must use eth2 source address, # otherwise source address for default gateway is used. iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 94.94.64.138 # For connections originating from eth1 LAN. iptables -A PREROUTING -t mangle -i eth1 --proto tcp --dport 22 -j MARK --set-mark 102 iptables -A PREROUTING -t mangle -i eth1 --proto tcp --dport 80 -j MARK --set-mark 102 # For locally geneated connections. iptables -A OUTPUT -t mangle --proto tcp --dport 22 -j MARK --set-mark 102 ====== Multirouting ====== In generale siamo abituati ad avere una sola tabella di routing, visualizzabile con il comando **''%%route -n%%''**: route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 172.16.12.1 0.0.0.0 255.255.255.255 UH 0 0 0 tun2 88.57.16.24 0.0.0.0 255.255.255.252 U 0 0 0 eth1 10.0.1.0 172.16.12.1 255.255.255.0 UG 0 0 0 tun2 192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 0.0.0.0 88.57.16.25 0.0.0.0 UG 0 0 0 eth1 Quando si inizia a lavorare con tabelle di routing multiple bisogna dimenticarsi del comando ''route'' ed iniziare ad usare il comando **''ip''**. Si dovranno gestire **tabelle di routing** multiple e **regole di routing** che selezionano la tabella da usare. L'equivalente dell'unica vecchia tabella di routing è la **main routing table**, visualizzabile in questo modo: ip route show table main 172.16.12.1 dev tun2 proto kernel scope link src 172.16.12.2 88.57.16.24/30 dev eth1 proto kernel scope link src 88.57.16.26 10.0.1.0/24 via 172.16.12.1 dev tun2 192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.2 default via 88.57.16.25 dev eth1 Ogni **tabella di routing** è identificata da un indice numerico (1-255), ad esempio la **main** ha indice **254**. Eventuali nomi associati all'id numerico sono scritti nel file **''/etc/iproute2/rt_tables''** come visto in precedenza. Come si vedono le tabelle esistenti? Per vedere il contenuto di una specifica tabella di routing: ip route show table 202 default via 83.211.224.145 dev eth2 proto static src 83.211.224.146 prohibit default proto static metric 1 Le decisioni di routing vengono prese analizzando le **regole di routing** in ordine di priorità. Quando una regola combacia, viene scelta la tabella di routing da applicare. Per vedere le regole esistenti si usa **''ip rule show''**: $ ip rule show 0: from all lookup local 32766: from all lookup main 32767: from all lookup default