Was habe ich vor?
Ich habe eine kommerziellen VPN Anbieter, der mir Server in 29 verschiedenen Ländern zur Verfügung stellt.
Ich möchte jetzt einen Raspberry als VPN-Server einrichten, der wie folgt funtkioniert:
Der Rasperry stellt als Server einen VPN-Tunnel zur Verfügung. Der Tunnel steht fünf (oder auch mehr) Usern zur Verfügung.
Jeder User bekommt einen eigenen Zugang zu genau einem kommerziellen VPN-Server.
Also: User 1 -> Amsterdam
User 2 -> Mexico
User 3 -> New York usw....
Client1 <----> mein VPN-Tunnel <----> Raspberry <------> z.B. hide.sowiso.mexico.vpv <--> metfliux als Mexikaner
Client2 <----> mein VPN-Tunnel <----> Raspberry <------> z.B. hide.sowiso.usa.vpn <--> metfliux als Amerikaner
.
.
.Clientx......
es werden immer die selben Websites genutzt, nur, je nach Client als Deutscher, Amerikaner, Mexikaner...
z.B. Soll, wenn ich als Client1 angemeldet bin, es so scheinen, als wäre ich Ami, als Client2 Deutscher usw.
Ich will aber immer auf die gleichen Websites zugreifen, z.B. "Metflux.com"
Die Routen stehen dann fest in den Configs (siehe unten).
Was läuft schon?
Auf dem Raspberry läuft ein VPN als Server, in das sich alle Clients einwählen können.
Zertfikate, Schlüssel und der ganze Kryptokram laufen.
Hier die Server.conf:
dev tun0
proto udp
port 443
client-config-dir ccd
push "topology subnet"
topology subnet
log /etc/openvpn/LOG_Server.txt
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
user nobody
group nogroup
server 10.8.0.0 255.255.255.0
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 3
comp-lzo
Alles anzeigen
Den Client werden feste IP's zugewiesen durch:
#Auszug aus server.conf von oben...
client-config-dir ccd
push "topology subnet"
topology subnet
...
Was dann im /openvpn/ccd so aussieht:
Client1 (Datei muss genau den Client Namen haben)
Client2
Und die zugehörige client.conf:
log /etc/openvpn/LOG_client2.txt
dev tun
client
pull
proto udp
remote some.dyndns.net 443
resolv-retry infinite
nobind
route ipecho.net
ns-cert-type server
persist-key
persist-tun
ca ca.crt
cert client2.crt
key client2.key
comp-lzo
verb 3
Alles anzeigen
Das funktioniert prima!
Auch habe ich testweise schon zwei Verbindungen zu zwei VPN-Servern:
log /etc/openvpn/LOG_axxxxxxxxx_c1.txt
proto udp
tun-mtu 1500
fragment 1300
mssfix
cipher AES-256-CBC
remote xxxxxxxxxxx.privacy.com 149
remote xxxxxxxxxxx.privacy.com 1151
remote xxxxxxxxxxx.privacy.com 1150
...
auth SHA512
auth-user-pass /etc/openvpn/servers/userpass.txt
client
comp-lzo
dev tun1
#float
hand-window 120
inactive 604800
mute-replay-warnings
nobind
route-nopull
route ipecho.net
ns-cert-type server
persist-key
persist-remote-ip
persist-tun
ping 5
ping-restart 120
#redirect-gateway def1 raus damit!!!!
#pull ebenfalls !!!!!!!
remote-random
reneg-sec 3600
resolv-retry 60
route-delay 2
route-method exe
script-security 2
tls-cipher DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES256-SHA:DHE-RSA-CAMELLIA128-SHA:DHE-RSA-AES128-SHA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
tls-timeout 5
verb 4
ca /etc/openvpn/servers/ca.crt
cert /etc/openvpn/servers/1_cl.crt
key /etc/openvpn/servers/1_cl.key
tls-auth /etc/openvpn/servers/1_ta.key 1
Alles anzeigen
Hierbei st wichtig, dass mein eigener Server auf tun0, der erste komerzielle auf tun1, der Zweite auf tun2 usw läuft.
Alle Configs für diese Verbindungen sind gleich, bis auf die remote-Einträge und die Schlüssel, bzw. Zertifikat Pfade.
Es lassen sich auch Verbindungen aufbauen, bis der Rasp. platzt. Das ist nicht das Problem.
Es läuft alles über wlan0, eth0 ist nicht notwendig.
Wichtig ist, dass die Option "route-nopull" drinsteht, da sonst der komplette Verkehr nur über diesen tun läuft. Die routen muss man dann händisch eintragen, hier z.B.
"route ipecho.net" (steht mal stellvertretend für metflux.com, ist halt schöner zum testen, da ipecho.net, gleich die eigene ip liefert.
So, das ist aber ein Problem, weil ja diese Route in allen VPN (komerziell) stehen muss.
Openvpn trägt diese route dann einfach in die Routingtabelle ein (172.16.0.1 ist meine Fritzbox)
0.0.0.0 172.16.0.1 0.0.0.0 UG 303 0 0 wlan0
10.8.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
10.15.22.0 0.0.0.0 255.255.255.0 U 0 0 0 tun1
10.16.21.0 0.0.0.0 255.255.255.0 U 0 0 0 tun2
146.255.36.1 10.16.21.1 255.255.255.255 UGH 0 0 0 tun2
172.16.0.0 0.0.0.0 255.255.0.0 U 303 0 0 wlan0
Die 146.255... ist ipecho.net.(stellvertretend fur Metflux.com)
Das passiert aber nur einmal, was auch logisch ist.
Im Log des zweiten VPN komerz. steht dann:
ERROR: Linux route add command failed: external program exited with error status: 2
(Macht ja auch Sinn!)
Seltsamerweise lässt sich aber händisch die Route:
146.255.36.1 10.15.22.2 255.255.255.255 UGH 0 0 0 tun1
Hinzufügen:
0.0.0.0 172.16.0.1 0.0.0.0 UG 303 0 0 wlan0
10.8.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
10.15.22.0 0.0.0.0 255.255.255.0 U 0 0 0 tun1
10.16.21.0 0.0.0.0 255.255.255.0 U 0 0 0 tun2
146.255.36.1 10.15.22.2 255.255.255.255 UGH 0 0 0 tun1
146.255.36.1 10.16.21.1 255.255.255.255 UGH 0 0 0 tun2
172.16.0.0 0.0.0.0 255.255.0.0 U 303 0 0 wlan0
Ob das sinnvoll ist, weiß ich noch nicht.
Ein Tracerout zu ipecho.net sieht aber auf dem Client so aus:
traceroute to ipecho.net (146.255.36.1), 30 hops max, 60 byte packets
1 10.8.0.1 (10.8.0.1) 124.443 ms 126.107 ms 125.675 ms
2 10.15.22.2 (10.15.22.2) 129.272 ms 131.327 ms 131.964 ms .........usw.
funktioniert also, aber eben immer 10.15.22.2, egal, ob man Client1,2 usw. ist. Es sollte aber die zweite Zeile (10.15.22.2) natürlich von Client zu Client verschieden sein.
Bin zwar begnadeter Python Skripter, aber...
Es ist mir klar, dass das Ganze:
1. Mit der Wahl meiner IP-Adressen zusammenhängt. (Subnetting ist mir suspekt)
2. Mit IPTABLES, was bei mir wie folgt aussieht (ohne, dass ich eine große Ahnung habe, was ich da tue:-( )
#! /bin/sh
### BEGIN INIT INFO
# Provides: rpivpn
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: VPN initialisation script
### END INIT INFO
sysctl -w net.ipv4.ip_forward=1
iptables -F -t nat
iptables -F
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables -A FORWARD -o tun1 -s 10.8.0.1/0 -m conntrack --ctstate NEW -j ACCEPT
iptables -t nat -A POSTROUTING -o tun1 -j MASQUERADE
iptables -A FORWARD -o tun2 -s 10.8.0.2/0 -m conntrack --ctstate NEW -j ACCEPT
iptables -t nat -A POSTROUTING -o tun2 -j MASQUERADE
Alles anzeigen
(automatischer Start des Scriptes über init.d ist sichergestellt)
Der Vollständigket halber noch ifconfig vom Rasppberry (eth0 nicht angeschlossen)
eth0 Link encap:Ethernet Hardware Adresse b8:27:eb:70:8a:8d
inet6-Adresse: fe80::e013:7909:21f9:8e46/64 Gültigkeitsbereich:Verbindung
UP BROADCAST MULTICAST MTU:1500 Metrik:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
Kollisionen:0 Sendewarteschlangenlänge:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
lo Link encap:Lokale Schleife
inet Adresse:127.0.0.1 Maske:255.0.0.0
inet6-Adresse: ::1/128 Gültigkeitsbereich:Maschine
UP LOOPBACK RUNNING MTU:65536 Metrik:1
RX packets:1680 errors:0 dropped:0 overruns:0 frame:0
TX packets:1680 errors:0 dropped:0 overruns:0 carrier:0
Kollisionen:0 Sendewarteschlangenlänge:0
RX bytes:149296 (145.7 KiB) TX bytes:149296 (145.7 KiB)
tun0 Link encap:UNSPEC Hardware Adresse 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet Adresse:10.8.0.1 P-z-P:10.8.0.1 Maske:255.255.255.0
UP PUNKTZUPUNKT RUNNING NOARP MULTICAST MTU:1500 Metrik:1
RX packets:186 errors:0 dropped:0 overruns:0 frame:0
TX packets:155 errors:0 dropped:0 overruns:0 carrier:0
Kollisionen:0 Sendewarteschlangenlänge:100
RX bytes:12440 (12.1 KiB) TX bytes:12064 (11.7 KiB)
tun1 Link encap:UNSPEC Hardware Adresse 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet Adresse:10.15.22.22 P-z-P:10.15.22.22 Maske:255.255.255.0
UP PUNKTZUPUNKT RUNNING NOARP MULTICAST MTU:1500 Metrik:1
RX packets:66 errors:0 dropped:0 overruns:0 frame:0
TX packets:97 errors:0 dropped:0 overruns:0 carrier:0
Kollisionen:0 Sendewarteschlangenlänge:100
RX bytes:5192 (5.0 KiB) TX bytes:5820 (5.6 KiB)
tun2 Link encap:UNSPEC Hardware Adresse 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet Adresse:10.16.21.243 P-z-P:10.16.21.243 Maske:255.255.255.0
UP PUNKTZUPUNKT RUNNING NOARP MULTICAST MTU:1500 Metrik:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
Kollisionen:0 Sendewarteschlangenlänge:100
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
wlan0 Link encap:Ethernet Hardware Adresse 80:1f:02:ed:ff:6e
inet Adresse:172.16.0.150 Bcast:172.16.255.255 Maske:255.255.0.0
inet6-Adresse: 4006:6f05:ac10:81:9cfd:da02:16df:c4d0/64 Gültigkeitsbereich:Global
inet6-Adresse: 2a02:8109:780:3ce0:9b44:36fe:4008:5448/64 Gültigkeitsbereich:Global
inet6-Adresse: fe80::ec48:1f5a:1e5b:b6ff/64 Gültigkeitsbereich:Verbindung
UP BROADCAST RUNNING MULTICAST MTU:1500 Metrik:1
RX packets:126531 errors:0 dropped:396 overruns:0 frame:0
TX packets:83881 errors:0 dropped:1 overruns:0 carrier:0
Kollisionen:0 Sendewarteschlangenlänge:1000
RX bytes:27390293 (26.1 MiB) TX bytes:14024539 (13.3 MiB)
Alles anzeigen
So, ich hoffe nun, dass überhaupt jemand versteht, was ich vorhabe und noch besser, dass jemand mir mit Subnetting und Iptables weiter helfen kann.
Wenn nicht, hoffe ich, dass jemand meine Ergebnisse bis jetzt für sich verwerten kann.
PS, so ähnlich, und auch viel "geklaut" von