Skip to main content

NAT Traversal Setup

Guide for configuring NAT traversal using relay nodes.

Understanding NAT Traversal​

The Problem​

Peers behind NAT/firewall cannot accept direct connections:

The Solution​

Use a relay node with public IP:

Relay Node Setup​

Requirements​

  • Public IP address
  • Open port (typically 4000)
  • Sufficient bandwidth
  • Reliable uptime

Start Relay Node​

bethrou-node start \
--listen /ip4/0.0.0.0/tcp/4000 \
--relay-mode \
--discover \
--discover-address redis://discovery.example.com:6379 \
--discover-topic bethrou-network

Verify Relay​

Check logs for relay status:

INFO  Relay mode enabled
INFO Listening on: /ip4/0.0.0.0/tcp/4000

Test from outside:

nc -zv relay-ip 4000

Client Configuration​

Option 1: Explicit Relay​

Specify relay in node configuration:

key: "network.key"

server:
listen: "127.0.0.1:1080"
auth: false

routing:
strategy: random
health: 30s
timeout: 10s

nodes:
- id: 12D3KooWNode...
relay: /ip4/203.0.113.100/tcp/4000/p2p/12D3KooWRelay...

discovery:
enabled: false

log:
level: info
format: text

Option 2: Auto Discovery​

Let libp2p find relay automatically:

key: "network.key"

server:
listen: "127.0.0.1:1080"
auth: false

routing:
strategy: random
health: 30s
timeout: 10s

nodes: []

discovery:
enabled: true
address: "redis://discovery.example.com:6379"
topic: "bethrou-network"
timeout: "10s"

log:
level: info
format: text

Exit Node Behind NAT​

Configuration​

Exit node connects to relay:

bethrou-node start \
--listen /ip4/0.0.0.0/tcp/4000 \
--connect-relay /ip4/192.168.0.100/tcp/4000/p2p/12D3KooWRelay...

The node will:

  1. Connect to relay
  2. Accept incoming connections via relay
  3. Forward traffic to clients or hole punch

Testing NAT Traversal​

1. Deploy Relay​

On a server with public IP:

bethrou-node start \
--listen /ip4/0.0.0.0/tcp/4000 \
--relay-mode

2. Start Node (Behind NAT)​

bethrou-node start \
--listen /ip4/0.0.0.0/tcp/4000 \
--connect-relay /ip4/relay-ip/tcp/4000/p2p/12D3KooWRelay...

3. Start Client (Behind NAT)​

key: "network.key"

server:
listen: "127.0.0.1:1080"
auth: false

routing:
strategy: random
health: 30s
timeout: 10s

nodes:
- id: 12D3KooWNode...
relay: /ip4/relay-ip/tcp/4000/p2p/12D3KooWRelay...

discovery:
enabled: false

log:
level: info
format: text

4. Test Connection​

curl --socks5 127.0.0.1:1080 https://ifconfig.me

Security Considerations​

Relay Trust​

Relay can observe:

  • Connection metadata
  • Peer IDs and addresses
  • Connection timing

Relay cannot observe:

  • Proxied traffic (encrypted by libp2p)
  • Destination addresses (handled by exit node)

Best Practices​

  1. Run your own relays: More control and privacy
  2. Multiple relays: Redundancy and load distribution
  3. Monitor relay logs: Watch for abuse
  4. Rate limiting: Prevent resource exhaustion
  5. Firewall rules: Restrict relay access if needed

Troubleshooting​

Client cannot connect via relay​

Check relay is running:

nc -zv relay-ip 4000

Check logs:

# Client
bethrou-client connect --log-level debug

# Node
bethrou-node start --log-level debug

Verify discovery:

redis-cli PUBSUB CHANNELS bethrou-*

Next Steps​