From bf46bca11252293c7aa268506e738cbecfb9e5ec Mon Sep 17 00:00:00 2001 From: fearlessfe <505380967@qq.com> Date: Mon, 9 Dec 2024 23:51:45 +0800 Subject: [PATCH] p2p/nat: do some optimization 1. upgrade to github.com/pion/stun/v2 2. check the server addr --- cmd/utils/flags.go | 2 +- go.mod | 3 ++- go.sum | 11 +++++++++-- p2p/nat/nat.go | 13 +++++-------- p2p/nat/nat_stun.go | 27 ++++++++++++++++----------- p2p/nat/nat_test.go | 15 +++++++++++++++ 6 files changed, 48 insertions(+), 23 deletions(-) diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 769c9df005..48143c5acb 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -760,7 +760,7 @@ var ( } NATFlag = &cli.StringFlag{ Name: "nat", - Usage: "NAT port mapping mechanism (any|none|upnp|pmp|pmp:|extip:|stun|stun:)", + Usage: "NAT port mapping mechanism (any|none|upnp|pmp|pmp:|extip:|stun:default|stun:)", Value: "any", Category: flags.NetworkingCategory, } diff --git a/go.mod b/go.mod index 537c63baa5..3568289077 100644 --- a/go.mod +++ b/go.mod @@ -53,7 +53,7 @@ require ( github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 github.com/olekukonko/tablewriter v0.0.5 github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 - github.com/pion/stun v0.6.1 + github.com/pion/stun/v2 v2.0.0 github.com/protolambda/bls12-381-util v0.1.0 github.com/protolambda/zrnt v0.32.2 github.com/protolambda/ztyp v0.2.2 @@ -132,6 +132,7 @@ require ( github.com/pion/dtls/v2 v2.2.7 // indirect github.com/pion/logging v0.2.2 // indirect github.com/pion/transport/v2 v2.2.1 // indirect + github.com/pion/transport/v3 v3.0.1 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_golang v1.12.0 // indirect diff --git a/go.sum b/go.sum index d319bbcf8c..0982b92ecd 100644 --- a/go.sum +++ b/go.sum @@ -427,10 +427,12 @@ github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= -github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= -github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= +github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0= +github.com/pion/stun/v2 v2.0.0/go.mod h1:22qRSh08fSEttYUmJZGlriq9+03jtVmXNODgLccj8GQ= github.com/pion/transport/v2 v2.2.1 h1:7qYnCBlpgSJNYMbLCKuSY9KbQdBFoETvPNETv0y4N7c= github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= +github.com/pion/transport/v3 v3.0.1 h1:gDTlPJwROfSfz6QfSi0ZmeCSkFcnWWiiR9ES0ouANiM= +github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -543,6 +545,7 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -619,6 +622,8 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -712,6 +717,8 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/p2p/nat/nat.go b/p2p/nat/nat.go index c24ed9069a..387ddebca7 100644 --- a/p2p/nat/nat.go +++ b/p2p/nat/nat.go @@ -59,15 +59,16 @@ type Interface interface { // "upnp" uses the Universal Plug and Play protocol // "pmp" uses NAT-PMP with an auto-detected gateway address // "pmp:192.168.0.1" uses NAT-PMP with the given gateway address -// "stun" uses stun protocol with default stun server -// "stun:192.168.0.1" uses stun protocol with stun server address 192.168.0.1 +// "stun:default" uses stun protocol with default stun server +// "stun:192.168.0.1:1234" uses stun protocol with stun server address 192.168.0.1:1234 func Parse(spec string) (Interface, error) { var ( before, after, found = strings.Cut(spec, ":") mech = strings.ToLower(before) ip net.IP ) - if found { + // stun is not a valid ip + if found && mech != "stun" { ip = net.ParseIP(after) if ip == nil { return nil, errors.New("invalid IP address") @@ -88,11 +89,7 @@ func Parse(spec string) (Interface, error) { case "pmp", "natpmp", "nat-pmp": return PMP(ip), nil case "stun": - var addr string - if len(after) > 1 { - addr = after - } - return NewSTUN(addr), nil + return NewSTUN(after) default: return nil, fmt.Errorf("unknown mechanism %q", before) } diff --git a/p2p/nat/nat_stun.go b/p2p/nat/nat_stun.go index 54723ff489..8b7bdaf268 100644 --- a/p2p/nat/nat_stun.go +++ b/p2p/nat/nat_stun.go @@ -1,4 +1,4 @@ -// Copyright 2015 The go-ethereum Authors +// Copyright 2024 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify @@ -21,7 +21,7 @@ import ( "net" "time" - "github.com/pion/stun" + "github.com/pion/stun/v2" ) // The code are from erigon p2p/nat/nat_stun.go @@ -30,14 +30,18 @@ import ( const STUNDefaultServerAddr = "159.223.0.83:3478" type STUN struct { - serverAddr string + serverAddr *net.UDPAddr } -func NewSTUN(serverAddr string) STUN { - if serverAddr == "" { +func NewSTUN(serverAddr string) (Interface, error) { + if serverAddr == "default" { serverAddr = STUNDefaultServerAddr } - return STUN{serverAddr: serverAddr} + addr, err := net.ResolveUDPAddr("udp4", serverAddr) + if err != nil { + return nil, err + } + return STUN{serverAddr: addr}, nil } func (s STUN) String() string { @@ -57,15 +61,16 @@ func (STUN) DeleteMapping(string, int, int) error { } func (s STUN) ExternalIP() (net.IP, error) { - conn, err := stun.Dial("udp4", s.serverAddr) + conn, err := stun.Dial("udp4", s.serverAddr.String()) if err != nil { return nil, err } - defer func() { - _ = conn.Close() - }() + defer conn.Close() - message := stun.MustBuild(stun.TransactionID, stun.BindingRequest) + message, err := stun.Build(stun.TransactionID, stun.BindingRequest) + if err != nil { + return nil, err + } var response *stun.Event err = conn.Do(message, func(event stun.Event) { response = &event diff --git a/p2p/nat/nat_test.go b/p2p/nat/nat_test.go index 814e6d9e14..edf501624a 100644 --- a/p2p/nat/nat_test.go +++ b/p2p/nat/nat_test.go @@ -61,3 +61,18 @@ func TestAutoDiscRace(t *testing.T) { } } } + +func TestStunDefault(t *testing.T) { + nat, err := Parse("stun:default") + if err != nil { + t.Errorf("should no err, but get %v", err) + } + stun := nat.(STUN) + if stun.serverAddr.String() != STUNDefaultServerAddr { + t.Errorf("want addr %s, got addr %s", STUNDefaultServerAddr, stun.serverAddr.String()) + } + _, err = stun.ExternalIP() + if err != nil { + t.Errorf("get err: %v", err) + } +}