feat: make stun server private

This commit is contained in:
pengzhen 2024-12-10 10:26:56 +08:00 committed by fearlessfe
parent bf46bca112
commit 9bccaac318
4 changed files with 24 additions and 23 deletions

View File

@ -760,7 +760,7 @@ var (
} }
NATFlag = &cli.StringFlag{ NATFlag = &cli.StringFlag{
Name: "nat", Name: "nat",
Usage: "NAT port mapping mechanism (any|none|upnp|pmp|pmp:<IP>|extip:<IP>|stun:default|stun:<IP>)", Usage: "NAT port mapping mechanism (any|none|upnp|pmp|pmp:<IP>|extip:<IP>|stun:default|stun:<IP:PORT>)",
Value: "any", Value: "any",
Category: flags.NetworkingCategory, Category: flags.NetworkingCategory,
} }

View File

@ -89,7 +89,7 @@ func Parse(spec string) (Interface, error) {
case "pmp", "natpmp", "nat-pmp": case "pmp", "natpmp", "nat-pmp":
return PMP(ip), nil return PMP(ip), nil
case "stun": case "stun":
return NewSTUN(after) return newSTUN(after)
default: default:
return nil, fmt.Errorf("unknown mechanism %q", before) return nil, fmt.Errorf("unknown mechanism %q", before)
} }

View File

@ -21,58 +21,58 @@ import (
"net" "net"
"time" "time"
"github.com/pion/stun/v2" stunV2 "github.com/pion/stun/v2"
) )
// The code are from erigon p2p/nat/nat_stun.go // The code are from erigon p2p/nat/nat_stun.go
// This stun server is part of the mainnet infrastructure. // This stun server is part of the mainnet infrastructure.
// The addr are from https://github.com/ethereum/trin/blob/master/portalnet/src/socket.rs // The addr are from https://github.com/ethereum/trin/blob/master/portalnet/src/socket.rs
const STUNDefaultServerAddr = "159.223.0.83:3478" const stunDefaultServerAddr = "159.223.0.83:3478"
type STUN struct { type stun struct {
serverAddr *net.UDPAddr server *net.UDPAddr
} }
func NewSTUN(serverAddr string) (Interface, error) { func newSTUN(serverAddr string) (Interface, error) {
if serverAddr == "default" { if serverAddr == "default" {
serverAddr = STUNDefaultServerAddr serverAddr = stunDefaultServerAddr
} }
addr, err := net.ResolveUDPAddr("udp4", serverAddr) addr, err := net.ResolveUDPAddr("udp4", serverAddr)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return STUN{serverAddr: addr}, nil return stun{server: addr}, nil
} }
func (s STUN) String() string { func (s stun) String() string {
return fmt.Sprintf("STUN(%s)", s.serverAddr) return fmt.Sprintf("STUN(%s)", s.server)
} }
func (STUN) SupportsMapping() bool { func (stun) SupportsMapping() bool {
return false return false
} }
func (STUN) AddMapping(protocol string, extport, intport int, name string, lifetime time.Duration) (uint16, error) { func (stun) AddMapping(protocol string, extport, intport int, name string, lifetime time.Duration) (uint16, error) {
return uint16(extport), nil return uint16(extport), nil
} }
func (STUN) DeleteMapping(string, int, int) error { func (stun) DeleteMapping(string, int, int) error {
return nil return nil
} }
func (s STUN) ExternalIP() (net.IP, error) { func (s stun) ExternalIP() (net.IP, error) {
conn, err := stun.Dial("udp4", s.serverAddr.String()) conn, err := stunV2.Dial("udp4", s.server.String())
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer conn.Close() defer conn.Close()
message, err := stun.Build(stun.TransactionID, stun.BindingRequest) message, err := stunV2.Build(stunV2.TransactionID, stunV2.BindingRequest)
if err != nil { if err != nil {
return nil, err return nil, err
} }
var response *stun.Event var response *stunV2.Event
err = conn.Do(message, func(event stun.Event) { err = conn.Do(message, func(event stunV2.Event) {
response = &event response = &event
}) })
if err != nil { if err != nil {
@ -82,7 +82,7 @@ func (s STUN) ExternalIP() (net.IP, error) {
return nil, response.Error return nil, response.Error
} }
var mappedAddr stun.XORMappedAddress var mappedAddr stunV2.XORMappedAddress
if err := mappedAddr.GetFrom(response.Message); err != nil { if err := mappedAddr.GetFrom(response.Message); err != nil {
return nil, err return nil, err
} }

View File

@ -62,14 +62,15 @@ func TestAutoDiscRace(t *testing.T) {
} }
} }
// stun:default should work well
func TestStunDefault(t *testing.T) { func TestStunDefault(t *testing.T) {
nat, err := Parse("stun:default") nat, err := Parse("stun:default")
if err != nil { if err != nil {
t.Errorf("should no err, but get %v", err) t.Errorf("should no err, but get %v", err)
} }
stun := nat.(STUN) stun := nat.(stun)
if stun.serverAddr.String() != STUNDefaultServerAddr { if stun.server.String() != stunDefaultServerAddr {
t.Errorf("want addr %s, got addr %s", STUNDefaultServerAddr, stun.serverAddr.String()) t.Errorf("want addr %s, got addr %s", stunDefaultServerAddr, stun.server.String())
} }
_, err = stun.ExternalIP() _, err = stun.ExternalIP()
if err != nil { if err != nil {