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 nodes
abrufen
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.
Erstellt mit Liebe 🧡 Block 775630 / 825673
– Lightning ⚡ (er)leben –