diff --git a/internal/net/net.go b/internal/net/net.go new file mode 100644 index 0000000..ba90709 --- /dev/null +++ b/internal/net/net.go @@ -0,0 +1,5 @@ +package net + +func IsIPv4(address string) bool { + return address != "" && address[0] != ':' && address[0] != '[' +} diff --git a/internal/util/pht/server.go b/internal/util/pht/server.go index b66cb91..da5409e 100644 --- a/internal/util/pht/server.go +++ b/internal/util/pht/server.go @@ -16,6 +16,7 @@ import ( "github.com/go-gost/core/common/bufpool" "github.com/go-gost/core/logger" + xnet "github.com/go-gost/x/internal/net" "github.com/lucas-clemente/quic-go" "github.com/lucas-clemente/quic-go/http3" "github.com/rs/xid" @@ -143,7 +144,11 @@ func NewHTTP3Server(addr string, quicConfig *quic.Config, opts ...ServerOption) func (s *Server) ListenAndServe() error { if s.http3Server != nil { - addr, err := net.ResolveUDPAddr("udp", s.http3Server.Addr) + network := "udp" + if xnet.IsIPv4(s.httpServer.Addr) { + network = "udp4" + } + addr, err := net.ResolveUDPAddr(network, s.http3Server.Addr) if err != nil { return err } @@ -152,7 +157,11 @@ func (s *Server) ListenAndServe() error { return s.http3Server.ListenAndServe() } - ln, err := net.Listen("tcp", s.httpServer.Addr) + network := "tcp" + if xnet.IsIPv4(s.httpServer.Addr) { + network = "tcp4" + } + ln, err := net.Listen(network, s.httpServer.Addr) if err != nil { s.options.logger.Error(err) return err diff --git a/listener/dns/server.go b/listener/dns/server.go index 5717438..4e60f6d 100644 --- a/listener/dns/server.go +++ b/listener/dns/server.go @@ -8,6 +8,8 @@ import ( "net" "net/http" "time" + + xnet "github.com/go-gost/x/internal/net" ) type Server interface { @@ -22,7 +24,11 @@ type dohServer struct { } func (s *dohServer) ListenAndServe() error { - ln, err := net.Listen("tcp", s.addr) + network := "tcp" + if xnet.IsIPv4(s.addr) { + network = "tcp4" + } + ln, err := net.Listen(network, s.addr) if err != nil { return err } diff --git a/listener/ftcp/listener.go b/listener/ftcp/listener.go index 9037424..5c6c83c 100644 --- a/listener/ftcp/listener.go +++ b/listener/ftcp/listener.go @@ -8,6 +8,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" "github.com/go-gost/x/registry" "github.com/xtaci/tcpraw" ) @@ -40,7 +41,11 @@ func (l *ftcpListener) Init(md md.Metadata) (err error) { } var conn net.PacketConn - conn, err = tcpraw.Listen("tcp", l.options.Addr) + network := "tcp" + if xnet.IsIPv4(l.options.Addr) { + network = "tcp4" + } + conn, err = tcpraw.Listen(network, l.options.Addr) if err != nil { return } diff --git a/listener/grpc/listener.go b/listener/grpc/listener.go index 4b65c5b..b21fadc 100644 --- a/listener/grpc/listener.go +++ b/listener/grpc/listener.go @@ -8,6 +8,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" pb "github.com/go-gost/x/internal/util/grpc/proto" "github.com/go-gost/x/registry" "google.golang.org/grpc" @@ -44,7 +45,11 @@ func (l *grpcListener) Init(md md.Metadata) (err error) { return } - ln, err := net.Listen("tcp", l.options.Addr) + network := "tcp" + if xnet.IsIPv4(l.options.Addr) { + network = "tcp4" + } + ln, err := net.Listen(network, l.options.Addr) if err != nil { return } diff --git a/listener/http2/h2/listener.go b/listener/http2/h2/listener.go index f4dcb2d..6060e6b 100644 --- a/listener/http2/h2/listener.go +++ b/listener/http2/h2/listener.go @@ -12,6 +12,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" "github.com/go-gost/x/registry" "golang.org/x/net/http2" "golang.org/x/net/http2/h2c" @@ -65,7 +66,11 @@ func (l *h2Listener) Init(md md.Metadata) (err error) { Addr: l.options.Addr, } - ln, err := net.Listen("tcp", l.options.Addr) + network := "tcp" + if xnet.IsIPv4(l.options.Addr) { + network = "tcp4" + } + ln, err := net.Listen(network, l.options.Addr) if err != nil { return err } diff --git a/listener/http2/listener.go b/listener/http2/listener.go index 40a4a7a..434b677 100644 --- a/listener/http2/listener.go +++ b/listener/http2/listener.go @@ -10,6 +10,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" mdx "github.com/go-gost/x/metadata" "github.com/go-gost/x/registry" "golang.org/x/net/http2" @@ -54,7 +55,11 @@ func (l *http2Listener) Init(md md.Metadata) (err error) { return err } - ln, err := net.Listen("tcp", l.options.Addr) + network := "tcp" + if xnet.IsIPv4(l.options.Addr) { + network = "tcp4" + } + ln, err := net.Listen(network, l.options.Addr) if err != nil { return err } diff --git a/listener/http3/listener.go b/listener/http3/listener.go index d54abdf..5d6b7ee 100644 --- a/listener/http3/listener.go +++ b/listener/http3/listener.go @@ -7,6 +7,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" pht_util "github.com/go-gost/x/internal/util/pht" "github.com/go-gost/x/registry" "github.com/lucas-clemente/quic-go" @@ -41,7 +42,11 @@ func (l *http3Listener) Init(md md.Metadata) (err error) { return } - l.addr, err = net.ResolveUDPAddr("udp", l.options.Addr) + network := "udp" + if xnet.IsIPv4(l.options.Addr) { + network = "udp4" + } + l.addr, err = net.ResolveUDPAddr(network, l.options.Addr) if err != nil { return } diff --git a/listener/kcp/listener.go b/listener/kcp/listener.go index feef38f..159113e 100644 --- a/listener/kcp/listener.go +++ b/listener/kcp/listener.go @@ -9,6 +9,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" kcp_util "github.com/go-gost/x/internal/util/kcp" "github.com/go-gost/x/registry" "github.com/xtaci/kcp-go/v5" @@ -51,14 +52,22 @@ func (l *kcpListener) Init(md md.Metadata) (err error) { var conn net.PacketConn if config.TCP { - conn, err = tcpraw.Listen("tcp", l.options.Addr) + network := "tcp" + if xnet.IsIPv4(l.options.Addr) { + network = "tcp4" + } + conn, err = tcpraw.Listen(network, l.options.Addr) } else { + network := "udp" + if xnet.IsIPv4(l.options.Addr) { + network = "udp4" + } var udpAddr *net.UDPAddr - udpAddr, err = net.ResolveUDPAddr("udp", l.options.Addr) + udpAddr, err = net.ResolveUDPAddr(network, l.options.Addr) if err != nil { return } - conn, err = net.ListenUDP("udp", udpAddr) + conn, err = net.ListenUDP(network, udpAddr) } if err != nil { return diff --git a/listener/mtls/listener.go b/listener/mtls/listener.go index 23ed687..4c5aa15 100644 --- a/listener/mtls/listener.go +++ b/listener/mtls/listener.go @@ -9,6 +9,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" "github.com/go-gost/x/registry" "github.com/xtaci/smux" ) @@ -42,7 +43,11 @@ func (l *mtlsListener) Init(md md.Metadata) (err error) { return } - ln, err := net.Listen("tcp", l.options.Addr) + network := "tcp" + if xnet.IsIPv4(l.options.Addr) { + network = "tcp4" + } + ln, err := net.Listen(network, l.options.Addr) if err != nil { return } diff --git a/listener/mws/listener.go b/listener/mws/listener.go index 004c68a..7064198 100644 --- a/listener/mws/listener.go +++ b/listener/mws/listener.go @@ -11,6 +11,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" ws_util "github.com/go-gost/x/internal/util/ws" "github.com/go-gost/x/registry" "github.com/gorilla/websocket" @@ -85,7 +86,11 @@ func (l *mwsListener) Init(md md.Metadata) (err error) { l.cqueue = make(chan net.Conn, l.md.backlog) l.errChan = make(chan error, 1) - ln, err := net.Listen("tcp", l.options.Addr) + network := "tcp" + if xnet.IsIPv4(l.options.Addr) { + network = "tcp4" + } + ln, err := net.Listen(network, l.options.Addr) if err != nil { return } diff --git a/listener/obfs/http/listener.go b/listener/obfs/http/listener.go index 544f3bd..385d19d 100644 --- a/listener/obfs/http/listener.go +++ b/listener/obfs/http/listener.go @@ -8,6 +8,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" "github.com/go-gost/x/registry" ) @@ -38,7 +39,11 @@ func (l *obfsListener) Init(md md.Metadata) (err error) { return } - ln, err := net.Listen("tcp", l.options.Addr) + network := "tcp" + if xnet.IsIPv4(l.options.Addr) { + network = "tcp4" + } + ln, err := net.Listen(network, l.options.Addr) if err != nil { return } diff --git a/listener/obfs/tls/listener.go b/listener/obfs/tls/listener.go index f12488c..3a6c565 100644 --- a/listener/obfs/tls/listener.go +++ b/listener/obfs/tls/listener.go @@ -8,6 +8,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" "github.com/go-gost/x/registry" ) @@ -38,7 +39,11 @@ func (l *obfsListener) Init(md md.Metadata) (err error) { return } - ln, err := net.Listen("tcp", l.options.Addr) + network := "tcp" + if xnet.IsIPv4(l.options.Addr) { + network = "tcp4" + } + ln, err := net.Listen(network, l.options.Addr) if err != nil { return } diff --git a/listener/pht/listener.go b/listener/pht/listener.go index 52ca012..868aabd 100644 --- a/listener/pht/listener.go +++ b/listener/pht/listener.go @@ -9,6 +9,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" pht_util "github.com/go-gost/x/internal/util/pht" "github.com/go-gost/x/registry" ) @@ -55,7 +56,11 @@ func (l *phtListener) Init(md md.Metadata) (err error) { return } - l.addr, err = net.ResolveTCPAddr("tcp", l.options.Addr) + network := "tcp" + if xnet.IsIPv4(l.options.Addr) { + network = "tcp4" + } + l.addr, err = net.ResolveTCPAddr(network, l.options.Addr) if err != nil { return } diff --git a/listener/quic/listener.go b/listener/quic/listener.go index 03ae657..9ab800e 100644 --- a/listener/quic/listener.go +++ b/listener/quic/listener.go @@ -8,6 +8,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" quic_util "github.com/go-gost/x/internal/util/quic" "github.com/go-gost/x/registry" "github.com/lucas-clemente/quic-go" @@ -47,14 +48,18 @@ func (l *quicListener) Init(md md.Metadata) (err error) { addr = net.JoinHostPort(addr, "0") } + network := "udp" + if xnet.IsIPv4(l.options.Addr) { + network = "udp4" + } var laddr *net.UDPAddr - laddr, err = net.ResolveUDPAddr("udp", addr) + laddr, err = net.ResolveUDPAddr(network, addr) if err != nil { return } var conn net.PacketConn - conn, err = net.ListenUDP("udp", laddr) + conn, err = net.ListenUDP(network, laddr) if err != nil { return } diff --git a/listener/redirect/tcp/listener.go b/listener/redirect/tcp/listener.go index 1678a9e..6c3e780 100644 --- a/listener/redirect/tcp/listener.go +++ b/listener/redirect/tcp/listener.go @@ -8,6 +8,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" "github.com/go-gost/x/registry" ) @@ -44,7 +45,11 @@ func (l *redirectListener) Init(md md.Metadata) (err error) { if l.md.tproxy { lc.Control = l.control } - ln, err := lc.Listen(context.Background(), "tcp", l.options.Addr) + network := "tcp" + if xnet.IsIPv4(l.options.Addr) { + network = "tcp4" + } + ln, err := lc.Listen(context.Background(), network, l.options.Addr) if err != nil { return err } diff --git a/listener/redirect/udp/listener_linux.go b/listener/redirect/udp/listener_linux.go index 79cac23..b26e500 100644 --- a/listener/redirect/udp/listener_linux.go +++ b/listener/redirect/udp/listener_linux.go @@ -12,6 +12,7 @@ import ( "unsafe" "github.com/go-gost/core/common/bufpool" + xnet "github.com/go-gost/x/internal/net" "golang.org/x/sys/unix" ) @@ -28,7 +29,12 @@ func (l *redirectListener) listenUDP(addr string) (*net.UDPConn, error) { }) }, } - pc, err := lc.ListenPacket(context.Background(), "udp", addr) + + network := "udp" + if xnet.IsIPv4(addr) { + network = "udp4" + } + pc, err := lc.ListenPacket(context.Background(), network, addr) if err != nil { return nil, err } @@ -47,7 +53,11 @@ func (l *redirectListener) accept() (conn net.Conn, err error) { l.logger.Infof("%s >> %s", raddr.String(), dstAddr.String()) - c, err := dialUDP("udp", dstAddr, raddr) + network := "udp" + if xnet.IsIPv4(l.options.Addr) { + network = "udp4" + } + c, err := dialUDP(network, dstAddr, raddr) if err != nil { l.logger.Error(err) return diff --git a/listener/rtcp/listener.go b/listener/rtcp/listener.go index f79c181..cd7eb29 100644 --- a/listener/rtcp/listener.go +++ b/listener/rtcp/listener.go @@ -10,6 +10,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" "github.com/go-gost/x/registry" ) @@ -20,7 +21,6 @@ func init() { type rtcpListener struct { laddr net.Addr ln net.Listener - md metadata router *chain.Router logger logger.Logger closed chan struct{} @@ -44,7 +44,11 @@ func (l *rtcpListener) Init(md md.Metadata) (err error) { return } - laddr, err := net.ResolveTCPAddr("tcp", l.options.Addr) + network := "tcp" + if xnet.IsIPv4(l.options.Addr) { + network = "tcp4" + } + laddr, err := net.ResolveTCPAddr(network, l.options.Addr) if err != nil { return } diff --git a/listener/rudp/listener.go b/listener/rudp/listener.go index 477e0a0..75898a9 100644 --- a/listener/rudp/listener.go +++ b/listener/rudp/listener.go @@ -10,6 +10,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" "github.com/go-gost/x/registry" ) @@ -44,7 +45,11 @@ func (l *rudpListener) Init(md md.Metadata) (err error) { return } - laddr, err := net.ResolveUDPAddr("udp", l.options.Addr) + network := "udp" + if xnet.IsIPv4(l.options.Addr) { + network = "udp4" + } + laddr, err := net.ResolveUDPAddr(network, l.options.Addr) if err != nil { return } diff --git a/listener/ssh/listener.go b/listener/ssh/listener.go index 1d5405a..5ad5601 100644 --- a/listener/ssh/listener.go +++ b/listener/ssh/listener.go @@ -10,6 +10,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" ssh_util "github.com/go-gost/x/internal/util/ssh" "github.com/go-gost/x/registry" "golang.org/x/crypto/ssh" @@ -45,7 +46,11 @@ func (l *sshListener) Init(md md.Metadata) (err error) { return } - ln, err := net.Listen("tcp", l.options.Addr) + network := "tcp" + if xnet.IsIPv4(l.options.Addr) { + network = "tcp4" + } + ln, err := net.Listen(network, l.options.Addr) if err != nil { return err } diff --git a/listener/sshd/listener.go b/listener/sshd/listener.go index 64d9365..41ab7ec 100644 --- a/listener/sshd/listener.go +++ b/listener/sshd/listener.go @@ -12,6 +12,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" ssh_util "github.com/go-gost/x/internal/util/ssh" sshd_util "github.com/go-gost/x/internal/util/sshd" "github.com/go-gost/x/registry" @@ -54,7 +55,11 @@ func (l *sshdListener) Init(md md.Metadata) (err error) { return } - ln, err := net.Listen("tcp", l.options.Addr) + network := "tcp" + if xnet.IsIPv4(l.options.Addr) { + network = "tcp4" + } + ln, err := net.Listen(network, l.options.Addr) if err != nil { return err } diff --git a/listener/tap/listener.go b/listener/tap/listener.go index 2c2a613..44b6584 100644 --- a/listener/tap/listener.go +++ b/listener/tap/listener.go @@ -7,6 +7,7 @@ import ( "github.com/go-gost/core/logger" mdata "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" mdx "github.com/go-gost/x/metadata" "github.com/go-gost/x/registry" ) @@ -42,7 +43,11 @@ func (l *tapListener) Init(md mdata.Metadata) (err error) { return } - l.addr, err = net.ResolveUDPAddr("udp", l.saddr) + network := "udp" + if xnet.IsIPv4(l.options.Addr) { + network = "udp4" + } + l.addr, err = net.ResolveUDPAddr(network, l.saddr) if err != nil { return } diff --git a/listener/tcp/listener.go b/listener/tcp/listener.go index 9d9f25a..079170d 100644 --- a/listener/tcp/listener.go +++ b/listener/tcp/listener.go @@ -7,6 +7,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" "github.com/go-gost/x/registry" ) @@ -37,7 +38,11 @@ func (l *tcpListener) Init(md md.Metadata) (err error) { return } - ln, err := net.Listen("tcp", l.options.Addr) + network := "tcp" + if xnet.IsIPv4(l.options.Addr) { + network = "tcp4" + } + ln, err := net.Listen(network, l.options.Addr) if err != nil { return } diff --git a/listener/tls/listener.go b/listener/tls/listener.go index b76422d..2c39f3d 100644 --- a/listener/tls/listener.go +++ b/listener/tls/listener.go @@ -9,6 +9,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" "github.com/go-gost/x/registry" ) @@ -39,7 +40,11 @@ func (l *tlsListener) Init(md md.Metadata) (err error) { return } - ln, err := net.Listen("tcp", l.options.Addr) + network := "tcp" + if xnet.IsIPv4(l.options.Addr) { + network = "tcp4" + } + ln, err := net.Listen(network, l.options.Addr) if err != nil { return } diff --git a/listener/tun/listener.go b/listener/tun/listener.go index 4d5aef1..a73ad47 100644 --- a/listener/tun/listener.go +++ b/listener/tun/listener.go @@ -7,6 +7,7 @@ import ( "github.com/go-gost/core/logger" mdata "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" mdx "github.com/go-gost/x/metadata" "github.com/go-gost/x/registry" ) @@ -40,7 +41,11 @@ func (l *tunListener) Init(md mdata.Metadata) (err error) { return } - l.addr, err = net.ResolveUDPAddr("udp", l.options.Addr) + network := "udp" + if xnet.IsIPv4(l.options.Addr) { + network = "udp4" + } + l.addr, err = net.ResolveUDPAddr(network, l.options.Addr) if err != nil { return } diff --git a/listener/udp/listener.go b/listener/udp/listener.go index c167d90..1b37912 100644 --- a/listener/udp/listener.go +++ b/listener/udp/listener.go @@ -8,6 +8,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" "github.com/go-gost/x/registry" ) @@ -38,13 +39,17 @@ func (l *udpListener) Init(md md.Metadata) (err error) { return } - laddr, err := net.ResolveUDPAddr("udp", l.options.Addr) + network := "udp" + if xnet.IsIPv4(l.options.Addr) { + network = "udp4" + } + laddr, err := net.ResolveUDPAddr(network, l.options.Addr) if err != nil { return } var conn net.PacketConn - conn, err = net.ListenUDP("udp", laddr) + conn, err = net.ListenUDP(network, laddr) if err != nil { return } diff --git a/listener/ws/listener.go b/listener/ws/listener.go index 1f0e52c..b576389 100644 --- a/listener/ws/listener.go +++ b/listener/ws/listener.go @@ -11,6 +11,7 @@ import ( "github.com/go-gost/core/logger" md "github.com/go-gost/core/metadata" metrics "github.com/go-gost/core/metrics/wrapper" + xnet "github.com/go-gost/x/internal/net" ws_util "github.com/go-gost/x/internal/util/ws" "github.com/go-gost/x/registry" "github.com/gorilla/websocket" @@ -80,7 +81,11 @@ func (l *wsListener) Init(md md.Metadata) (err error) { l.cqueue = make(chan net.Conn, l.md.backlog) l.errChan = make(chan error, 1) - ln, err := net.Listen("tcp", l.options.Addr) + network := "tcp" + if xnet.IsIPv4(l.options.Addr) { + network = "tcp4" + } + ln, err := net.Listen(network, l.options.Addr) if err != nil { return }