Wichtig ist es, dass sowohl Punkt 1: "Lokale sockets" wie auch dann Punkt 2 vollzogen werden. Ich habe dieses zuerst als Alternativen aufgefasst, aber dies funktioniert nicht.
Folgendes Script dient als Test zur Zensur unserer Infnet-Seite:
#!/bin/bash cmd=$1 case $cmd in start) iptables -t mangle -N DIVERT iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT iptables -t mangle -A DIVERT -j MARK --set-mark 1 ip rule add fwmark 1 lookup 100 ip route add local 0.0.0.0/0 dev lo table 100 # Zensur der Infnet-Seite iptables -t mangle -A PREROUTING -p tcp -d 80.150.88.13/32 --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 2000 ;; stop) iptables -t mangle -F iptables -t mangle -X DIVERT ip rule delete fwmark 0x1 ip route flush table 100 ;; show) iptables -t mangle -L ip rule show ip route show table 100 ;; *) echo "Usage: $0 start|stop|show" ;; esac
Das obige Script leitet die TCP-Verbindungen statt auf 80.150.88.13/32 auf Port 2000 auf den selben Rechner weiter. Dort muss
bischlauch -trans 2000gestartet sein.
Interessant ist folgendes:
# netstat -n -t Aktive Internetverbindungen (ohne Server) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 80.150.88.13:80 192.168.1.20:45927 TIME_WAITMan sieht, dass netstat die entführte Adresse als eine seiner Localen Adresse ausgibt !
Wenn man einen Server ohne die socket-Option (SOL_IP, IP_TRANSPARENT) startet (wie bischlauch 2000 ohne Option -trans), bleibt der client im connect(2) hängen, d.h. die IP-Pakete werden wahrscheinlich beim Server verworfen.