Ich habe bereits ein Policy-Routing-Setup, das aber bislang nur anhand der IP Adresse routet (also "ip rule from ...."), und möchte nun zusätzlich auch per "iptables -j MARK --set-mark" markierte Pakete per "ip rule fwmark ..." routen, was mir aber einfach nicht gelingen will.
Der spezielle Fall, an dem ich mir heute schon die Zähne ausgebissen habe: Die Standardroute führt über $WAN_IF_INODE, und ich möchte nun SMTP-Verbindungen vom Host $MX_HOST (der sich im Netzwerk $LAN_NET_VLAN befindet, und über das Interface $LAN_IF_VLAN erreichbar ist) über $WAN_IF_TELE2 routen. Die relevanten Teile in meinem Firwall-Skript sehen dabei folgendermaßen aus (da fehlt natürlich jede Menge, mein Skript ist sehr umfangreich):
Code: Alles auswählen
# Allow new, established & related connections WAN <-> VLAN
iptables -A FORWARD -i $WAN_IF_ALL -o $LAN_IF_VLAN -d $LAN_NET_VLAN -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $LAN_IF_VLAN -o $WAN_IF_ALL -s $LAN_NET_VLAN -j ACCEPT
# Allow mailserver forwarding WAN_TELE2 -> VLAN
iptables -A FORWARD -i $WAN_IF_TELE2 -o $LAN_IF_VLAN -p tcp -d $MX_HOST -m multiport --dports smtp,ssmtp -j ACCEPT
# Mailserver ports forwarding WAN_TELE2 -> VLAN
iptables -t nat -A PREROUTING -i $WAN_IF_TELE2 -d $WAN_IP_TELE2 -p tcp --dport smtp -j DNAT --to-destination $MX_HOST:25
iptables -t nat -A PREROUTING -i $WAN_IF_TELE2 -d $WAN_IP_TELE2 -p tcp --dport ssmtp -j DNAT --to-destination $MX_HOST:465
# Enable SNAT for WAN_TELE2
iptables -t nat -A POSTROUTING -o $WAN_IF_TELE2 -s $LAN_NET_VLAN -j SNAT --to-source $WAN_IP_TELE2
# Mark traffic for policy routing
iptables -t mangle -A FORWARD -i $LAN_IF_VLAN -s $MX_HOST -p tcp -m multiport --dports smtp,ssmtp -j MARK --set-mark 1
# Setup Tele2 routing table
ip route replace default dev $WAN_IF_TELE2 table tele2
# Setup rules
ip rule add fwmark 1 table tele2 prio 60
Das funktioniert aber nicht, die Pakete gehen trotzdem über §WAN_IF_INODE raus, obwohl diese nachweislich von iptables korrekt markiert werden (kann man ja per "iptables -t mangle -L -v" überprüfen).
Wenn ich nun die Policy-Routing-Rule auf Host-Matching umstelle, funktioniert es:
Code: Alles auswählen
ip rule add from $MX_HOST table tele2 prio 60
Ich habe heute den ganzen Nachmittag damit rumgespielt, und komme einfach nicht weiter.
Warum klappt es mit dem Host-Match, aber nicht mit dem fwmark-Match?
Ich muß da irgendwas entscheidendes übersehen. Ich habe natürlich schon im Internet gesucht, und ein paar Beispiele gefunden, die ähnlich aufgebaut sind, also Pakete, die an einen bestimmten Port gesendet werden, mit iptables auf ebendiese Weise markieren, und dann einfach per "ip rule fwmark ..." über das korrekte Interface rausschicken, was ja eigentlich auch so funktionieren soll.
Wer kann mir sagen, was hier los ist, bzw. wie ich dem Problem auf die Spur kommen kann?
P.S. Wenn ich das Marking von der Mangle-Forward-Chain in die Mangle-Prerouting-Chain verschiebe, kann man von $MX_HOST keine Verbindung mehr über Port 25/465 aufbauen. Ich habe das zum Testen jeweils von $MX_HOST per "telnet destination-mailserver smtp" probiert, so konnte ich immer gleich sehen, daß die Verbindung trotz allem über $WAN_IF_INODE rausging. Mit dem Marking in der Mangle-Prerouting-Chain tut sich nach Eingabe des Telnet-Kommandos einfach nichts mehr.