Intelligente Lösungen
in neuer Dimension

Ubuntu-20.04: Cloud-Zugriffe am VPN vorbei

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

VPN bei GAP

Installation von Zusatzpaketen

Die Installation von Zusatzpakete muß einmalig vorab erfolgen! GAP-VPN darf dabei nicht aktiv sein!

1
2
3
sudo apt update
sudo apt upgrade -y
sudo apt install -y firejail squid

Squid dauerhaft stoppen

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:

1
2
sudo systemctl stop squid
sudo systemctl disable squid

Firejail und Netzwerkzugriff

Datei /etc/firejail/firejail.config abändern:

1
2
3
4
5
6
7
8
9
10
11
--- /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

1
2
uli@ulicsl:~$ id -un
uli

Netzwerkstatus sichten

1
2
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’

1
2
3
4
5
6
7
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”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/sh
BN="$(basename "$0")"
D="$(dirname "$0")"
D="$(cd "${D}" && pwd)"
DD="$(dirname "${D}")"

TABLE_ID=10
TABLE_NAME=vpn-bypass-table

echo "TABLE_ID=${TABLE_ID}"
echo "TABLE_NAME=${TABLE_NAME}"

getRouteComponent () {
    echo "$1"|sed -n "/^.*\s$2\s\s*/p"|sed -e "s/^.*\s$2\s\s*//"|cut -d" " -f1
}

# Default-Route ermitteln
DEFAULT_ROUTES="$(ip route|grep "^default\s"|grep -vE 'lxd|tun|ppp|vpn'|sed -e "s/\s*$//")"
DEFAULT_ROUTE="$(echo "${DEFAULT_ROUTES}"|head -1)"
if [ "${DEFAULT_ROUTES}" != "${DEFAULT_ROUTE}" ]; then
    echo >&2 "${BN}: Probleme bei der Ermittlung der DEFAULT_ROUTE - mehr als eine? -> ERSTE"
fi
DEFAULT_GATEWAY="$(getRouteComponent "${DEFAULT_ROUTE}" "via")"
DEFAULT_DEVICE="$(getRouteComponent "${DEFAULT_ROUTE}" "dev")"

echo "DEFAULT_ROUTE='${DEFAULT_ROUTE}'"
echo "DEVICE=${DEFAULT_DEVICE}"
echo "GATEWAY=${DEFAULT_GATEWAY}"

IP_ADDR_OUTPUT="$(ip addr show "${DEFAULT_DEVICE}")"
IP_ADDRESS="$(getRouteComponent "${IP_ADDR_OUTPUT}" "inet"|cut -d"/" -f1)"

echo "IP_ADDRESS=${IP_ADDRESS}"

Liefert:

1
2
3
4
5
6
7
8
$ chmod +x bin/query-vpn-bypass.sh
$ bin/query-vpn-bypass.sh
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

Routing-Tabellen sichten und erweitern

Grundinitialisierung

1
2
3
4
5
6
7
8
9
10
uli:~$ .../bin/query-vpn-bypass.sh
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

# Nächstes Kommando nur ausführen, wenn Ausgabe oben "passt"!
uli:~$ eval $(.../bin/query-vpn-bypass.sh)

Neue Routing-Tabelle vpn-bypass-table anlegen

Sichten:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
uli@ulicsl:~$ echo ${TABLE_ID}
10

uli@ulicsl:~$ echo ${TABLE_NAME}
vpn-bypass-table

uli@ulicsl:~$ cat /etc/iproute2/rt_tables
#
# reserved values
#
255   local
254   main
253   default
0 unspec
#
# local
#
#1    inr.ruhep

Wichtig: Es gibt keine Tabelle mit “10” oder “vpn-bypass”. Falls vorhanden: Löschen!

Anlegen:

1
2
uli@ulicsl:~$ echo -e "${TABLE_ID}\t${TABLE_NAME}"|sudo tee -a "/etc/iproute2/rt_tables.d/${TABLE_NAME}.conf"
10   vpn-bypass-table

Nachkontrolle:

1
2
3
4
5
uli@ulicsl:~$ echo "${TABLE_NAME}"
vpn-bypass-table

uli@ulicsl:~$ cat "/etc/iproute2/rt_tables.d/${TABLE_NAME}.conf"
10    vpn-bypass-table

Default-Route anlegen

Vorabkontrolle: Gibt es die Route schon?

1
2
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?

1
2
3
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?

1
2
3
4
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?

1
2
3
4
5
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

Hilfskript init-vpn-bypass.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/bin/sh
BN="$(basename "$0")"
D="$(dirname "$0")"
D="$(cd "${D}" && pwd)"
DD="$(dirname "${D}")"

QUERY="$(${D}/query-vpn-bypass.sh)"
if [ $? -ne 0 ]; then
    echo >&2 "${BN}: Probleme beim Ausführen des Hilfsskriptes 'query-vpn-bypass.sh' -> ABBRUCH"
    exit 1
fi
echo "${QUERY}"

getParameter () {
    echo "$1"|grep "^$2="|sed -e "s/^.*=\s*//"
}

logCommand () {
    (
  set -x
  "$@"
    )
}

TABLE_ID="$(getParameter "${QUERY}" TABLE_ID)"
TABLE_NAME="$(getParameter "${QUERY}" TABLE_NAME)"

# Routing-Tabelle anlegen
if grep "^${TABLE_ID}\s"  /etc/iproute2/rt_tables >/dev/null; then
  logCommand "${D}/_search-and-replace.sh" /etc/iproute2/rt_tables\
       "^${TABLE_ID}\s*"
fi
if [ ! -s "/etc/iproute2/rt_tables.d/${TABLE_NAME}.conf" ]; then
    logCommand "${D}/_search-and-replace.sh" /etc/iproute2/rt_tables.d/${TABLE_NAME}.conf\
               "^${TABLE_ID}\s.*$" "${TABLE_ID}\t${TABLE_NAME}"
fi

getRouteComponent () {
    echo "$1"|sed -n "/^.*\s$2\s\s*/p"|sed -e "s/^.*\s$2\s\s*//"|cut -d" " -f1
}

# Default-Route ermitteln
DEFAULT_ROUTE="$(getParameter "${QUERY}" DEFAULT_ROUTE|sed -e "s/^'//" -e "s/'$//")"
IP_ADDRESS="$(getParameter "${QUERY}" IP_ADDRESS)"

# Default-Route einrichten für TABLE_NAME
DEFAULT_CNT="$(ip route show table "${TABLE_NAME}"|grep "^default"|wc -l)"
if [ ${DEFAULT_CNT} -eq 0  ]; then
    logCommand ip route add ${DEFAULT_ROUTE} table "${TABLE_NAME}"
fi

# TABLE_NAME aktivieren
RULE_CNT="$(ip rule|grep "lookup ${TABLE_NAME}"|wc -l)"
if [ ${RULE_CNT} -eq 0  ]; then
    logCommand ip rule add from "${IP_ADDRESS}" lookup "${TABLE_NAME}"
fi

Liefert:

1
2
3
4
5
6
7
8
uli:~$ chmod +x .../bin/init-vpn-bypass.sh
uli:~$ sudo .../bin/init-vpn-bypass.sh
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

Squid mit VPN-BYPASS starten

…/bin/start-squid.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/sh
#
# Vorher: sudo init-vpn-bypass.sh
#
BN="$(basename "$0")"
D="$(dirname "$0")"
D="$(cd "${D}" && pwd)"
DD="$(dirname "${D}")"

DNS=8.8.8.8

OUTPUT="$("${D}/query-vpn-bypass.sh")"

getParameter () {
    echo "$1"|grep "^$2="|sed -e "s/^.*=\s*//"
}

DEVICE="$(getParameter "${OUTPUT}" DEVICE)"
GATEWAY="$(getParameter "${OUTPUT}" GATEWAY)"
IP_ADDRESS="$(getParameter "${OUTPUT}" IP_ADDRESS)"

TMPDIR="/tmp/${BN}.$(date|md5sum|cut -d" " -f1).$$~"

cleanUp () {
    rm -rf "${TMPDIR}"
}

trap cleanUp 0 1 2 3 4 5 6 7 8 9 10 12 13 14 15

mkdir "${TMPDIR}"
cp /etc/squid/squid.conf "${TMPDIR}/squid.conf"

ACCESS_LOG="${TMPDIR}/access.log"
CACHE_LOG="${TMPDIR}/cache.log"
touch "${ACCESS_LOG}"
touch "${CACHE_LOG}"

${D}/_search-and-replace.sh "${TMPDIR}/squid.conf" "^http_access\s.*\slocalnet"
${D}/_search-and-replace.sh "${TMPDIR}/squid.conf" "^http_access\s\s*deny\s\s*all$" "http_access allow localnet\nhttp_access deny all"
${D}/_search-and-replace.sh "${TMPDIR}/squid.conf" "^access_log.*$" "access_log daemon:${ACCESS_LOG}"
${D}/_search-and-replace.sh "${TMPDIR}/squid.conf" "^cache_log.*$" "cache_log ${CACHE_LOG}"
${D}/_search-and-replace.sh "${TMPDIR}/squid.conf" "^cache deny all$" "cache deny all"
${D}/_search-and-replace.sh "${TMPDIR}/squid.conf" "^pid_filename.*$" "pid_filename ${TMPDIR}/squid.pid"

firejail --noprofile --name=squid --net=br0 --ip=10.10.20.206 --net=${DEVICE} --dns=${DNS} --defaultgw=${GATEWAY} squid -N -f "${TMPDIR}/squid.conf"

cleanUp
exit 0

Nicht-VPN-Tests (Test-1)

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!

1
2
3
4
5
6
7
8
9
10
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:

1
2
3
4
5
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

1
2
3
4
5
6
7
8
9
10
11
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.

Webserver-Abfrage via CURL

1
2
3
4
5
6
7
8
9
10
11
uli:~$ curl -v https://show-my-ip.de/
...
* Server certificate:
*  subject: CN=www.show-my-ip.de
*  start date: Jan  2 01:39:15 2021 GMT
*  expire date: Apr  2 01:39:15 2021 GMT
*  subjectAltName: host "show-my-ip.de" matched cert's "show-my-ip.de"
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
...

Webserver-Abfrage via CURL und VPN-BYPASS-Squid

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
uli:~$ curl -v -x 10.10.20.206:3128 https://show-my-ip.de/
*   Trying 10.10.20.206:3128...
* TCP_NODELAY set
* Connected to 10.10.20.206 (10.10.20.206) port 3128 (#0)
...
* Server certificate:
*  subject: CN=www.show-my-ip.de
*  start date: Jan  2 01:39:15 2021 GMT
*  expire date: Apr  2 01:39:15 2021 GMT
*  subjectAltName: host "show-my-ip.de" matched cert's "show-my-ip.de"
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
...
</body>
</html>
* Connection #0 to host 10.10.20.206 left intact

Webserver-Zugriff im Browser

Mit dieser Prozedur testen:

  • Browser stoppen (alle Fenster und Hintergrundprozesse)
  • Browser per Kommandozeile neu starten: google-chrome-stable
  • Sicherstellen: Browser verwendet keinen Proxy-Server!
  • Url öffnen im Browser: show-my-ip.de

Zeigt meine IP-Adresse an KABELBW.

Webserver-Zugriff im Browser mit VPN-BYPASS-Squid

Mit dieser Prozedur testen:

  • Browser stoppen (alle Fenster und Hintergrundprozesse)
  • Browser per Kommandozeile neu starten: google-chrome-stable
  • Sicherstellen: Browser verwendet diesen festen Proxy-Server für alle Abfragen: 10.10.20.206:3128
  • Url öffnen im Browser: show-my-ip.de

Zeigt meine IP-Adresse an KABELBW.

VPN-BYPASS-Squid stoppen

  • VPN-BYBASS-Squid-Fenster aktivieren
  • Strg-C –> Prompt erscheint wieder

Zusammenfassung ohne VPN

Für mich (Uli) sehen die Tests so aus:

Name Wert S1 Anmerkung
…/bin/query-vpn-bypass.sh OK Ausgeführt, Werte plausibel, kein Fehler
…/bin/init-vpn-bypass.sh NICHT ausgeführt
…/bin/start-squid.sh OK Ausgeführt in neuem Fenster, kein Fehler, 10.10.20.206 wird angezeigt, “bleibt hängen”
SSH-Benutzer@SSH-Server gitea@gitea.daemons-point.com OK Server bei Hetzner, habe meinen SSH-Schlüssel bei DP-GITEA bereits hinterlegt
Thunderbird Nutze ich aktuell nicht
Systemaktualisierung OK Klappt
Web-Server (Curl) https://show-my-ip.de OK Zertifikat kontrolliert – passt
Web-Server (Curl-VPN-BYPASS) https://show-my-ip.de OK Zertifikat kontrolliert – passt
Web-Server (Browser) show-my-ip.de OK 91.89.124.131 und HSI-KBW-091-089-124-131.hsi2.kabelbw.de
Web-Server (Browser-VPN-BYPASS) show-my-ip.de OK 91.89.124.131 und HSI-KBW-091-089-124-131.hsi2.kabelbw.de
VPN-BYPASS-Squid stoppen OK Mit Strg-C abgebrochen, Prompt erscheint

Erklärungen zur Tabelle:

  • S1: Status beim ersten Test (=dieser Test)

Nicht-VPN-Tests mit init-vpn-bypass (Test-2)

Wir führen zunächst einige Tests ohne VPN aus aber mit aktiviertem VPN-BYPASS aus. Damit stellen wir sicher, dass der VPN-BYPASS “nicht stört”.

VPN-BYPASS initialisieren

1
2
3
4
5
6
7
8
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

Tests durchführen

Exakt gleich wie bei Test-1! VPN-BYPASS-Squid starten/stoppen nicht vergessen!

Zusammenfassung ohne VPN mit VPN-BYPASS

Für mich (Uli) sehen die Tests so aus:

Name Wert S1 S2 Anmerkung
…/bin/query-vpn-bypass.sh OK OK Ausgeführt, Werte plausibel, kein Fehler
…/bin/init-vpn-bypass.sh OK Ausgeführt, Werte plausibel, kein Fehler
…/bin/start-squid.sh OK OK Ausgeführt in neuem Fenster, kein Fehler, 10.10.20.206 wird angezeigt, “bleibt hängen”
SSH-Benutzer@SSH-Server gitea@gitea.daemons-point.com OK OK Server bei Hetzner, habe meinen SSH-Schlüssel bei DP-GITEA bereits hinterlegt
Thunderbird Nutze ich aktuell nicht
Systemaktualisierung OK OK Klappt
Web-Server (Curl) https://show-my-ip.de OK OK Zertifikat kontrolliert – passt
Web-Server (Curl-VPN-BYPASS) https://show-my-ip.de OK OK Zertifikat kontrolliert – passt
Web-Server (Browser) show-my-ip.de OK OK 91.89.124.131 und HSI-KBW-091-089-124-131.hsi2.kabelbw.de
Web-Server (Browser-VPN-BYPASS) show-my-ip.de OK OK 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

1
2
3
4
5
6
7
8
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:

1
2
uli:~$ sudo .../bin/start-squid.sh
...

SSH-Zugriff

Gleiche Ausführung wie ohne VPN – Erwartung: Funktoniert nicht!

1
2
uli:~$ ssh gitea@gitea.daemons-point.com
ssh: Could not resolve hostname gitea.daemons-point.com: Name or service not known

Spezielle Ausführung:

1
2
3
4
5
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!

1
2
uli:~$ sudo apt update
# Fehlermeldung

Spezielle Ausführung:

1
2
3
4
uli:~$ firejail --noprofile --net=${DEVICE} --dns=${DNS} --defaultgw=${GATEWAY} apt update
# Klappt
uli:~$ firejail --noprofile --net=${DEVICE} --dns=${DNS} --defaultgw=${GATEWAY} apt upgrade
# Klappt

Webserver-Abfrage via CURL

Gleiche Ausführung wie ohne VPN – Erwartung: Funktoniert nicht!

1
2
3
4
uli:~$ curl -v https://show-my-ip.de/
* Could not resolve host: show-my-ip.de
* Closing connection 0
curl: (6) Could not resolve host: show-my-ip.de

Spezielle Ausführung:

1
2
3
4
5
6
7
8
9
10
11
uli:~$ firejail --noprofile --net=${DEVICE} --dns=${DNS} --defaultgw=${GATEWAY} curl -v https://show-my-ip.de/
...
* Server certificate:
*  subject: CN=www.show-my-ip.de
*  start date: Jan  2 01:39:15 2021 GMT
*  expire date: Apr  2 01:39:15 2021 GMT
*  subjectAltName: host "show-my-ip.de" matched cert's "show-my-ip.de"
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
...

Webserver-Abfrage via CURL und VPN-BYPASS-Squid

Gleiche Ausführung wie ohne VPN – Erwartung: Funktoniert!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
uli:~$ curl -v -x 10.10.20.206:3128 https://show-my-ip.de/
*   Trying 10.10.20.206:3128...
* TCP_NODELAY set
* Connected to 10.10.20.206 (10.10.20.206) port 3128 (#0)
...
* Server certificate:
*  subject: CN=www.show-my-ip.de
*  start date: Jan  2 01:39:15 2021 GMT
*  expire date: Apr  2 01:39:15 2021 GMT
*  subjectAltName: host "show-my-ip.de" matched cert's "show-my-ip.de"
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
...
</body>
</html>
* Connection #0 to host 10.10.20.206 left intact

Spezielle Ausführung:

1
2
3
4
5
6
uli:~$ firejail --noprofile --net=${DEVICE} --dns=${DNS} --defaultgw=${GATEWAY} curl -v  -x 10.10.20.206:3128 https://show-my-ip.de/
...
Child process initialized in 1030.00 ms
*   Trying 10.10.20.206:3128...
* TCP_NODELAY set
...

Funktioniert nicht, bleibt hängen!

Webserver-Zugriff im Browser

Mit dieser Prozedur testen:

  • Browser stoppen (alle Fenster und Hintergrundprozesse)
  • Browser per Kommandozeile neu starten: google-chrome-stable
  • Sicherstellen: Browser verwendet die Proxy-PAC-Datei vom GAP-VPN!
  • Url öffnen im Browser: show-my-ip.de

Zeigt die IP-Adresse an von einem der GAP-Internet-Proxies.

Bypass:

  • Browser stoppen (alle Fenster und Hintergrundprozesse)
  • Browser per Kommandozeile neu starten: firejail --noprofile --net=${DEVICE} --dns=${DNS} --defaultgw=${GATEWAY} google-chrome-stable
  • Sicherstellen: Browser verwendet keinen Proxy-Server!
  • Url öffnen im Browser: show-my-ip.de

Zeigt nun meine IP-Adresse von KABELBW an.

Webserver-Zugriff im Browser mit VPN-BYPASS-Squid

Mit dieser Prozedur testen:

  • Browser stoppen (alle Fenster und Hintergrundprozesse)
  • Browser per Kommandozeile neu starten: google-chrome-stable
  • Sicherstellen: Browser verwendet diesen festen Proxy-Server für alle Abfragen: 10.10.20.206:3128
  • Url öffnen im Browser: show-my-ip.de

Zeigt meine IP-Adresse an KABELBW.

Bypass:

  • Browser stoppen (alle Fenster und Hintergrundprozesse)
  • Browser per Kommandozeile neu starten: firejail --noprofile --net=${DEVICE} --dns=${DNS} --defaultgw=${GATEWAY} google-chrome-stable
  • Sicherstellen: Browser verwendet diesen festen Proxy-Server für alle Abfragen: 10.10.20.206:3128
  • Url öffnen im Browser: show-my-ip.de

Klappt bei mir (Uli) nicht!

VPN-BYPASS-Squid stoppen

  • VPN-BYBASS-Squid-Fenster aktivieren
  • Strg-C –> Prompt erscheint wieder

Zusammenfassung GAP-VPN

Für mich (Uli) sehen die Tests so aus:

Name Wert S1 S2 SN/SF Anmerkung
…/bin/query-vpn-bypass.sh OK OK OK Einmalig ausgeführt am Testbeginn, Werte plausibel, kein Fehler
…/bin/init-vpn-bypass.sh OK OK Einmalig ausgeführt am Testbeginn, Werte plausibel, kein Fehler
…/bin/start-squid.sh OK OK OK Einmalig ausgeführt am Testbeginn in neuem Fenster, kein Fehler, 10.10.20.206 wird angezeigt, “bleibt hängen”
SSH-Benutzer@SSH-Server gitea@gitea.daemons-point.com OK OK ko/OK Server bei Hetzner, habe meinen SSH-Schlüssel bei DP-GITEA bereits hinterlegt
Thunderbird –/– Nutze ich aktuell nicht
Systemaktualisierung OK OK ko?/OK? Klappt vermutlich
Web-Server (Curl) https://show-my-ip.de OK OK ko/OK Zertifikat kontrolliert – passt
Web-Server (Curl-VPN-BYPASS) https://show-my-ip.de OK OK OK/ko? Zertifikat kontrolliert – passt
Web-Server (Browser) show-my-ip.de OK OK OK/OK SN: GAP-IP-Adresse, SF: KabelBW-IP-Adresse
Web-Server (Browser-VPN-BYPASS) show-my-ip.de OK OK OK/ko? SN: KabelBW-IP-Adresse
VPN-BYPASS-Squid stoppen OK OK OK 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?
1
2
3
4
5
6
7
8
9
10
11
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?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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?
1
2
3
4
5
6
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”

1
2
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!

1
2
3
4
5
6
7
8
9
10
11
12
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:

1
2
3
4
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

Noch nicht verifiziert! Aufgetreten bei: Annette.

Links

Historie und Anmerkung

  • 2021-03-06: Hinweis auf Funktionsdefizite
  • 2021-03-01: Tippfehler korrigiert
  • 2021-02-27: Komplett überarbeitet
  • 2021-02-24: Neuer Ansatz, keine Filterung per User
  • 2021-02-23: Erste Version