Ich habe kürzlich einen Debian Wheezy-Server mit OpenVPN eingerichtet, um einigen Freunden in Bereichen zu helfen, in denen die Internetzensur ein Problem darstellt (einschließlich der Blockierung des VPN-Verkehrs im Allgemeinen). Um dies zu überwinden, erstellen Clients zuerst einen SSH-Tunnel zum Server und stellen dann über diesen eine Verbindung zum VPN her.
Der Server hat einen offenen SSH-Port 40001 und einen Port 40002 für einen OpenVPN-Server mit TCP-Protokoll. Beide scheinen auf dem Router richtig konfiguriert zu sein.
Ich gebe meinen Clients ein Skript, das ihren localhost tunnelt: 8080 zu myserver: 40001 und dann eine Verbindung zum VPN herstellt. In der OpenVPN-Clientkonfiguration ist "remote" auf "localhost 8080" festgelegt, sodass die VPN-Verbindung über diesen SSH-Tunnel geleitet wird.
Mein Problem ist, dass dieser Tunnel manchmal (scheinbar zu zufälligen Zeiten) zu funktionieren scheint, aber oft keine Verbindung hält. Ich habe es auch gleichzeitig auf einigen Computern (hauptsächlich meinen), aber nicht auf anderen Computern arbeiten sehen. Wenn dies fehlschlägt, stellt der Client eine Verbindung zum VPN her, kann jedoch nicht auf das Internet zugreifen. Nach etwa 30 bis 40 Sekunden wird der SSH-Tunnelprozess einfach beendet (das manuelle Öffnen des Tunnels führt nur zu "Schreibfehler: Pipe defekt". wenn es stirbt). Ich kann weder in den Server- noch in den Client-Protokollen irgendetwas finden, was darauf hindeutet, warum dies geschieht oder was den Tunnel zerstört.
Ich weiß, dass es nicht an der VPN-Verbindung selbst liegt, denn wenn ich die Remote-IP von localhost: 8080 in die echte öffentliche Adresse und den OpenVPN-Port meines Servers ändere, funktioniert sie durchgehend einwandfrei.
Mein Verdacht ist, dass meine iptables-Regeln so sind, dass eingehende Verbindungen direkt zum VPN untergebracht werden, aber Verbindungen zum VPN, die vom Server selbst (aufgrund des SSH-Tunnels) kommen, unterschiedlich behandelt werden. Wenn dies der Fall wäre, verstehe ich nicht, warum es nur gelegentlich funktionieren würde. Was könnte sonst dazu führen, dass diese Verbindung unterbrochen wird? Ich kann weder in /var/log/auth.log, /etc/openvpn/openvpn.log noch in Client-Protokollen relevante Informationen finden.
Meine /etc/iptables/rules.v4 lautet wie folgt:
*nat
:PREROUTING ACCEPT [211:13875]
:INPUT ACCEPT [3:371]
:OUTPUT ACCEPT [5:348]
:POSTROUTING ACCEPT [5:348]
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [7937:9042429]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [10987:15593548]
:fail2ban-ssh - [0:0]
-A FORWARD -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i tun0 -o eth0 -j ACCEPT
-A INPUT -p tcp -d localhost --destination-port 40001 -j ACCEPT
COMMIT
EDIT: Ich habe herausgefunden, was das Problem verursacht, weiß aber noch nicht, wie ich es beheben soll. Wenn der Client das VPN ausführt, wird der gesamte Datenverkehr - einschließlich des SSH-Tunnels selbst - darüber geleitet. Dies ist natürlich kreisförmig und stürzt den Tunnel ab. Ich muss nur irgendwie den SSH-Tunnel vom OpenVPN-Routing ausschließen ...