2 minutes
Near Protocol full RPC Node behind CGNAT
In the previous article we saw how to setup a Near protocol full RPC node. The node will sync only if you are not behind a firewall or behind a network like a CGNAT (the UDP P2P port has to be exposed). In this article we are going to see how to have Near protocol node synchronized behind Starlink (I.E. behind a CGNAT).
We are going to use a tiny VPS that will act as proxy UDP proxy (or P2P tunnel).
Local Node (Starlink)
^
| UDP P2P to VPS
|
VPS Relay (1 Go RAM, Public IP)
^
| UDP P2P to Mainnet NEAR nodes
|
NEAR Mainnet
VPS setup
The VPS listen to 24567 and redirect to the local node via a SSH reverse tunnel and tailscale
curl -fsSL https://tailscale.com/install.sh | sh && sudo tailscale up --auth-key=tskey-auth-...-... --advertise-exit-node
tailscale status
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-tailscale.conf
curl -4 icanhazip.com # Get vps public IP to verify later the local server has the same one.
sudo apt update && sudo apt install socat -y
sudo socat UDP4-LISTEN:24567,fork UDP4:PRIVATE_TAILSCALE_IP_OF_LOCAL_NEAR_NODE:24567
Local Node
Setup tailscale
curl -fsSL https://tailscale.com/install.sh | sh && sudo tailscale up --auth-key=tskey-auth-...-...
curl -4 icanhazip.com
tailscale status
sudo tailscale up \ --exit-node=TAILSCALE_PRIVATE_IP_OF_VPS --exit-node-allow-lan-access=true
curl -4 icanhazip.com
Retrieve peer address to setup boot nodes
curl -s -X POST https://rpc.mainnet.near.org -H "Content-Type: application/json" -d '{ "jsonrpc": "2.0", "method": "network_info", "params": [], "id": "dontcare"}' | jq -r '.result.active_peers[] | "\(.id)@\(.addr)"'
Boot node config
Edit vim ~/.near/config.json and change:
"boot_nodes": [
"v2.near.org:24567" // Previously retrieved peer id
]
Run Near
neard run
Verify sync
curl -s http://127.0.0.1:3030/status | jq
#"sync_info": {
# "syncing": false
#}
# -> Sync is over
# Compare with public node
curl -s https://rpc.mainnet.near.org/status | jq '.sync_info.latest_block_height' && curl -s http://127.0.0.1:3030/status | jq '.sync_info.latest_block_height'