Current rust-libp2p implementation has very simple NAT traversal support. As I know, just remap the port the a public IP address.
How about use p2p as to support more powerful NAT traversal techniques? Like TCP and UDP hole punching (even port number prediction), looks great to me.
A TCP hold punching example:
Example steps
- Start the relay sever (require public IP address)
socat TCP-LISTEN:45666 TCP-LISTEN:45667
- Start the rendezvous(traversal) server (require public IP address)
cargo run --example tcp_rendezvous_server
# listening on public socket address <rendezvous-server>:45000
# our public key is: {"sign":[...],"encrypt":[...]}
- Start NAT peers (Better locate in different NAT)
# Start first peer
RUST_LOG=p2p=trace cargo run --example tcp_rendezvous_connect -- --relay=<relay-server-ip>:45666 --traversal-server=<rendezvous-server>:45000 --traversal-server-key='{"sign":[...],"encrypt":[...]}' this-is-45666
# Start second peer
RUST_LOG=p2p=trace cargo run --example tcp_rendezvous_connect -- --relay=<relay-server-ip>:45667 --traversal-server=<rendezvous-server>:45000 --traversal-server-key='{"sign":[...],"encrypt":[...]}' this-is-45667
Current
rust-libp2pimplementation has very simple NAT traversal support. As I know, just remap the port the a public IP address.How about use
p2pas to support more powerful NAT traversal techniques? Like TCP and UDP hole punching (even port number prediction), looks great to me.A TCP hold punching example:
Example steps