Ereignishorizont
Multi Node VPS

Multi Node VPS

Multi Node VPS

In dieser kleinen Ergänzung zum LNbits-Server Tutorial möchte ich kurz aufzeigen was man braucht, um mehrere Tunnel auf einem VPS einzurichten, so dass man gleich mehrer Nodes über einen VPS ins Clearnet bekommen kann. Zusätzlich habe ich auch die LNbits REST API für jeden Tunnel zum Node mit eingebracht. So kann der Besitzer des VPS die Finanzierungsquelle seines LNbits ganz einfach umschalten. Aufzeigen werde ich das hier nur Auszugsweise. Man benötigt also auch das ursprünglichen Tutorial.

Annahme:

  • Node 1 – LND Port 9735 / REST API Port 8080
  • Node 2 – LND Port 9736 / REST API Port 8081
  • Node 3 – LND Port 9737 / REST API Port 8082

Ergänzung zu 7.2 – VPS – Grundeinstellungen des Virtual Private Server

Hier müsst ihr die Portfreigabe für Node2 und Node3 eintragen / erweitern

UncomplicatedFirewall (UFW) installieren und einrichten

apt install ufw
ufw default deny incoming
ufw default allow outgoing
ufw allow 22 comment 'OpenSSH'
ufw allow 80 comment 'Standard Webserver'
ufw allow 443 comment 'SSL Webserver'
ufw allow 9735 comment 'Node1' 
ufw allow 9736 comment 'Node2' 
ufw allow 9737 comment 'Node3' 
ufw enable   # -> y
ufw status   # -> Kontrollieren ob OpenSSH bzw. 22/tcp drin ist!

Ergänzung zu 7.3 – VPS – Docker installieren und einrichten

Hier müsst ihr die Ports im Docker für die zusätzlichen Nodes ergänzen und die zusätzlichen Nodes Zertifikate generieren. Was hier auch noch dazu kommt, bei mehreren Nodes macht es Sinn, jedem Node einen feste Tunnel IP zu vergeben. Ansonsten wird die IP vom Server frei vergeben. Wer nach einem Neustart des VPS zuerst anfragt, der bekommt die erste IP. Das ist etwas ungünstig, wenn man die Routings in der iptables Firewall festlegen möchte.

Starten des OpenVPN-Serverprozess

sudo docker run -v $OVPN_DATA:/etc/openvpn -d -p 1194:1194/udp -p 9735:9735 -p 8080:8080 -p 9736:9736 -p 8081:8081 -p 9737:9737 -p 8082:8082 --cap-add=NET_ADMIN --restart unless-stopped kylemanna/openvpn 

Generieren eines Client-Zertifikat ohne Passphrase für die nodes

sudo docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full node1 nopass
sudo docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full node2 nopass
sudo docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full node3 nopass

Clientkonfiguration mit eingebetteten Zertifikaten für die nodesabrufen

sudo docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient node1 > node1.ovpn  
sudo docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient node2 > node2.ovpn  
sudo docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient node3 > node3.ovpn  

NEU – Den VPN Tunnel für jeder Node eine fest IPs zuweisen

Um die Daten für das Docker Volumen zu barbeiten, musst du vorher zum Superuser/root-Konto wechseln

sudo su
cd /var/lib/docker/volumes/ovpn-data/_data/ccd/
nano node1
  • füll mit: ifconfig-push 192.168.255.6 192.168.255.5
  • STRG-x -> y -> ENTER

Wiederholen das Ganze für den zweiten Node z.B.

nano node2

-> fill with: ifconfig-push 192.168.255.10 192.168.255.9 -> STRG-x -> y -> ENTER

Der dritte Knoten bekommt die IP-Endung „.14“ / „.13“ und der vierte Knoten bekommt die .18 / .17. Der Node Seite des Tunnels, wird immer die höhere Nummer zugewiesen, z.B. .6 und der Server bekommt die ".5".

Info: Beispielhafte IP Vergabe für volle Kompatibilität bei mehreren Nodes:

[  1,  2] [  5,  6] [  9, 10] [ 13, 14] [ 17, 18] [ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] ..

Um die Einstellungen zu aktivieren, startet den VPS einmal neu $ reboot. Alternativ kann man auch nur den Docker-Container neu starten $ docker restart <Docker-ID> und dann mit $ exit den Superuser/Root verlassen.

Hinweis: Nach dem ihr auf der Node OpenVPN installiert und eingerichtet habt, könnt ihr dort mit dem Befehl $ ip add show tun0 prüfen, ob ihr die vergebene IP bekommen habt.

Die Container ID anzeigen lassen

sudo docker ps   # -> zeigt den Status, die ID des Container und die Ports

Den Pfad zu den nodex.ovpn Dateien anzeigen lassen

pwd   # -> Zeigt den aktuellen Pfad
ls   # -> Sollte jetzt die Datei node1.ovpn anzeigen

Ergänzung zu 7.4 – Node – OpenVPN einrichten

Jetzt müsst ihr natürlich auf jedem Node das induviduelle Zertifikat herunterladen und einrichten. Hier Beispielhaft für Node2.

Das Zertifikat von dem VPS herunterladen

Achtung: IP und ggf. die Pfade anpassen

scp synonym@111.111.111.111:/home/synonym/node2.ovpn /home/admin/VPNcert/

-> Ihr müsst den neuen "Fingerprint" einmal bestätigen und dann euer User Passwort eingeben

Schreib- und Leserechte nur für den Benutzer zuweisen

sudo chmod 600 /home/admin/VPNcert/node2.ovpn

OpenVPN installieren und einrichten

Achtung: Auch hier ggf. den Pfad oder Name anpassen

sudo apt-get install openvpn -y
sudo cp -p /home/admin/VPNcert/node2.ovpn /etc/openvpn/CERT.conf
sudo systemctl enable openvpn@CERT
sudo systemctl start openvpn@CERT
sudo systemctl status openvpn@CERT 

-> Achtet auf auf folgende Zeilen:

..
net_iface_up: set tun0 up
net_addr_ptp_v4_add: 192.168.255.10 peer 192.168.255.9 dev tun0
..

Hier sollte jetzt auch automatisch die vorher festgegeben IPs 192.168.255.10/.9 angezeigt werden.

Ergänzung zu 7.5 – VPS – Paketregeln für den Docker festlegen

Docker Shell aufrufen

sudo docker ps   # -> nochmal die ID anzeigen lassen
sudo docker exec -it b7a78bb8b394 sh   # -> Shell starten

Info: Mit dem leicht erweiterten Befehl $ sudo docker ps -a könnt ihr auch nicht gestartet Container und ihren Status sehen.

Im Docker die Paketregeln für die Firewall festlegen

Achtung: Denk daran die IP (siehe voriges Kapitel) und die Ports zu prüfen

iptables -A PREROUTING -t nat -i eth0 -p tcp -m tcp --dport 9735 -j DNAT --to 192.168.255.6:9735
iptables -A PREROUTING -t nat -i eth0 -p tcp -m tcp --dport 8080 -j DNAT --to 192.168.255.6:8080
iptables -A PREROUTING -t nat -i eth0 -p tcp -m tcp --dport 9736 -j DNAT --to 192.168.255.10:9736
iptables -A PREROUTING -t nat -i eth0 -p tcp -m tcp --dport 8081 -j DNAT --to 192.168.255.10:8081
iptables -A PREROUTING -t nat -i eth0 -p tcp -m tcp --dport 9737 -j DNAT --to 192.168.255.14:9737
iptables -A PREROUTING -t nat -i eth0 -p tcp -m tcp --dport 8082 -j DNAT --to 192.168.255.14:8082
iptables -t nat -A POSTROUTING -d 192.168.255.0/24 -o tun0 -j MASQUERADE

Hinweis 1:Überprüfen könnt ihr die IPs auf dem Node mit Befehl: $ sudo systemctl status openvpn@CERT

Hinweis 2: Denkt auch daran, dass die Ports die ihr hier für den LND Nodes und für die REST API vergebt, auch auf der Node Seite in der ufw (uncomplicated firewall) freigegeben sind, sonst funktioniert es nicht!!!

Die Regel dauerhaft speichern

Damit die Packetregeln auch nach dem nächsten Neustart geladen werden, bleiben wir in der Docker Shell und müssen noch die Skript Datei ovpn_env.sh editieren.

cd /etc/openvpn
vi ovpn_env.sh   # -> Editor öffnet

Es wurde jetzt der vi-Editor. Die Bedienung ist etwas ungewöhnlich, aber wenn ihr genau die Schritte befolgt, solltet ihr zum Ziel kommen. Ein Befehlsübersicht findet ihr sonst aber auch hier.

Zur Übung verlasst den Editor mal gleich:

  • ESC -> :q! -> ENTER -> Exit ohne speichern
  • Das :q! müsst ihr wirklich so eingeben

Jetzt öffnet den Editor wieder:

  • vi ovpn_env.sh
  • setzte den Cursor zur letzten Linie -> G (=> großes "G" -> Shift+g)
  • geht in den Editiermodus -> a (kleines "a")
  • eine Zeile umschlagen -> ENTER
    • jetzt die "iptabels" Zeile von oben hineinkopieren
  • ESC -> Editiermodus verlassen
    • :wq -> Änderungen speichern und schließen

Wenn ihr fertig seid, verlasst auch die Docker Shell wieder:

exit

Ergänzung zu 7.6 – Node – Die lnd.conf anpassen

Auf dem Node müsst ihr jetzt natürlich erstmal die Firewall Port freigeben. Beispielhaft mache ich das hier mal für den Node2 mit dem LND Port 9736 und REST API Port 8081. Beim Raspiblitz müsst ihr zusätzlich auch noch darauf achten das ihr lnd_check.sh Skript anpasst. Sonst werden euch die Ports in der lnd.conf beim nächsten Neustart einfach überschrieben.

NEU Edit Firewall

sudo ufw allow 9736 comment 'VPS Tunnel LND Node2' 
sudo ufw allow 8081 comment 'VPS Tunnel REST Node2' 
sudo ufw status

Hier könnt ihr prüfen ob die Ports (9735, 9736,..) für den LND Node offen sind. https://www.yougetsignal.com/tools/open-ports/ Das funktioniert nur wenn der LND im Betrieb ist und normal arbeitet. Die REST Ports (8080, 8081,..) könnt ihr damit nicht prüfen, da die ufw des VPS die Ports nicht freigegeben hat und auch nicht muss, da LNbits von dem VPS über den Tunnel auf den LND zugreift und nicht über das Internet.

LND.conf editieren

cd /mnt/hdd/lnd/
sudo nano lnd.conf

-> Folgende Zeile überprüfen und ggf. anpassen:

[Application Options]
..
nat=false   # -> prüfen und auf "false" stellen
listen=0.0.0.0:9736   # -> prüfen
restlisten=0.0.0.0:8081   # -> prüfen
externalip=111.111.111.111:9736
tlsextraip=172.17.0.2
..
[tor]
..
tor.streamisolation=false
tor.skip-proxy-for-clearnet-targets=true

Besonderheit: NUR beim Raspiblitz

Das lnd_check.sh Skript überprüft die lnd.conf und könnte eure Einstellungen überschreiben. Deswegen müsste ihr hier ein paar Zeile auskommentieren.

Ruft in dem Skript die Zeilen ab 184 auf:

sudo nano +184 /home/admin/config.scripts/lnd.check.sh

Kommentiert folgende Zeile mit # aus:

..
#  setting ${lndConfFile} ${insertLine} "restlisten" "0\.0\.0\.0\:${portprefix}8080"

#  # enforce LND port is set correctly (if set in raspiblitz.conf)
#  if [ "${lndPort}" != "" ]; then
#    setting ${lndConfFile} ${insertLine} "listen" "0\.0\.0\.0\:${portprefix}${lndPort}"
#  else
#    lndPort=9735
#  fi

#  # enforce PublicIP if (if not running Tor)
#  if [ "${runBehindTor}" != "on" ]; then
#    setting ${lndConfFile} ${insertLine} "externalip" "${publicIP}:${lndPort}"
#  else
#    # when running Tor a public ip can make startup problems - so remove
#    sed -i '/^externalip=*/d' ${lndConfFile}
#  fi
..

-> Speichern und schließen mit STRG+x -> y -> ENTER

Hinweis: Ihr könnt Bitcoin Core, LND und andere Applikationen manuell updaten, aber ein komplettes Update eures Node, auf eine neue Version, wird wahrscheinlich genau diese Datei überschrieben und euer Node läuft dann nur noch über TOR! Und wenn ihr mehrere Nodes über den VPS laufen habt, oder generell induviduelle Ports vergeben habt, wird bei den Nodes, die einen anderen LND-Port als 9735 bzw. REST-Port als 8080 haben, die LND.conf automatisch überschrieben. Der Node funktioniert zwar noch, aber nur über TOR und die LNbits Logs zeigen Retrying connection to backend in 5 seconds... | The backend for LndRestWallet isn't working properly. Behaltet das also im Hinterkopf, das ist ein heimtückischer Fehler. Ob die Port frei sind, könnte ihr z.B. hiermit testen.

Den LND einmal neu starten

sudo systemctl restart lnd.service 

-> Beide Befehle können etwas dauern, habt Geduld

Prüfen ob sich das Zertifikat und der Schlüssel geändert hat

ls -l 

-> Datum und Uhrzeit (GTM) der tls.cert und tls.key Dateien muss sich aktualisiert haben, sofern ihr eine für die Zertifikate Änderung gemacht habt!

Verbindungstest

Testet mal man von euer Node den Google Server erreichen kann:

ip route get 8.8.8.8

-> Ihr sollte 8.8.8.8 via 192.168.255.9 dev tun0 src 192.168.255.10 zurück bekommen

Hinweis zu Ride The Lightning (RTL)

RTL nutzt standard mäßig den REST Port 8080 um auf LND zuzugreifen. Deswege kommt die Fehlermeldung Error 503 - Unable to Connect to LND Server beim Aufrufen der Webseite, wenn ihr den REST Port 8080 in LND ändert. Die Änderung des Ports müsst ihr also auch RTL bekannt geben. Der Port wird in dem File /mnt/hdd/app-data/rtl/RTL/RTL-Config.json definiert, allerdings wird die JSON beim Raspiblitz immer vom Startskript /home/admin/config.scripts/bonus.rtl.sh überschrieben. Deswegen müsst ihr das editieren.

sudo nano /home/admin/config.scripts/bonus.rtl.sh
  • Jetzt suchen nach "lnServerUrl" mit: STRG+w -> lnServerUrl -> ENTER
  • Den Port für lnServerUrl von 8080 auf z.B. 8081 für den zweiten Node ändern
  • Dann den RTL.service einmal neu starten
sudo systemctl restart RTL.service

Hinweis: Für Thunderhub braucht ihr das nicht, da TH den RPC Port 10009 anstatt des REST Port verwendet.

ENDE

Alles weiter ist im Prinzip gleich mit dem ursprünglichen Tutorial.

-> zurück zu LNbits Server

Erstellt mit Liebe 🧡 Block 775630 / 825673

– Lightning ⚡ (er)leben –