Copyright © KC Green

Monero Full-Node als HiddenService unter aarch64

 cryptocurrency   howto 

Monero Full-Node (mit gestutzter Blockchain) unter Raspberry Pi4 betreiben und als HiddenService über TOR verfügbar machen

Egal mit welcher Cryptowährung man hantiert, es empfiehlt sich immer eine eigene Kopie der Blockchain zu besitzen, nicht nur um - im Falle transparenter Transaktionen - Einsicht zu erhalten, sondern primär um sich vor potentiellen Angriffen zu schützen, sich unabhängig von remote nodes zu machen und natürlich um das Netzwerk zu unterstützen. Nur so kann man den großen Vorteil einer Blockchain - die Dezentralität - überhaupt erst sinnvoll nutzen.

Insbesondere bei privacy coins, wie Monero - aber natürlich auch bei allen anderen Cryptowährungen - lohnt es sich, seinen Node via TOR (oder einem anderen Anonymisierungsnetzwerks wie I2P) als HiddenService bereitzustellen und sich auf diese Weise von seinem lokalen PC aus zu verbinden.

Man sollte sich allerdings gewahr sein, dass in diesem Setup der eigene Node über das Clearnet mit dem p2p Netzwerk kommuniziert. Lediglich der RPC-Dienst wird als HiddenService verfügbar gemacht. Mindestens der eigene ISP ist so in der Lage festzustellen, das man einen Monero-Node betreibt. Aktuell wird im Monero Projekt viel an der Integration von TOR gearbeitet, so wird es zukünftig noch weitere Möglichkeiten geben.

Die Verwendung eines Anonymisierungsnetzwerks unterbindet effektiv Angriffe auf die Privatsphäre beispielsweise durch Sybil attacks:

The Sybil attack in computer security is an attack wherein a reputation system is subverted by creating multiple identities. A reputation system's vulnerability to a Sybil attack depends on how cheaply identities can be generated, the degree to which the reputation system accepts inputs from entities that do not have a chain of trust linking them to a trusted entity, and whether the reputation system treats all entities identically.

Wikipedia (EN)

Mehr hierzu auch in einem tollen Video von Justin Ehrenhofer, indem er anschaulich erklärt, wie Sybil attacks in der Monero-Welt funktionieren:


## Einrichtung des Raspberry Pis und Kompilierung der Monero Quellen

Ich gehe davon aus, das der RPi4 unter ARM in 64bit läuft (aarch64). Offenbar aus lizenzrechtlichen Gründen bringt die CPU des Raspberry Pis keine Unterstützung für manche Crypto-Erweiterungen wie z.B. AES mit. Dies bedeutet, das wir nicht in der Lage sind die offizielle, vorkompilierte Binärdatei für armv8 von github.com/monero-project/monero/releases zu verwenden, sondern müssen unseren monerod selbst bauen, ohne die Verwendung der Hardwarebeschleunigung für AES.

Alle benötigten Abhängigkeiten für diverse Linux-Systeme sind im Github Projekt unter Compiling Monero from source -> Dependencies zu finden. Wenn alles installiert wurde, können wir eine lokale Kopie des Git Repositories erzeugen und die Module herunterladen:

git clone --recursive https://github.com/monero-project/monero && cd monero
git checkout release-v0.17

Danach können wir die Programme kompilieren. Wir verwenden n-1 der zur Verfügung stehenden Kerne, damit noch etwas Luft bleibt:

make NO_AES=ON -j$(($(nproc)-1))

Auf meinem RPi4 mit 4 CPU Kernen @ 1.5GHz und 4GB RAM, brauchte der Kompilierungsprozess - unter Verwendung von 3 Kernen - über 12h.

Sollte der Build-Prozess nach sehr kurzer Zeit mit folgendem Fehler abbrechen:

Generating embedded translations header
make[6]: ./generate_translations_header: Permission denied
make[6]: *** [CMakeFiles/generate_translations_header.dir/build.make:105: generate_translations_header] Error 127

Muss sichergestellt sein, dass eure Partition mit dem execute flag gemountet ist: mount -o remount,rw,exec /monero

Wenn es später weitere Fehler geben sollte, ebenfalls erneut starten, aber diesmal ohne Parallelisierung der build jobs (via -j1).

Im Anschluss kann man die Programme zum System-PATH hinzufügen:

sudo cp bin/monero* /usr/local/bin/

Synchronisation der Blockchain

Im Januar 2019 wurde mit pruning ein neues Feature zum Monero Daemon hinzugefügt, das ermöglicht, die Größe der lokalen Blockchaindaten um etwa 2/3 zu verringern. Die so gestutzte Blockchain ist weiterhin voll intakt und unterstützt weiterhin das Netzwerk. Eine bereits bestehenden, volle Blockchaindatenbank kann zwar auch nachträglich gestutzt werden, effektiver ist es aber wohl, wenn man die Blockchain direkt mit entsprechenden Parameter synchronisiert.

Eine gestutzte Blockchain benötigt aktuell ca. 30 GB. Hierfür habe ich eine externe Festplatte via USB an den RPi4 angebunden:

grep monero /etc/fstab

UUID=da3c9d86-635e-4ea9-bb49-fbc00dea8053 /monero ext4 auto,nosuid,nodev,rw,user 0 2

Als Benutzer unter dem der Monero daemon laufen soll (bei mir: “monero:monero”), synchronisieren wir initial die komplette Blockchain:

mkdir -p /monero/logs
/usr/local/bin/monerod --log-file /monero/logs/monerod.log \
  --data-dir /monero --prune-blockchain

Je nach Bandbreite, wird dies einige Zeit in Anspruch nehmen.

Installation von TOR und Konfiguration der Dienste

Als nächstes benötigen wir tor und torsocks. Beides sollte über den Paketmanager der jeweiligen Linux Distribution verfügbar sein. Dann müssen wir mit root zwei Zeilen zur TOR-Konfiguration - je nach Distribution unter /etc/torrc oder /etc/tor/torrc - hinzufügen, um den HiddenService für den RCP-Dienst des Monero Daemons zu aktivieren:

HiddenServiceDir /var/lib/tor/monero-node/
HiddenServicePort 18081 127.0.0.1:18081

Anschließend kann der TOR Daemon aktiviert und gestartet werden:

sudo systemctl enable --now tor.service

Sobald der tor Daemon mit dem TOR-Netzwerk verbunden ist, kann man sich die Onion-Adresse seines HiddenService anzeigen lassen:

sudo cat /var/lib/tor/monero-node/hostname

Optional: Um den Zugriff auf den RPC Port des Monero Daemons mit einem Passwort zu schützen, können wir eine Konfigurationsdatei anlegen. /var/lib/monero ist das Heimatverzeichnis meines Benutzers unter dem der Daemon läuft, $USER und $PASS müssen ersetzt werden:

cat << EOF > /var/lib/monero/bitmonero.conf
restricted-rpc=1
rpc-login=$USER:$PASS
EOF

Anschließend können wir auch ein systemd unitfile für unseren Monero Daemon erzeugen, aktivieren und starten.

systemctl cat monerod

# /etc/systemd/system/monerod.service
[Unit]
Description=Monero Full Node
After=network.target

[Service]
User=monero
Group=monero
WorkingDirectory=/var/lib/monero
RuntimeDirectory=monero
StateDirectory=monero
LogsDirectory=monero

Type=simple
Environment=DNS_PUBLIC=tcp
Environment=TORSOCKS_ALLOW_INBOUND=1
ExecStart=/usr/bin/torsocks /usr/local/bin/monerod \
  --config-file /var/lib/monero/bitmonero.conf --non-interactive \
  --data-dir /monero --log-file /monero/logs/monerod.log --log-level 0 \
  --prune-blockchain --no-igd

Restart=always

[Install]
WantedBy=multi-user.target

Mit folgendem RPC-Call kann die Verbindung und Funktionalität des Daemons getestet werden:

NODE_HIDDEN_SERVICE="$(sudo cat /var/lib/tor/monero-node/hostname)"
curl --socks5-hostname 127.0.0.1:9050 -u $USER:$PASS --digest \
  -X POST http://${NODE_HIDDEN_SERVICE}:18081/json_rpc \
  -d '{"jsonrpc":"2.0","id":"0","method":"get_info"}' \
  -H 'Content-Type: application/json'

Anbindung des eigenen Monero Nodes

Um den eigenen remote node nun zu verwenden, muss man beim offiziellen Konsolen-Client monero-wallet-cli folgende Parameter angeben. Selbstverständlich muss auch lokal tor installiert und mit dem Onion-Routing Netzwerk verbunden sein.

monero-wallet-cli --wallet-file /Pfad/zur/Wallet/Datei \
  --proxy 127.0.0.1:9050 \
  --trusted-daemon --daemon-address $NODE_HIDDEN_SERVICE:18081 \
  --daemon-login $USER:$PASS