
Ich möchte zwei VPNs tunneln, indem ich OpenVPN verwende. Der Client würde sich also mit dem ersten VPN verbinden und zum zweiten VPN umgeleitet werden. (Das sind alles VPSs, ich habe keinen physischen Zugriff darauf, da das später wichtig wird.)
Also, hier ist das Bild:
Client VPN1 VPN2
10.8.0.2[tun0]------10.8.0.1[tun0]
[1.1.1.1][eth0] 10.8.100.2[tun1]----------10.8.100.1[tun0]
45.55.45.55[eth0] 186.186.186.186[eth0]------internet
Die Serverkonfiguration ist eine ziemlich standardmäßige Konfiguration:
port 1194
auth-user-pass-verify /etc/openvpn/script/login.py via-env
username-as-common-name
script-security 3
proto udp
dev tun
duplicate-cn
sndbuf 0
rcvbuf 0
vca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0
topology subnet
server 10.8.0.0 255.255.255.0 (or 10.8.100.0 in the VPN2)
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
keepalive 10 120
cipher AES-128-CBC
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
crl-verify crl.pem
Auch die Client-Konfiguration ist ziemlich standardmäßig:
client
dev tun
auth-user-pass login.txt
proto udp
sndbuf 0
rcvbuf 0
remote 45.55.45.55 1194 (or 186.186.186.186 for VPN2)
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-128-CBC
comp-lzo
key-direction 1
verb 3
Um die VPN-Kette zu erreichen, verbinde ich mich direkt mit VPN1.
openvpn --config toOpenVPN1.ovpn
Wenn ich auf diese Weise eine Verbindung von VPN1 zu VPN2 herstelle, werde ich vom VPN1-Server ausgesperrt, da der gesamte Datenverkehr zu VPN2 umgeleitet wird und die öffentliche IP von VPN1 auf die von VPN2 eingestellt ist. Daher lehne ich die vom zweiten VPN kommende Push-Route mit der Option --route-nopull ab.
openvpn --config toOpenVPN2.ovpn --route-nopull
Die Verbindung funktioniert also einwandfrei. Ich habe Datenverkehr von localhost zu VPN1 und meine öffentliche IP ist die von VPN1. Ich habe auch den tunX-Schnittstellen IPs zugewiesen. Es kommt jedoch immer noch kein Datenverkehr von localhost (Client) zu VPN2. Ich muss die Routen erstellen, damit dies funktioniert. Und genau da scheitere ich.
Da es dem Client egal ist, ob sein Datenverkehr an einen anderen Ort umgeleitet wird, gehe ich davon aus, dass auf seiner Seite (Client) keine Konfiguration oder iptables-Regeln erforderlich sind. Dasselbe gilt für den VPN2-Server, der nicht wissen muss, ob er von VPN1 oder anderen Peers kommt. Ich muss also nur VPN1-Konfigurationen einrichten.
Als Erstes werde ich die iptables-Regeln wie folgt festlegen. Dadurch kann der Datenverkehr einfach passieren.
iptables -A INPUT -i tun1 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i tun1 -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -o tun1 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p udp -m multiport --dports 6880:7000 -j DROP
iptables -A FORWARD -i tun1 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -d 10.8.100.0/24 -i tun0 -o tun1 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -s 10.8.100.0/24 -d 10.8.0.0/24 -i tun1 -o tun0 -m conntrack --ctstate NEW -j ACCEPT
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o tun1 -j MASQUERADE
Jetzt muss ich die Routen für einen Peer erstellen, um die anderen anzuzeigen:
route add 0.0.0.0/0 dev tun0
route add 0.0.0.0/0 dev tun1
### route from the the first tunnel, through the client's IP
route add -net 10.8.0.0/24 gw 10.8.0.2 dev tun0
### same for the 2nd
route add -net 10.8.100.0/24 gw 10.8.100.1 dev tun1
### route all the traffic to the 2nd VPN
### end server's IP and internet's gateway
route add 186.186.186.186 gw 45.55.45.1
route add default gw 10.8.100.1 dev tun1 <<<<<<<<<<<<<<<<<< got locked out of VPN1 server
Entweder erstelle ich falsche Routen oder die iptables-Regeln sind nicht richtig eingerichtet, aber ich kann keinen Datenverkehr von einem Client zum zweiten VPN leiten. Und nach vielen Versuchen werde ich immer wieder von VPN1 ausgesperrt.
Wie sähe ein korrekter Routensatz für VPN1 aus?
Antwort1
Also, ich habe es herausgefunden. Dazu muss man benutzerdefinierte Routing-Tabellen und iptables-Regeln verwenden, um alle Pakete zu markieren, die man weiterleiten möchte.
Um beispielsweise einen Port auf TCP weiterzuleiten, können Sie etwas wie Folgendes verwenden:
iptables -t mangle -I PREROUTING -p tcp -m multiport --dport 9999 -j MARK --set-mark 0x9999
Erstellen Sie dann eine Routing-Tabelle /etc/iproute2/rt_tables
für die markierten Pakete: Nehmen wir an 9999 tableToForward
.
Fügen Sie abschließend zwei Regeln hinzu, um alle markierten Pakete über die Schnittstelle an diese Tabelle weiterzuleiten tun1
:
ip route add 0.0.0.0/0 dev tun1 table tableToForward
ip rule add from all fwmark 1 table tableToForward
Antwort2
openvpn --config toOpenVPN2.ovpn --route-nopull
hat gut geklappt
zwei VPN-Server, einer mit dem anderen verbunden, wiederum über OpenVPN mit dem obigen Befehl.
Der Internetzugang funktionierte, ohne --route-nopull funktionierte der Internetzugang nicht.