Hinweis: Das hier beschriebene Verfahren ist
recht kompliziert und funktioniert nicht sonderlich gut.
Ein alternativer Ansatz ist in Vorbereitung!
Manche meiner Kunden erfordern ein VPN, um im Kundennetz
zuarbeiten. Vom Kundennetz in’s Internet geht es über einen
speziellen Proxy-Server, den der Kunde bereitstellt. Soweit, so
gut. Probleme treten auf, seit mehr und mehr im Homeoffice
gearbeitet wird. Da ist die Bandbreite über den Proxy-Server
oft zu gering, Lösungen wir Teams funktionieren dann nicht
mehr richtig. Eine Lösung am VPN vorbei ist notwendig!
Diese Anleitung wurde erstellt mit Ubuntu-20.04.
Ziel
Installation von Zusatzpaketen
Die Installation von Zusatzpakete muß einmalig vorab erfolgen!
GAP-VPN darf dabei nicht aktiv sein!
Wir wollen den Service “squid” nicht in der Standardkonfiguration
betreiben sondern nur in unserem speziellen GAP-VPN-Modus. Deshalb
stoppen wir die automatische Ausführung von “squid” dauerhaft.
Das erste Kommando dauert etwas länger – so 1 – 2 Minuten:
--- /etc/firejail/firejail.config~ 2020-01-20 19:53:34.000000000 +0100+++ /etc/firejail/firejail.config 2021-02-24 20:49:46.409293291 +0100@@ -90,7 +90,7 @@ # networking features should also be enabled (network yes).
# Restricted networking grants access to --interface, --net=ethXXX and
# --netfilter only to root user. Regular users are only allowed --net=none.
-restricted-network yes+restricted-network no # Change default netfilter configuration. When using --netfilter option without
# a file argument, the default filter is hardcoded (see man 1 firejail). This
Gerne auch via Hilfsskript: sudo .../bin/update-etc-firejail-firejail-config.sh
Vorbereitungen – Informationen sammeln
Die Vorbereitungen können mit oder ohne VPN erfolgen!
Tabelle ermitteln
Benutzer
12
uli@ulicsl:~$ id -un
uli
Netzwerkstatus sichten
12
uli@ulicsl:~$ ip route|grep default|grep -vE "lxd|tun|ppp|vpn"
default via 192.168.0.1 dev enp3s0 proto dhcp metric 100
Notiere die Ausgaben! Bei mir: DEVICE=enp3s0 und GATEWAY=192.168.0.1 und DEFAULT_ROUTE=‘default via 192.168.0.1 dev enp3s0 proto dhcp metric 100’
1234567
uli@ulicsl:~$ ip addr show enp3s0
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether a8:a1:59:37:7f:b0 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.197/24 brd 192.168.0.255 scope global dynamic noprefixroute enp3s0
valid_lft 82311sec preferred_lft 82311sec
inet6 fe80::b685:7f72:b815:f050/64 scope link noprefixroute
valid_lft forever preferred_lft forever
Notiere die Ausgaben! Bei mir: IP_ADDRESS=192.168.0.197
Zusammenfassung – Uli’s Tabelle
Nachfolgend die Zusammenfassung für Uli und dp-0197:
Bezeichnung
Symbol
Wert
Benutzer
–
uli
Default-Route
DEFAULT_ROUTE
default via 192.168.0.1 dev enp3s0 proto dhcp metric 100
Gateway
GATEWAY
192.168.0.1
Device
DEVICE
enp3s0
IP-Adresse
IP_ADDRESS
192.168.0.197
Routing-Table-ID
TABLE_ID
10
Routing-Table-Name
TABLE_NAME
vpn-bypass-table
Zur einfacheren Erstellung der Tabelle gibt es das Skript “query-vpn-bypass.sh”:
uli@ulics:~$ ip route show table "${TABLE_NAME}"
uli@ulics:~$
Falls nicht vorhanden (wie oben – keine Ausgabe) anlegen:
1
uli@ulics:~$ sudo ip route add ${DEFAULT_ROUTE} table "${TABLE_NAME}"
Nachkontrolle: Route nun vorhanden?
123
uli@ulics:~$ ip route show table "${TABLE_NAME}"
default via 192.168.0.1 dev enp3s0 proto dhcp metric 100
uli@ulics:~$
Routing-Tabelle aktivieren
Vorabkontrolle: Bereits aktiv?
1234
uli@ulics:~$ ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
Wenn keine Zeile mit “vpn-bypass-table” angezeigt wird, dann ist die Routing-Tabelle nicht aktiv!
Aktivieren:
1
uli@ulics:~$ sudo ip rule add from "${IP_ADDRESS}" lookup "${TABLE_NAME}"
Nachkontrolle: Nun aktiv?
12345
uli@ulics:~$ ip rule
0: from all lookup local
32765: from 192.168.0.197 lookup vpn-bypass-table
32766: from all lookup main
32767: from all lookup default
Initialisierung über Hilfsskript init-vpn-bypass.sh
Wir führen zunächst einige Tests ohne VPN aus. Damit stellen wir sicher,
dass die Cloud-Services zur Verfügung stehen!
VPN-BYPASS-Squid starten
Du brauchst hierfür ein eigenes neues Fenster!
12345678910
uli:~$ .../bin/start-squid.sh
Interface MAC IP Mask Status
lo 127.0.0.1 255.0.0.0 UP
eth0 ba:7d:3e:70:68:40 10.10.20.206 255.255.255.0 UP
eth1-256398 6a:0c:29:ee:b0:53 192.168.0.117 255.255.255.0 UP
Default gateway 192.168.0.1
DNS server 8.8.8.8
Child process initialized in 2518.65 ms
SSH-Zugriff
Führe testweise einen SSH-Zugriff an einem Cloud-Server durch:
12345
uli:~$ ssh gitea@gitea.daemons-point.com
PTY allocation request failed on channel 0
Hi there, uli! You've successfully authenticated with the key named uli-solokey-fuer-dp_notouch, but Gitea does not provide shell access.
If this is unexpected, please log in with password and setup Gitea under another user.
Connection to gitea.daemons-point.com closed.
Thunderbird
Funktioniert Thunderbird wie üblich?
Kann ich (Uli) aktuell nicht testen, verwende kein Thunderbird.
Systemaktualisierung
1234567891011
uli:~$ sudo apt update
OK:1 http://de.archive.ubuntu.com/ubuntu focal InRelease
OK:2 http://de.archive.ubuntu.com/ubuntu focal-updates InRelease
OK:3 http://de.archive.ubuntu.com/ubuntu focal-backports InRelease
...
uli:~$ sudo apt upgrade
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Paketaktualisierung (Upgrade) wird berechnet... Fertig
0 aktualisiert, 0 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
91.89.124.131 und HSI-KBW-091-089-124-131.hsi2.kabelbw.de
VPN-BYPASS-Squid stoppen
OK
OK
Mit Strg-C abgebrochen, Prompt erscheint
Erklärungen zur Tabelle:
S1: Status beim ersten Test (=voriger Test)
S2: Status beim zweiten Test (=dieser Test)
GAP-VPN-Tests (Test-3)
Vorabtest: Ist GAP-VPN funktionsfähig? Klappen die Zugriffe auf GAP-Server?
Wenn die Vorabtests OK sind, dann
führen wir qualitzativ die gleichen Tests wie zuvor ohne VPN nun mit GAP-VPN aus!
VPN-BYPASS initialisieren
12345678
uli:~$ sudo .../bin/init-vpn-bypass.sh
DNS=8.8.8.8
TABLE_ID=10
TABLE_NAME=vpn-bypass-table
DEFAULT_ROUTE='default via 192.168.0.1 dev enp3s0 proto dhcp metric 100'
DEVICE=enp3s0
GATEWAY=192.168.0.1
IP_ADDRESS=192.168.0.197
VPN-BYPASS-Squid starten
In einem neuen Fenster:
12
uli:~$ sudo .../bin/start-squid.sh
...
SSH-Zugriff
Gleiche Ausführung wie ohne VPN – Erwartung: Funktoniert nicht!
12
uli:~$ ssh gitea@gitea.daemons-point.com
ssh: Could not resolve hostname gitea.daemons-point.com: Name or service not known
Spezielle Ausführung:
12345
uli:~$ firejail --noprofile --net=${DEVICE} --dns=${DNS} --defaultgw=${GATEWAY} ssh gitea@gitea.daemons-point.com`
PTY allocation request failed on channel 0
Hi there, uli! You've successfully authenticated with the key named uli-solokey-fuer-dp_notouch, but Gitea does not provide shell access.
If this is unexpected, please log in with password and setup Gitea under another user.
Connection to gitea.daemons-point.com closed.
Klappt!
Thunderbird
Funktioniert Thunderbird wie üblich?
Kann ich (Uli) aktuell nicht testen, verwende kein Thunderbird.
Systemaktualisierung
Gleiche Ausführung wie ohne VPN – Erwartung: Funktoniert nicht!
Einmalig ausgeführt am Testende, mit Strg-C abgebrochen, Prompt erscheint
Erklärungen zur Tabelle:
S1: Status beim ersten Test
S2: Status beim zweiten Test
SN “Status Normal”: Klappt’s ohne spezielle Variationen?
SF “Status Firejail”: Klappt’s mit Firejail?
Qualitätssicherung
query-vpn-bypass.sh
Gibt das Skript eine Art Tabelle aus?
Sind “alle” Werte enthalten?
TABLE_ID
TABLE_NAME
DEFAULT_ROUTE
DEVICE
GATEWAY
IP_ADDRESS
Passen die Werte “für Dich”?
Passen sie auf die Beschreibung weiter vorne?
Ändern sich die Werte ohne/mit VPN?
init-vpn-bypass.sh
Denk dran: sudo .../init-vpn-bypass.sh!
Gibt das Skript eine Art Tabelle aus?
Erscheint keine Fehlermeldung?
Erscheint auch bei wiederholter Ausführung keine Fehlermeldung?
Legt das Skript dies alles an:
die neue Routing-Tabelle? (Datei /etc/iproute2/…)
die neue Default-Route? (ip route show ...)
die Aktivierung der Routing-Tabelle? (ip rule)
Verhält sich das Skript gleichartig ohne/mit VPN?
start-squid.sh
Sehen die Ausgaben grob so aus?
1234567891011
uli:~/git/dptools$ bin/start-squid.sh
Parent pid 256398, child pid 256402
Interface MAC IP Mask Status
lo 127.0.0.1 255.0.0.0 UP
eth0 ba:7d:3e:70:68:40 10.10.20.206 255.255.255.0 UP
eth1-256398 6a:0c:29:ee:b0:53 192.168.0.117 255.255.255.0 UP
Default gateway 192.168.0.1
DNS server 8.8.8.8
Child process initialized in 2518.65 ms
Taucht die 10.10.20.206 auf?
Bleibt der Prozess hängen?
Kann man ihn mittels Strg-C beenden?
Klappt die Sequenz starten – beenden – starten – beenden mehrfach hintereinander? 5x?
Klappt nach dem Start zuverlässig der CURL-Zugriff auf 10.10.20.206:3128?
123456789101112131415
uli@ulicsl:~$ curl -sq -v http://10.10.20.206:3128 2>&1|grep -- "< "
< HTTP/1.1 400 Bad Request
< Server: squid/4.10
< Mime-Version: 1.0
< Date: Sat, 27 Feb 2021 10:20:59 GMT
< Content-Type: text/html;charset=utf-8
< Content-Length: 3497
< X-Squid-Error: ERR_INVALID_URL 0
< Vary: Accept-Language
< Content-Language: en
< X-Cache: MISS from ulicsl
< X-Cache-Lookup: NONE from ulicsl:3128
< Via: 1.1 ulicsl (squid/4.10)
< Connection: close
<
Scheitert nach dem Beenden zuverlässig der CURL-Zugriff auf 10.10.20.206:3128?
123456
uli@ulicsl:~$ curl -sq -v http://10.10.20.206:3128
* Trying 10.10.20.206:3128...
* TCP_NODELAY set
* connect to 10.10.20.206 port 3128 failed: Keine Route zum Zielrechner
* Failed to connect to 10.10.20.206 port 3128: Keine Route zum Zielrechner
* Closing connection 0
Probleme und Lösungen
Firejail
Beim Start von Firejail erscheint die Fehlermeldung: “Error: networking feature is disabled in Firejail configuration file”
12
agutjahr@soerenpc:~$ firejail --noprofile --net=${DEVICE} --dns=8.8.8.8 --defaultgw=${GATEWAY} ssh -b ${IP_ADDRESS} ivpn
Error: networking feature is disabled in Firejail configuration file
Abhilfe: /etc/firejail/firejail.config anpassen!
123456789101112
uli@ulicsl:~/git/dptools$ diff -u /etc/firejail/firejail.config~ /etc/firejail/firejail.config
--- /etc/firejail/firejail.config~ 2020-01-20 19:53:34.000000000 +0100+++ /etc/firejail/firejail.config 2021-02-24 20:49:46.409293291 +0100@@ -90,7 +90,7 @@ # networking features should also be enabled (network yes).
# Restricted networking grants access to --interface, --net=ethXXX and
# --netfilter only to root user. Regular users are only allowed --net=none.
-restricted-network yes+restricted-network no # Change default netfilter configuration. When using --netfilter option without
# a file argument, the default filter is hardcoded (see man 1 firejail). This
Aufgetreten bei: Annette.
DNS-Fehler bei SSH-Aufruf: Name or service not known
Wenn man bei aktiviertem GAP-VPN und geändertem Routing SSH wie unten beschrieben
aufruft, dann erscheint ein Fehler:
1234
agutjahr@soerenpc:~$ ssh -b $IP_ADDRESS ivpn
ssh: Could not resolve hostname internal.daemons-point.com: Name or service not known
kex_exchange_identification: Connection closed by remote host
agutjahr@soerenpc:~$
Mögliche Abhilfen :
– FIREJAIL: Statt ssh -b $IP_ADDRESS ivpn dies: firejail --no-profile --net=${DEVICE} --dns=8.8.8.8 --defaultgw=${GATEWAY} ssh ivpn
– verbesserte DNS-Konfiguration – aktuell noch unbekannt, muß ggf. noch erarbeitet werden