EarthNode Setup Guide
Follow this step-by-step guide to set up your EarthNode and join the blockchain-powered sharing economy.
Setup Information
Who is this guide for?
This guide is designed for EarthNode Operators looking to set up their EarthNode server. Whether you're new to decentralized telecom or experienced in blockchain technology, this guide will help you get started quickly and efficiently.
What is in this guide?
Discover best practices for setting up, securing, and maintaining your EarthNode server. Learn how to ensure optimal performance and contribute effectively to the decentralized World Mobile network.
What are the requirements?
- Owning an ENNFT (EarthNode Non-Fungible Token) - Machine requirements (details coming soon)
Prerequisites
Operational Requirements
- ✓
Understand how to set up, operate, and maintain your Earth Node properly.
- ✓
Ensure your Earth Node runs continuously.
Technical Skills
- ✓
Automate tasks with bash scripting & cron jobs.
- ✓
Manage services with Systemd.
- ✓
Understand networking basics, including firewalls and connections.
- ✓
Monitor systems efficiently.
- ✓
Enhance server security.
Minimum Hardware Requirements (TBC)
- ✓
Server: 1-2 CPU cores, 4GB RAM, 64-bit Linux OS, 100GB+ storage.
- ✓
Air-gapped offline machine for secure tasks.
- ✓
Stable broadband.
- ✓
Reliable power supply.
- ✓
Earth Node NFT in your wallet.
Initial Setup
Before we start, we recommend you to:
Step 1.1: SSH to Your Server as Root
1.1 Connect to Your Server
Use the SSH command below to log in to your server with the root
user. Replace server.public.ip.address
with your server's public IP address.
Output Example
After running the command, your terminal should look like this:
root@vps:~# ssh [email protected]
The authenticity of host '77.22.161.10 (77.22.161.10)' can't be established.
ED25519 key fingerprint is SHA256:xXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '77.22.161.10' (ED25519) to the list of known hosts.
[email protected]'s password: ********
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-144-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
Last login: Sun Jan 11 14:45:22 2025 from 192.168.1.5
root@vps:~#
What Does the Warning Mean?
When connecting to a server for the first time, SSH verifies the authenticity of the server by asking if you want to continue connecting. This step ensures that you're not unintentionally connecting to an untrusted or malicious server. By entering yes
, SSH saves the server's public key to your local machine in the ~/.ssh/known_hosts
file. The warning message confirms that the server has been added to this file, preventing the same question on future connections unless the server's key changes.
Step 1.2: Create a New User
Commands
Run the following commands to create a new user and grant them administrative privileges:
sudo useradd -m -s /bin/bash eno
sudo passwd eno
sudo usermod -aG sudo eno
Output Example
Below is an example of what the terminal output looks like after creating and configuring the user:
root@vps:~# sudo useradd -m -s /bin/bash eno
root@vps:~# sudo passwd eno
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
root@vps:~# sudo usermod -aG sudo eno
User 'eno' has been successfully created and added to the sudo group.
Step 1.4: Disable Shell Command History
Commands
Run the following commands to prevent shell history from storing commands system-wide:
echo 'export HISTFILE=/dev/null' | sudo tee -a /etc/profile /etc/bash.bashrc
echo 'export HISTSIZE=0' | sudo tee -a /etc/profile /etc/bash.bashrc
echo 'export HISTFILESIZE=0' | sudo tee -a /etc/profile /etc/bash.bashrc
echo 'set +o history' | sudo tee -a /etc/profile /etc/bash.bashrc
echo -e '#!/bin/bash
history -c && history -w' | sudo tee /etc/bash.bash_logout > /dev/null
sudo chmod +x /etc/bash.bash_logout
while IFS=: read -r username _ uid _ home _; do
if [ "$uid" -ge 1000 ] && [ -d "$home" ]; then
echo 'export HISTFILE=/dev/null' | sudo tee -a "$home/.bashrc" "$home/.profile";
echo 'export HISTSIZE=0' | sudo tee -a "$home/.bashrc" "$home/.profile";
echo 'export HISTFILESIZE=0' | sudo tee -a "$home/.bashrc" "$home/.profile";
echo 'set +o history' | sudo tee -a "$home/.bashrc" "$home/.profile";
echo -e '#!/bin/bash
history -c && history -w' | sudo tee "$home/.bash_logout" > /dev/null;
sudo chmod +x "$home/.bash_logout";
fi
done < <(getent passwd)
history -c && history -w
Output Example
After running the commands, your terminal should display the following:
export HISTFILE=/dev/null
export HISTSIZE=0
export HISTFILESIZE=0
set +o history
history -c && history -w
Step 1.3: Deactivate the Root Account
Command
Run the following command to disable the root account and prevent direct login:
sudo passwd -l root
Output Example
Below is an example of the terminal output after disabling the root account:
root@vps:~# sudo passwd -l root
passwd: password expiry information changed.
Root account has been successfully disabled.
Step 1.4: Set the Hostname
Steps
Follow these steps to set the hostname:
sudo nano /etc/hostname
# Replace content with: EN123
# To save and exit Nano:
# Press Ctrl+O, Enter to save the file.
# Then press Ctrl+X to exit Nano.
sudo nano /etc/hosts
127.0.0.1 localhost
127.0.1.1 EN123 -- update this value
# To save and exit Nano:
# Press Ctrl+O, Enter to save the file.
# Then press Ctrl+X to exit Nano.
sudo hostnamectl set-hostname EN123 --static --pretty --transient
ping EN123
Output Example
root@vps:~# sudo nano /etc/hostname
root@vps:~# sudo nano /etc/hosts
127.0.0.1 localhost
127.0.1.1 EN123
root@vps:~# sudo hostnamectl set-hostname EN123 --static --pretty --transient
root@vps:~# ping EN123
PING EN123 (192.168.1.100) 56(84) bytes of data.
64 bytes from EN123 (192.168.1.100): icmp_seq=1 ttl=64 time=0.045 ms
Step 1.5: Update the System
Commands
Run the following commands to update the system:
sudo apt-get update -y && sudo apt-get upgrade -y
sudo apt-get autoremove
sudo apt-get autoclean
Output Example
root@vps:~# sudo apt-get update -y && sudo apt-get upgrade -y
Reading package lists... Done
Building dependency tree... Done
Calculating upgrade... Done
The following packages will be upgraded:
package1 package2 package3
1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 10.2 MB of archives.
After this operation, 12.3 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
root@vps:~# sudo apt-get autoremove
Reading package lists... Done
Building dependency tree... Done
0 packages to remove.
root@vps:~# sudo apt-get autoclean
root@vps:~#
Step 1.6: Install and Configure Unattended-Upgrades
Commands
Run the following commands to install and configure unattended-upgrades
:
# Install unattended-upgrades
sudo apt-get install unattended-upgrades -y
sudo dpkg-reconfigure -plow unattended-upgrades # Say 'Yes' when prompted
# Configure Automatic Updates & Disable Auto Reboot
sudo tee /etc/apt/apt.conf.d/50unattended-upgrades << EOF
Unattended-Upgrade::Origins-Pattern {
"o=Ubuntu,a=$(lsb_release -sc)-security"; # Apply security updates
"o=Ubuntu,a=$(lsb_release -sc)-updates"; # Apply recommended updates
};
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::SyslogEnable "true";
Unattended-Upgrade::Verbose "true"; # Enable logging of updates
EOF
# Enable and Start the Service
sudo systemctl enable unattended-upgrades
sudo systemctl start unattended-upgrades
# Schedule a Weekly Full System Upgrade (No Reboots)
sudo tee /etc/cron.weekly/system-upgrade << 'EOF'
#!/bin/bash
apt-get update && apt-get dist-upgrade -y && apt-get autoremove -y && apt-get autoclean -y
echo "System upgrade completed. Please check if a reboot is required: sudo cat /var/run/reboot-required"
EOF
sudo chmod +x /etc/cron.weekly/system-upgrade
Output Example
root@vps:~# sudo apt-get install unattended-upgrades -y
Reading package lists... Done
Building dependency tree... Done
The following NEW packages will be installed:
unattended-upgrades
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 54.0 kB of archives.
After this operation, 238 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
root@vps:~# sudo dpkg-reconfigure -plow unattended-upgrades
Configuring unattended-upgrades
[Prompt: Enable automatic updates?]
Yes
root@vps:~# sudo tee /etc/apt/apt.conf.d/50unattended-upgrades << EOF
Unattended-Upgrade::Origins-Pattern {
"o=Ubuntu,a=$(lsb_release -sc)-security";
"o=Ubuntu,a=$(lsb_release -sc)-updates";
};
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::SyslogEnable "true";
Unattended-Upgrade::Verbose "true";
EOF
root@vps:~# sudo systemctl enable unattended-upgrades
Created symlink /etc/systemd/system/multi-user.target.wants/unattended-upgrades.service → /lib/systemd/system/unattended-upgrades.service.
root@vps:~# sudo systemctl start unattended-upgrades
root@vps:~#
root@vps:~# sudo tee /etc/cron.weekly/system-upgrade << 'EOF'
#!/bin/bash
apt-get update && apt-get dist-upgrade -y && apt-get autoremove -y && apt-get autoclean -y
echo "System upgrade completed. Please check if a reboot is required: sudo cat /var/run/reboot-required"
EOF
root@vps:~# sudo chmod +x /etc/cron.weekly/system-upgrade
Step 2.2: Verify Tailscale Status
Command
Run the following command on your VPS to verify the Tailscale connection:
tailscale status
Output Example
Below is an example of what the terminal output should look like after running the command:
root@vps:~# tailscale status
100.64.0.1 EN123 linux idle
100.64.0.2 your_computer windows online
100.64.0.3 third-device android online
Tailscale is running successfully.
Your VPS is connected to the Tailscale network.
Admin Console
Open the Tailscale admin console in your browser to confirm that your VPS appears as part of your Tailscale network. Look for the device name and IP address listed in the output above.
Step 3: Hardening SSH Configuration
Commands
Run the following commands to apply the hardened SSH configuration to your server:
sudo tee /etc/ssh/sshd_config << EOF
# Core security
PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM yes
PermitEmptyPasswords no
# User restrictions
AllowUsers eno
PermitUserEnvironment no
PermitUserRC no
X11Forwarding no
PermitTTY yes
StrictModes yes
EOF
sudo systemctl restart sshd
Output Example
Below is an example of what the terminal output should look like after running the commands:
root@vps:~# sudo tee /etc/ssh/sshd_config << EOF
# Core security
PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM yes
PermitEmptyPasswords no
# User restrictions
AllowUsers eno
PermitUserEnvironment no
PermitUserRC no
X11Forwarding no
PermitTTY yes
StrictModes yes
EOF
root@vps:~# sudo systemctl restart sshd
root@vps:~#
Step 4.1: Setup UFW (Uncomplicated Firewall)
Commands
Run the following commands to configure and enable the firewall:
sudo ufw reset
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow in on tailscale0
sudo ufw enable
Output Example
Below is an example of the terminal output you should see after running the commands:
root@vps:~# sudo ufw reset
Resetting all rules to installed defaults. This may disrupt existing ssh connections.
Proceed with operation (y|n)? y
Backing up existing rules to /etc/ufw/user.rules.20250111_123456
root@vps:~# sudo ufw default deny incoming
Default incoming policy changed to 'deny'.
(Be sure to update your rules accordingly.)
root@vps:~# sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'.
root@vps:~# sudo ufw allow in on tailscale0
Rule added
root@vps:~# sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup.
Step 4.2: Test and Verify SSH Configuration
Commands
Run the following commands to test and verify your SSH setup:
# Step 4.2.1: Test Tailscale SSH
ssh eno@EN123
# Step 4.2.2: Test Original SSH Method
ssh username@ip
Output Example
Here’s what you should see in your terminal:
Successful Tailscale Connection
local@machine:~$ ssh eno@EN123
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-144-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
Last login: Sun Jan 11 14:45:22 2025 from 100.64.0.1
eno@EN123:~$
Blocked Original SSH Connection
local@machine:~$ ssh username@ip
ssh: connect to host ip port 22: Connection timed out
No longer needed: SSH Key and PAM 2FA Access
Why You Don’t Need This with Tailscale
With Tailscale set up, the connection to your server is secured end-to-end using WireGuard encryption. Only authenticated devices in your Tailscale network can access the server. This eliminates the need for additional authentication steps like SSH keys or 2FA at the connection stage.
Tailscale ensures:
- Device Authentication: Each device must be authenticated with your Tailscale account, acting as a secure gatekeeper.
- Access Control: Tailscale’s ACLs (Access Control Lists) allow fine-grained control over who can access your server.
- Encryption: All traffic between devices in your Tailscale network is encrypted using WireGuard, providing robust security without manual key management.
Conclusion
While SSH keys and PAM-based 2FA remain excellent tools for securing traditional servers, they are no longer necessary with Tailscale’s secure network setup. Tailscale simplifies server access without compromising on security, making these older methods an optional fallback for specific use cases.
4.3 Optional: Secure sudo with Two-Factor Authentication (2FA)
Commands
Follow these steps to set up 2FA for sudo:
# Step 1: Install Google Authenticator PAM Module
sudo apt install libpam-google-authenticator
# Step 2: Configure Google Authenticator for Your User Account
google-authenticator
# Step 3: Edit PAM Configuration for sudo
sudo nano /etc/pam.d/sudo
# Add the following line at the top of the file:
auth required pam_google_authenticator.so
Output Example
Here’s what you should see during setup:
eno@EN123:~$ sudo apt install libpam-google-authenticator
Reading package lists... Done
Building dependency tree... Done
The following NEW packages will be installed:
libpam-google-authenticator
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 56.0 kB of archives.
After this operation, 156 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
eno@EN123:~$ google-authenticator
Do you want authentication tokens to be time-based (y/n) y
Your new secret key is: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Your verification code is 123456
Your emergency scratch codes are:
12345678
23456789
34567890
eno@EN123:~$ sudo nano /etc/pam.d/sudo
auth required pam_google_authenticator.so
Step 4.4: System Control Settings
Commands
Run the following commands to configure and apply the system control settings:
sudo bash -c 'cat > /etc/sysctl.conf <<EOF
### NETWORK SECURITY ###
# IPv4 Settings
## TCP/IP SYN flood protection
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_synack_retries = 2
## Protection against spoofing attacks
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
## Disable IP source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
## Disable ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
## Ignore ICMP broadcasts (mitigate smurf attacks)
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
## Log martian packets
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
## TCP hardening
net.ipv4.tcp_rfc1337 = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_max_tw_buckets = 2000000
net.ipv4.tcp_fin_timeout = 20
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
### IPv6 SECURITY ###
## Disable IPv6 if not needed (comment out if IPv6 is required)
# net.ipv6.conf.all.disable_ipv6 = 1
# net.ipv6.conf.default.disable_ipv6 = 1
# net.ipv6.conf.lo.disable_ipv6 = 1
## IPv6 security settings (if IPv6 is enabled)
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0
### KERNEL SECURITY ###
## Memory protection
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1
kernel.perf_event_paranoid = 3
kernel.yama.ptrace_scope = 2
vm.mmap_min_addr = 65536
vm.mmap_rnd_bits = 32
vm.mmap_rnd_compat_bits = 16
## Core dumps
kernel.core_uses_pid = 1
fs.suid_dumpable = 0
## Address space layout randomization
kernel.randomize_va_space = 2
## File system hardening
fs.protected_fifos = 2
fs.protected_regular = 2
fs.protected_symlinks = 1
fs.protected_hardlinks = 1
## System panic settings (kernel should reboot after 60 seconds on panic)
kernel.panic = 60
kernel.panic_on_oops = 60
### SYSTEM PERFORMANCE ###
## Virtual memory settings
vm.swappiness = 0 # Prevent system from recreating swap partitions on reboot
vm.dirty_ratio = 20
vm.dirty_background_ratio = 5
## File system settings
fs.file-max = 1048576
fs.inotify.max_user_watches = 1048576
EOF'
# Apply the new sysctl settings
sudo sysctl -p
Output Example
Here’s what you should see after applying the new sysctl settings:
eno@EN123:~# sudo sysctl -p
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_synack_retries = 2
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_source_route = 0
fs.file-max = 1048576
fs.inotify.max_user_watches = 1048576
Disable Core Dumps for Security
Core Dumps Commands
Run the following commands to disable core dumps system-wide and for systemd services:
# Disable core dumps system-wide
echo "* hard core 0" | sudo tee -a /etc/security/limits.conf
echo "* soft core 0" | sudo tee -a /etc/security/limits.conf
echo "fs.suid_dumpable = 0" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# Apply to systemd services
sudo mkdir -p /etc/systemd/system.conf.d
sudo tee /etc/systemd/system.conf.d/nocoredump.conf << EOF
[Manager]
DefaultLimitCORE=0
EOF
sudo systemctl daemon-reexec
Core Dumps Output Example
eno@EN123:~# echo "* hard core 0" | sudo tee -a /etc/security/limits.conf
*(appended to /etc/security/limits.conf)*
eno@EN123:~# echo "* soft core 0" | sudo tee -a /etc/security/limits.conf
*(appended to /etc/security/limits.conf)*
eno@EN123:~# echo "fs.suid_dumpable = 0" | sudo tee -a /etc/sysctl.conf
*(appended to /etc/sysctl.conf)*
eno@EN123:~# sudo sysctl -p
fs.suid_dumpable = 0
...
eno@EN123:~# sudo mkdir -p /etc/systemd/system.conf.d
eno@EN123:~# sudo tee /etc/systemd/system.conf.d/nocoredump.conf << EOF
[Manager]
DefaultLimitCORE=0
EOF
eno@EN123:~# sudo systemctl daemon-reexec
Remove Swap Memory
Swap Removal Commands
Run the following commands to disable and remove all swap:
# Disable and remove all swap
sudo swapoff -a
sudo rm -f /swapfile
sudo sed -i '/swap/d' /etc/fstab
sudo systemctl daemon-reexec
Swap Removal Output Example
eno@EN123:~# sudo swapoff -a
eno@EN123:~# sudo rm -f /swapfile
eno@EN123:~# sudo sed -i '/swap/d' /etc/fstab
eno@EN123:~# sudo systemctl daemon-reexec
Step 4.6 Secure Shared Memory
Commands
Run the following commands to secure shared memory:
# Backup the current fstab file
sudo cp /etc/fstab /etc/fstab.backup
# Add secure shared memory configuration
sudo tee -a /etc/fstab << EOF
tmpfs /run/shm tmpfs ro,noexec,nosuid 0 0
EOF
Output Example
Here’s what the terminal output should look like:
eno@EN123:~# sudo cp /etc/fstab /etc/fstab.backup
eno@EN123:~# sudo tee -a /etc/fstab << EOF
tmpfs /run/shm tmpfs ro,noexec,nosuid 0 0
EOF
eno@EN123:~#
Time Synchronization with Chrony
Commands
Run the following commands to install, configure, and verify Chrony:
# Install Chrony
sudo apt update
sudo apt install -y chrony
# Configure Chrony
sudo bash -c 'cat > /etc/chrony/chrony.conf <<EOF
# Pool of NTP servers
pool time.google.com iburst minpoll 4 maxpoll 8 maxdelay 0.3 maxsources 3
pool time.cloudflare.com iburst minpoll 4 maxpoll 8 maxdelay 0.3 maxsources 3
pool ntp.ubuntu.com iburst minpoll 4 maxpoll 8 maxdelay 0.3 maxsources 3
# Authentication key file
keyfile /etc/chrony/chrony.keys
# Drift file for storing clock frequency variations
driftfile /var/lib/chrony/chrony.drift
# Log directory
logdir /var/log/chrony
# Rate limiting - prevent DDoS/abuse
ratelimit interval 3 burst 8
# Prevent large clock adjustments that could affect system stability
maxupdateskew 100.0
# Enable kernel RTC synchronization
rtcsync
# Step clock if offset is larger than 1 second for first 3 updates
makestep 1.0 3
# Serve time even if not synchronized
local stratum 10
EOF'
# Restart and enable Chrony
sudo systemctl restart chrony.service
sudo systemctl enable chrony.service
# Verify synchronization
chronyc tracking
chronyc sources -v
Output Example
Here’s what you should see after configuring Chrony:
eno@EN123:~# sudo apt update
...
eno@EN123:~# sudo apt install -y chrony
Setting up chrony (4.2-1ubuntu0.1)...
eno@EN123:~# sudo systemctl restart chrony.service
eno@EN123:~# sudo systemctl enable chrony.service
Synchronizing state of chrony.service with SysV service script with /lib/systemd/systemd-sysv-install.
Created symlink /etc/systemd/system/multi-user.target.wants/chrony.service → /lib/systemd/system/chrony.service.
eno@EN123:~# chronyc tracking
Reference ID : A.B.C.D (time.google.com)
Stratum : 2
Ref time (UTC) : Sun Jan 11 14:45:22 2025
System time : 0.000000012 seconds fast of NTP time
Last offset : -0.000012 seconds
RMS offset : 0.000007 seconds
eno@EN123:~# chronyc sources -v
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* time.google.com 1 6 377 3 -1us[ -10us] +/- 15ms
^+ time.cloudflare.com 2 6 377 8 +2us[ +2us] +/- 20ms
^+ ntp.ubuntu.com 2 6 377 7 +3us[ +3us] +/- 25ms
Join the EarthNode Club
EarthNode Discussions
Join the community to explore setup guides, operator discussions, and resources for running World Mobile EarthNodes.
EarthNode Setup Discussions
Join the community to discuss and improve the EarthNode setup process. Share best practices for secure setup and ongoing maintenance.
EarthNode Chat
Connect live with EarthNode operators. Discuss network validation, share insights, and get real-time updates on the World Mobile ecosystem.