SoftEther-VPN an bestimmte IP binden

(english: bind softether vpn to specific ip – english tl;dr below the german part)

Bei der Absicht, einen SoftEther-VPN-Server einzurichten, stieß ich auf das Problem, dass Softether die relativ intelligente NAT-Traversal mit dem HTTPS-Port 443 begeht. Nun ist es ja nicht so, dass ich diesen Port nicht bräuchte, und auch nicht nur SoftEther auf dem System laufen habe. Kurzum: es gibt einen Konflikt zwischen SoftEther und meinem HTTPS-Server (nginx); beide wollen Port 443 belegen.

Mein Wegbereiter auf dem Weg zur Lösung: der Server hat mehrere IPv4-Adressen auf eth0. Eine davon wird nur für den VPN fortexistieren, sodass mein Ziel folgendes Setup ist:

192.168.2.100 -> auf Port 443 antwortet der Webserver
192.168.2.200 -> auf Port 443 antwortet SoftEther

Nun ist es eigentlich Usus, dass sich eine Software an ein bestimmtes Interface oder eine bestimmte IP binden kann, damit genau in so einem Fall die Trennung der Portbelegung sauber geklärt werden kann. SoftEther kann das leider nicht; entsprechende Pullrequests sind seit Ewigkeiten ungemerged.

Es muss aber eine Lösung geben – und zwar schon lange, bevor SoftEther oder nginx ein Datenpaket abbekommen.

Mein Gedanke ist, dass iptables sich der Sache annimmt. Softether wird auf einen anderen Port (in dem Fall 445) verschoben; nginx bleibt auf Port 443. iptables sorgt nun dafür, dass im Falle einer Anfrage an 192.168.2.100 (jemand will den Webserver erreichen) genau gar nichts besonderes passiert, sondern einfach auf Port 443 der Webserver antwortet, bei einer Anfrage an 192.168.2.200 aber die Anfrage intern auf Port 445 umgeleitet wird. Ergo findet intern eine Portweiterleitung statt, die nur ausgeführt wird, wenn die angefragte IP die für den VPN vorgesehene IP ist. Die Kommandozeilenmagie dazu sieht folgendermaßen aus:

iptables -t nat -I PREROUTING --dst 192.168.2.200 -p tcp --dport 443 -j REDIRECT --to-ports 445

Einmal ausführen, ggf. noch bei jedem Start erneut ausführen lassen (z.B. über /etc/rc.local) und schon ist unter 192.168.2.200 der SoftEther auf Port 443 erreichbar, und auf allen anderen IPs der nginx. So einfach ist das.

English tl;dr version

My setup: one machine with two IPs: 192.168.2.100 and 192.168.2.200. Using the first IP, on port 443 nginx should be reached. Using the second one, on port 443 SoftEther should be accessed. While most softwares have the possibility to bind themselves to a specific interface or IP (this would allow me to bind nginx to the first, SoftEther to the second IP), SoftEther is not capable of such a config option. Even if there is a pull request for getting this feature, currently only a iptables usage can solve this issue:

iptables -t nat -I PREROUTING --dst 192.168.2.200 -p tcp --dport 443 -j REDIRECT --to-ports 445

in addition to this, set SoftEthers config to serve on port 445 instead of 443. Now, nginx can serve on 443 – and only if the called IP is 192.168.2.200, iptables redirects all packages from port 443 to internal port 445.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.