Routing mit iptables, fester IP und openvpn
Problem: Die exim-Prozesse auf meinen virtuellen Servern verabschieden sich immer mal wieder, weil zuwenig Speicher vorhanden ist ... oder wie letztes Wochenende aufgrund eines Hardwaredefektes. An einem Standort habe ich eine DSL-Leitung mit festen IPs; am anderen Standort eine kleine Linksys NSLU mit Debian, auf der exim sowieso schon läuft. Ziel: Verwende eine der festen IPs als Backup-MX.
Die Realisierung ist nicht trivial, weil die Linksys natürlich weiterhin ihre Default-Route behalten sollte und der normale Traffic über das Gateway am Standort 2 (ein OpenWRT-System) erfolgen sollte. In einem ersten Schritt habe ich deshalb auf dem Openwrt-Router am Standort 1 (mit den festen IPs) Source- und Destination-NAT aktiviert:
# SMTP to linksys nslu standort 2 (IP 192.168.2.25)
iptables -t nat -A prerouting_rule -i $WAN -p tcp --dport 25 -d 1.2.3.4 -j DNAT --to 192.168.2.25:25
iptables -A forwarding_rule -i $WAN -p tcp --dport 25 -d 192.168.2.25 -j ACCEPT
iptables -t nat -A postrouting_rule -o tun0 -p tcp --dport 25 -d 192.168.2.25 -j SNAT --to 192.168.1.1
Die beiden Standorte sind über OpenVPN verbunden, Standort 1 hat das Netz 192.168.1.0/24, Standort 2 192.168.2.0/24. Die externe IP ist 1.2.3.4. Die letzte Regel ändert die Absendeadresse der ankommenden Pakete auf die IP des Routers am Standort 1 im internen Netz. Damit weiß exim auf der NSLU, an welche Adresse es die Pakete zurückschicken muss und verwendet den Router am Standort 1 als Ziel, der dann wiederum weiß, an welche echte Adresse die Pakete verschickt werden. tun0 ist das VPN-Interface.
Nachteil dieser Lösung ist, dass greylisting nicht funktioniert (und die NSLU für ein anderes Spamerkennungsverfahren zu langsam ist). Für den Greylisting-Dämon sieht es immer so aus, als ob die Pakete vom Router mit der IP 192.168.1.1 kommen. Deshalb muss das SNAT entfallen und ein anderer Weg gefunden werden, die SMTP-Pakete von der NSLU zum Router 1 zu bringen.
Dazu wird die Routing-Tabelle auf dem Router am Standort 2 (192.168.2.1) manipuliert.
#!/bin/sh
iptables -t mangle -F PREROUTING
# send smtp from sophie to berlin (and the other way round)
iptables -A PREROUTING -t mangle -i $LAN -p tcp --dport 25 -s 192.168.2.25 \
-j MARK --set-mark 71
iptables -A PREROUTING -t mangle -i $LAN -p tcp --sport 25 -s 192.168.2.25 \
-j MARK --set-mark 71
Damit werden die Pakete durch iptables markiert. Wer gleichzeitig QOS verwendet, sollte das Skript mit in den hotplug-Folder legen und es nach jeder Aktualisierung des QOS ausführen. Folgendes Skript ändert die Routing-Tabellen und muss nur beim Systemstart ausgeführt werden:
#!/bin/sh
ip rule add fwmark 71 table 201
ip route add default via 10.1.1.1 table 201
Sowohl 71 als auch 201 sind willkürlich gewählt. Die IP-Adresse ist die intern von OpenVPN für Router 1 verwendete.
Damit der Router 1 die richtige IP-Adresse für abgehende Pakete verwendet, wird die DNAT-Regel von oben durch folgende ersetzt:
# and back from NSLU
iptables -t nat -A postrouting_rule -o $WAN -s 192.168.2.25 -j SNAT --to 1.2.3.4
Die NSLU ist damit unter der festen IP erreichbar, während sie weiterhin das Standard-Gateway am Standort 2 verwendet.
- Michael Krax's blog
- Anmelden oder Registrieren um Kommentare zu schreiben

