In einem recht restriktivem Netzwerk benötigte ich eine Möglichkeit, um auf diverse interne Dienste über das Internet zugreifen zu können. Diesen Anlass nahm ich als Gelegenheit um etwas mit TOR und Onioncat herumzuspielen. Mein primäres Ziel war es, sicheren Zugriff auf den internen Mailserver zu gewähren, sodass ich E-Mails abrufen kann ohne direkt mit dem LAN verbunden zu sein.
TOR dient hier lediglich als Transportebene, so ist keine Portweiterleitung im Router notwendig. Onioncat wird als hidden-service bereitgestellt und erzeugt ein Overlay-Netzwerk, welches IPv6 als Protokoll auf Layer 3 verwendet. Die Dienste sind dann später über eine statische IPv6 Adresse via TOR/Onioncat erreichbar.
Zusätzlich greife ich mit port knocking auf eine Technologie aus den 90’ern zurück, um SSH-Zugriff auf das Gateway zu gewähren - alt aber purer Spaß!
netcat nutzbar.Als Server/Gateway Hardware nutze ich einen BeagleBone Black auf dem Archlinux läuft.
Übersicht
Vereinfacht lassen sich die Kommunikationswege folgendermaßen darstellen:
Der Mailserver befindet sich in VLAN #2, welches ausschließlich von VLAN #1 zu erreichen ist.
Unsere Gateway-Box wird per Ethernet direkt ins VLAN #1 gehangen und dort via DHCP eine IP-Adresse
beziehen. Ausgehender Traffic ins Internet ist auf den relevanten Ports (TOR) ungefiltert.
Der TOR Client auf dem Gateway verbindet sich mit dem Onion-Netzwerk und startet den hidden-service.
Darauf hin ist das Gateway unter der IPV6-Adresse für andere Onioncat Teilnehmer erreichbar.
Sobald ein weiterer Onioncat-Endpunkt bekannt ist, kann dieser mit dem Gateway über IPv6 auf Port 443
kommunizieren und das socat Relay übersetzt den Datenfluss in IPv4 und leitet ihn weiter an den Mailserver
in VLAN #2. Btw. fragt nicht, warum der Mailserver auf Port 443 erreichbar ist.. es handelt sich hier um
einen Microsoft Exchange ActiveSync Server.
Zur einfacheren Administration des Gateways ist dieses auf zwei Wege per SSH zu erreichen:
Optional via mDNS aus dem lokalen Netzwerk. Dies einfach aus Bequemlichkeit; die IP-Adresse wird per DHCP zugewiesen und wenn das Lease ausläuft, kann sie sich ändern. Dank
avahihabe ich einen generischen Hostnamen für das Gateway.Über TOR/Onioncat.
In beiden Fällen kommt port-knocking zum Tragen. Netcat, vom Client ausgeführt, klopft in bestimmter Reihenfolge an definierte Ports und iptables auf der Gateway-Seite registriert dies und wenn alles passt, wird der SSH Port geöffnet.
Vorzüge dieses Setups
- Es wird keine statische öffentliche IP-Adresse benötigt
- Die öffentliche IP-Adresse wird versteckt
- Es wird via Onioncat eine einzigartige IPv6-Adresse bereitgestellt, die von der hidden-service ID abgeleitet wird
- DNS ist nicht involviert und
leakagesollte damit kein Sicherheitsproblem darstellen
Installation benötigter Pakete
Auf Gateway und Client müssen folgende Pakete installiert werden: tor , nyx , sowie optional avahi aus dem offiziellen Archlinux Paket-Verzeichnis und onioncat aus dem AUR.
1$ sudo pacman -S tor nyx
2$ yay -S onioncat
Globale Konfiguration
Für Onioncat benötige ich ein Script, welches von systemd verwendet wird um den Dienst zu starten:
1$ sudo vim /usr/local/bin/onioncat
2$ sudo chmod 755 /usr/local/bin/onioncat
1#!/usr/bin/env bash
2
3set -o errexit
4set -o pipefail
5
6__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
8if [[ ${EUID} != 0 ]] ; then
9 echo "Please run as root!"
10 exit 1
11fi
12
13tor_path="/var/lib/tor/ocat"
14
15if /bin/systemctl -q is-active tor; then
16 while [ ! -f "${tor_path}/hostname" ]; do sleep 1; done
17 onion_address=$(cat "${tor_path}/hostname")
18 if [[ ! -z "$onion_address" ]]; then
19 ocat -B -C $onion_address
20 else
21 echo "TOR hidden service address still empty. TOR running? Exiting."
22 exit 2
23 fi
24else
25 echo "TOR not started / systemd unit not active. Exiting.."
26 exit 3
27fi
Danach erstelle ich das systemd unitfile:
1$ sudo vim /etc/systemd/system/onioncat.service
2$ sudo chmod 644 /etc/systemd/system/onioncat.service
Expand to view: /etc/systemd/system/onioncat.service
[Unit]
Description=IPv6 tunnel over TOR
Requires=network-online.target tor.service
After=network-online.target tor.service
[Service]
Type=simple
ExecStart=/usr/local/bin/onioncat
ExecReload=/usr/bin/kill -HUP $MAINPID
KillSignal=SIGINT
Restart=on-failure
RestartSec=10
RestartPreventExitStatus=SIGTERM SIGKILL
SyslogIdentifier=onioncat
[Install]
WantedBy=multi-user.target
Konfiguration: Gateway
Autostart für TOR und Onioncat aktivieren und Dienste starten:
1$ sudo systemctl daemon-reload
2$ sudo systemctl enable --now tor
3$ sudo systemctl enable --now onioncat
Sobald der TOR Client mit dem Onion-Netzwerk verbunden und der Onioncat hidden-service gestartet ist,
kann ich mir die einzigartige IPv6-Adresse des Gateways anzeigen lassen:
1$ ocat -i $(sudo cat /var/lib/tor/ocat/hostname)
Dieser Befehl wandelt die Onion ID (hidden-service ID) in eine durch Onioncat vergebene IPv6 Adresse um.
IPv6-zu-IPv4 Tunnel
Auf dem Gateway benötigen wir zusätzlich socat und iptables .
1$ sudo pacman -S socat iptables
Ein Script welches das socat Relay started und den Datenfluss zum Mailserver weiterleitet.
1$ sudo vim /usr/local/bin/ipv6-mx-gate
2$ sudo chmod 755 /usr/local/bin/ipv6-mx-gate
1#!/usr/bin/env bash
2
3ipv6_address="fd87:d87e:eb43:b44d:a7ea:73c4:ab0a:2e5b"
4srv_address="192.168.2.1"
5
6while ! ip -6 addr show tun0 | grep -q "${ipv6_address}"; do sleep 1; done
7/usr/bin/socat TCP6-LISTEN:443,reuseaddr,fork,bind=[${ipv6_address}] TCP4:${srv_address}:443
Ein weiteres unitfile für den IPv6-zu-IPv4 Tunnel:
1$ sudo vim /etc/systemd/system/ipv6-mx-gate.service
2$ sudo chmod 644 /etc/systemd/system/ipv6-mx-gate.service
Expand to view: /etc/systemd/system/ipv6-mx-gate.service
[Unit]
Description=IPv6 <-> IPv4 tunnel (for access to mx)
After=onioncat.service
[Service]
ExecStart=/usr/local/bin/ipv6-mx-gate
[Install]
WantedBy=multi-user.target
Autostart für den Tunnel aktivieren und Dienst starten:
1$ sudo systemctl daemon-reload
2$ sudo systemctl enable --now ipv6-mx-gate
iptables
Für die Konfiguration der iptables Regeln setze ich folgendes Script ein:
1#!/usr/bin/env bash
2
3set -o errexit
4set -o pipefail
5
6__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
8if [[ ${EUID} != 0 ]] ; then
9 echo "Please run as root!"
10 exit 1
11fi
12
13function flush_rules() {
14 $ipt -F # Delete all rules (flush chains)
15 $ipt -X # Delete all chains
16 $ipt -Z # Zero all packet and byte counters
17 $ipt -t nat -F # Flush and
18 $ipt -t nat -X # delete NAT table
19 $ipt -t mangle -F # Flush and
20 $ipt -t mangle -X # delete MANGLE table
21 $ipt -t raw -F # Flush and
22 $ipt -t raw -X # delete RAW table
23 $ipt -t security -F # Flush and
24 $ipt -t security -X # delete SECURITY table
25}
26
27# VARIABLES
28# ---------
29ipt="$(which iptables)"
30ipt_save="$(which iptables-save)"
31ipt_restore="$(which iptables-restore)"
32rules="/etc/iptables/iptables.rules"
33log="LOG --log-level debug --log-tcp-sequence --log-tcp-options --log-ip-options"
34rlimit="-m limit --limit 5/m --limit-burst 10"
35
36if [[ $# > 0 ]]; then
37 if [[ "$1" =~ ^(-d|--disable)$ ]]; then
38 # Accept everything
39 $ipt -P INPUT ACCEPT
40 $ipt -P FORWARD ACCEPT
41 $ipt -P OUTPUT ACCEPT
42 ip6tables -P INPUT ACCEPT
43 ip6tables -P FORWARD ACCEPT
44 ip6tables -P OUTPUT ACCEPT
45
46 flush_rules
47 ip6tables-restore < /etc/iptables/empty.rules # Cleanup ip6tables
48
49 # CONFIGURATION
50 #--------------
51 echo 0 > /proc/sys/net/ipv4/ip_forward # Disable IP forward
52 echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all # Enable Ping (echo replies)
53 echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # Enable echo reply on broadcasts
54
55 exit 0
56 fi
57fi
58
59# IPv4 CONFIGURATION
60# ==================
61
62# Flushing old rules
63flush_rules 'DROP'
64
65# DEFAULT CHAINS
66#---------------
67$ipt -N DROPLOG
68$ipt -A DROPLOG -j $log $rlimit --log-prefix "[IPv4]: "
69$ipt -A DROPLOG -j DROP
70
71# CONFIGURATION
72#--------------
73echo 0 > /proc/sys/net/ipv4/ip_forward # Disable IP forward
74echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all # Disable Ping (echo replies)
75echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # Disable echo reply on broadcasts
76
77# DEFAULT RULES
78#--------------
79$ipt -P OUTPUT ACCEPT # Allow complete outbound traffic
80$ipt -A INPUT -i lo -j ACCEPT # Allows all incoming loopback traffic
81$ipt -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Allow incoming connections related to existing allowed connections
82$ipt -A INPUT -m conntrack --ctstate INVALID -j DROP # Explicitly drop invalid incoming traffic
83$ipt -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags ALL ALL -j DROP # Make portscanns
84$ipt -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags ALL NONE -j DROP # a bit harder.
85
86# INBOUND RULES
87#--------------
88$ipt -A INPUT -i eth0 -m conntrack --ctstate NEW -p udp --dport 5353 -j ACCEPT # DNS (Avahi)
89$ipt -A INPUT -i eth0 -m conntrack --ctstate NEW -p udp --dport 67:68 --sport 67:68 -j ACCEPT # DHCP
90$ipt -A INPUT -i eth0 -p tcp --dport 63879 -m recent --set --rsource --name MDNS_KNOCK1 -m limit --limit 5/min -j LOG --log-prefix "SSH PORT KNOCK STATE0 (MDNS) " --log-level 7
91$ipt -A INPUT -i eth0 -p tcp --dport 36978 -m recent --rcheck --rsource --seconds 5 --name MDNS_KNOCK1 -m recent --set --rsource --name MDNS_OPEN_DOOR -m limit --limit 5/min -j LOG --log-prefix "SSH PORT KNOCK STATE1 (MDNS) " --log-level 6
92$ipt -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --rcheck --rsource --seconds 15 --name MDNS_OPEN_DOOR -j ACCEPT
93
94#$ipt -A INPUT -i wg+ -p icmp --icmp-type 8 -j ACCEPT # ICMP on Wireguard interface
95#$ipt -A INPUT -i wg+ -d 192.168.28.1 -p tcp --dport 42341 -m recent --set --rsource --name WG_KNOCK1 -m limit --limit 5/min -j LOG --log-prefix "SSH PORT KNOCK STATE0 (WG) " --log-level 7
96#$ipt -A INPUT -i wg+ -d 192.168.28.1 -p tcp --dport 24143 -m recent --rcheck --rsource --seconds 5 --name WG_KNOCK1 -m recent --set --rsource --name WG_OPEN_DOOR -m limit --limit 5/min -j LOG --log-prefix "SSH PORT KNOCK STATE1 (WG) " --log-level 6
97#$ipt -A INPUT -i wg+ -d 192.168.28.1 -p tcp --dport 22 -m state --state NEW -m recent --rcheck --rsource --seconds 15 --name WG_OPEN_DOOR -j ACCEPT # Port knocking (open)
98
99# EXPLICITLY DROP EVERYTHING ELSE
100#--------------------------------
101$ipt -A INPUT -m conntrack --ctstate NEW -p 2 -j DROP #
102$ipt -A INPUT -m conntrack --ctstate NEW -p udp --dport 137 -j DROP # Drop some very
103$ipt -A INPUT -m conntrack --ctstate NEW -p udp --dport 138 -j DROP # annoying packets
104$ipt -A INPUT -m conntrack --ctstate NEW -p udp --dport 5355 -j DROP # without logging
105$ipt -A INPUT -m conntrack --ctstate NEW -p udp --dport 1900 -j DROP #
106$ipt -A INPUT -j DROPLOG # Log dropped packets
107$ipt -P INPUT DROP # Drop logged packets
108$ipt -A FORWARD -j DROPLOG
109$ipt -P FORWARD DROP
110
111# Save IPv4 configuration
112$ipt_save > $rules
113
114# IPv6 CONFIGURATION
115# ==================
116
117# VARIABLES
118# ---------
119ipt="$(which ip6tables)"
120ipt_save="$(which ip6tables-save)"
121ipt_restore="$(which ip6tables-restore)"
122rules="/etc/iptables/ip6tables.rules"
123
124# CLEANUP
125#--------
126flush_rules 'DROP'
127
128# DEFAULT CHAINS
129#---------------
130$ipt -N DROPLOG
131$ipt -A DROPLOG -j $log $rlimit --log-prefix "[IPv6]: "
132$ipt -A DROPLOG -j DROP
133
134# DEFAULT RULES
135#--------------
136$ipt -P OUTPUT ACCEPT # Allow complete outbound traffic
137$ipt -A INPUT -i lo -j ACCEPT # Allows all incoming loopback traffic
138$ipt -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Allow incoming connections related to existing allowed connections
139$ipt -A INPUT -m conntrack --ctstate INVALID -j DROP # Explicitly drop invalid incoming traffic
140$ipt -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags ALL ALL -j DROP # Make portscanns
141$ipt -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags ALL NONE -j DROP # a bit harder.
142
143# INBOUND RULES
144#--------------
145$ipt -A INPUT -p icmpv6 -d fd87:d87e:eb43:b44d:a7ea:73c4:ab0a:2e5b --icmpv6-type 128 -j ACCEPT # ICMPv6 Ping
146$ipt -A INPUT -i tun+ -d fd87:d87e:eb43:b44d:a7ea:73c4:ab0a:2e5b -p tcp --dport 443 -j ACCEPT # Forwarded to MX using socat
147
148$ipt -A INPUT -i tun+ -d fd87:d87e:eb43:b44d:a7ea:73c4:ab0a:2e5b -p tcp --dport 63725 -m recent --set --rsource --name OCAT_KNOCK1 -m limit --limit 5/min -j LOG --log-prefix "SSH PORT KNOCK STATE0 (OCAT) " --log-level 7
149$ipt -A INPUT -i tun+ -d fd87:d87e:eb43:b44d:a7ea:73c4:ab0a:2e5b -p tcp --dport 36527 -m recent --rcheck --rsource --seconds 5 --name OCAT_KNOCK1 -m recent --set --rsource --name OCAT_OPEN_DOOR -m limit --limit 5/min -j LOG --log-prefix "SSH PORT KNOCK STATE1 (OCAT) " --log-level 6
150$ipt -A INPUT -i tun+ -d fd87:d87e:eb43:b44d:a7ea:73c4:ab0a:2e5b -p tcp --dport 22 -m state --state NEW -m recent --rcheck --rsource --seconds 15 --name OCAT_OPEN_DOOR -j ACCEPT
151#$ipt -A INPUT -i tun+ -d fd87:d87e:eb43:b44d:a7ea:73c4:ab0a:2e5b -p tcp --dport 5555 --sport 5555 -m state --state NEW -m recent --rcheck --rsource --seconds 15 --name OCAT_OPEN_DOOR -j ACCEPT # Wireguard - Port knocking (open)
152
153# EXPLICITLY DROP EVERYTHING ELSE
154#--------------------------------
155$ipt -A INPUT -p icmpv6 --icmpv6-type 136 -j DROP # Drop
156$ipt -A INPUT -p icmpv6 --icmpv6-type 135 -j DROP # some
157$ipt -A INPUT -p icmpv6 --icmpv6-type 133 -j DROP # very
158$ipt -A INPUT -p udp --dport 546 -j DROP # annoying
159$ipt -A INPUT -p udp --dport 5353 -j DROP # pakets silently
160$ipt -A INPUT -j DROPLOG # Log dropped packets
161$ipt -P INPUT DROP # Drop logged packets
162$ipt -A FORWARD -j DROPLOG
163$ipt -P FORWARD DROP
164
165# Save IPv6 configuration and exit gracefully:
166$ipt_save > $rules && exit 0
Konfiguration: Client
Ein Autostart von TOR ist auf dem Client sicherlich nicht zwingend erforderlich, hier genügt es die Dienste manuell zu starten:
1$ sudo systemctl start tor
2$ sudo systemctl start onioncat
Sobald TOR verbunden ist, sollte kurz darauf auch der Onioncat-Dienst verfügbar und somit die IPv6-Adresse des Gateways erreichbar sein.
Bei einem initialen Verbindungsaufbau dürfte in etwa folgendes im systemd journal zu lesen sein.
Die hidden-service ID meines Gateways lautet hier wrg2p2ttysvquls3.onion und die Onioncat Adresse fd87:d87e:eb43:b44d:a7ea:73c4:ab0a:2e5b.
1$ sudo journalctl -f -u onioncat
2
3[4:connector : info] trying to connect to "wrg2p2ttysvquls3.onion" [fd87:d87e:eb43:b44d:a7ea:73c4:ab0a:2e5b] on 11
4[4:connector : info] SOCKS connection successfully opened on fd 11
5[4:connector : info] inserting peer fd 11 to active peer list
6[3:acceptor : info] connection 12 [0] accepted on listener 6 from 127.0.0.1 port 57330
7[3:acceptor : info] inserting peer fd 12 to active peer list
Der Verbindungsaufbau kann je nach Bandbreite beider Parteien (bzw. Qualität der Onion-Netzwerkverbindung) mehrere Sekunden (mitunter sogar Minuten) in Anspruch nehmen. Danach werden Ping-Anfragen normal beantwortet:
1$ ping fd87:d87e:eb43:b44d:a7ea:73c4:ab0a:2e5b
2
3PING fd87:d87e:eb43:b44d:a7ea:73c4:ab0a:2e5b(fd87:d87e:eb43:b44d:a7ea:73c4:ab0a:2e5b) 56 data bytes
464 bytes from fd87:d87e:eb43:b44d:a7ea:73c4:ab0a:2e5b: icmp_seq=3 ttl=64 time=367 ms
564 bytes from fd87:d87e:eb43:b44d:a7ea:73c4:ab0a:2e5b: icmp_seq=4 ttl=64 time=306 ms
664 bytes from fd87:d87e:eb43:b44d:a7ea:73c4:ab0a:2e5b: icmp_seq=5 ttl=64 time=367 ms
Wenn eine Weile keine Daten ausgetauscht wurden, kann es bei erneutem Verbindungsaufbau wieder etwas dauern. Hier hilft es u.U. das Journal im Auge zu behalten, um andere Fehler auszuschließen.
Wenn der Onioncat-Tunnel besteht sollte der freigegebene, interne Dienst - in meinem Fall - auf Port 443 erreichbar sein:
1$ curl -ks https://[fd87:d87e:eb43:b44d:a7ea:73c4:ab0a:2e5b]:443
port-knocking
Um sich per SSH zum Gateway verbinden zu können, habe ich ein kleines Script geschrieben, dass mir die ganze
manuelle Arbeit abnimmt. Zuerst wird versucht eine Verbindung via mDNS aufzubauen, hierfür wird der avahi-daemon
gestartet. Wenn der Avahi-Hostname aoe.local innerhalb des angegebenen Timeout-Wertes nicht aufgelöst werden kann,
werden die TOR und Onioncat Dienste ausgeführt. Sobald ein Onioncat-Tunnel zustande gekommen ist, wird versucht eine
SSH-Verbindung zu öffnen. Optional kann zusätzlich noch ein VPN (Wireguard) verbunden werden, das weitere Konfigurationen
auf Gateway und Client voraussetzt.
knock.sh
1#!/usr/bin/env bash
2# shellcheck disable=SC2034
3
4declare -A MDNS=( [addr]='aoe.local' [ports]='63879,36978' [timeout]='5' [deps]='avahi-daemon.service' )
5declare -A ONIONCAT=( [addr]='fd87:d87e:eb43:b44d:a7ea:73c4:ab0a:2e5b' [ports]='63725,36527' [timeout]='300' [deps]='tor,onioncat' )
6declare -A WIREGUARD=( [addr]='192.168.28.1' [ports]='42341,24143' [timeout]='100' [deps]='wireguard-client@wg0' )
7
8SSH='ssh -qo UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
9PROTOCOLS=('MDNS' 'ONIONCAT' 'WIREGUARD')
10
11function check_deps() {
12 declare -n _proto="$1" # MDNS|ONIONCAT|WIREGUARD
13 IFS=',' read -ra _services <<< "${_proto[deps]}"
14
15 for service in "${_services[@]}"; do
16 if ! systemctl -q is-active "$service"; then
17 sudo systemctl start "$service"
18 fi
19 done
20}
21
22function knock() {
23 local _proto="$1" # 4|6
24 local _ip="$2"
25 IFS=',' read -ra _ports <<< "$3"
26
27 echo -n "Knocking on ${_ip}: "
28 i=0
29 for port in "${_ports[@]}"; do
30 nc "-${_proto}" -w 1 "$_ip" "$port" >/dev/null 2>&1
31 ((i++))
32 if [[ "$i" -ne "${#_ports[@]}" ]]; then
33 echo -n "${port}, "
34 else
35 echo "${port}"
36 fi
37 done
38}
39
40function connect() {
41 local _proto="$1" # MDNS|ONIONCAT|WIREGUARD
42 declare -n _params="$_proto"
43 local _t
44
45 case "$_proto" in
46 MDNS)
47 echo -n 'Trying to resolve hostname using mDNS..'
48 res=$(timeout "${_params[timeout]}" avahi-resolve-host-name -4 -n "${_params[addr]}" 2>&1 | awk '{print $2}')
49 if [[ "$res" == *to* ]] || [[ "$res" == *SIGTERM,* ]]; then
50 echo 'failed'
51 return 1
52 else
53 echo 'resolved'
54 knock 4 "$res" "${_params[ports]}"
55
56 $SSH "$USER@${res}"
57 exit 0
58 fi
59 ;;
60 ONIONCAT)
61 echo -n 'Initialising onioncat tunnel..'
62 _t=0
63 until ping -6 -w1 -c1 "${_params[addr]}" >/dev/null 2>&1; do
64 echo -n '.' && ((_t++))
65 if [[ "$_t" -eq "${_params[timeout]}" ]]; then
66 echo 'failed'
67 echo "Error: Unable to establish IPv6 (ocat) tunnel"
68 return 2
69 fi
70 done && echo 'done'
71
72 knock 6 "${_params[addr]}" "${_params[ports]}"
73
74 $SSH "$USER@${_params[addr]}"
75 exit 0
76 ;;
77 WIREGUARD)
78 echo -n 'Initialising VPN..'
79 _t=0
80 until ping -w1 -c1 "${_params[addr]}" >/dev/null 2>&1; do
81 echo -n '.' && ((t++))
82 if [[ "$_t" -eq "${_params[timeout]}" ]]; then
83 echo 'failed'
84 echo "Error: Unable to establish VPN (WireGuard) connection"
85 return 3
86 fi
87 done && echo 'done'
88
89 knock 6 "${_params[addr]}" "${_params[ports]}"
90
91 $SSH "$USER@${_params[addr]}"
92 exit 0
93 ;;
94 esac
95}
96
97for proto in "${PROTOCOLS[@]}"; do
98 check_deps "$proto"
99 connect "$proto"
100done
Um sich per SSH zum Gateway zu verbinden, genügt es das Script auszuführen:
Bzw. wenn man sich im gleichen Netzwerk wie das Gateway befindet:
