feat: add support for setting custom udp listen port on the xtcp mode

pull/4681/head
zjay1987 2025-02-20 02:48:12 +00:00
parent 1e8db66743
commit 5b32150188
4 changed files with 9 additions and 4 deletions

View File

@ -64,7 +64,7 @@ func (pxy *XTCPProxy) InWorkConn(conn net.Conn, startWorkConnMsg *msg.StartWorkC
} }
xl.Tracef("nathole prepare start") xl.Tracef("nathole prepare start")
prepareResult, err := nathole.Prepare([]string{pxy.clientCfg.NatHoleSTUNServer}) prepareResult, err := nathole.Prepare([]string{pxy.clientCfg.NatHoleSTUNServer}, "")
if err != nil { if err != nil {
xl.Warnf("nathole prepare error: %v", err) xl.Warnf("nathole prepare error: %v", err)
return return

View File

@ -275,7 +275,7 @@ func (sv *XTCPVisitor) makeNatHole() {
} }
xl.Tracef("nathole prepare start") xl.Tracef("nathole prepare start")
prepareResult, err := nathole.Prepare([]string{sv.clientCfg.NatHoleSTUNServer}) prepareResult, err := nathole.Prepare([]string{sv.clientCfg.NatHoleSTUNServer}, sv.cfg.UDPListen)
if err != nil { if err != nil {
xl.Warnf("nathole prepare error: %v", err) xl.Warnf("nathole prepare error: %v", err)
return return

View File

@ -157,6 +157,11 @@ type XTCPVisitorConfig struct {
MinRetryInterval int `json:"minRetryInterval,omitempty"` MinRetryInterval int `json:"minRetryInterval,omitempty"`
FallbackTo string `json:"fallbackTo,omitempty"` FallbackTo string `json:"fallbackTo,omitempty"`
FallbackTimeoutMs int `json:"fallbackTimeoutMs,omitempty"` FallbackTimeoutMs int `json:"fallbackTimeoutMs,omitempty"`
// Specify the listen addr and port for the UDP NAT hole punching, the format is "addr:port" like "0.0.0.0:7000".
// It is useful when your router's NAT hole punching doesn't work well, so you can explicitly config a UDP port
// forwarding rule on the router to work around.
UDPListen string `json:"udpListen,omitempty"`
} }
func (c *XTCPVisitorConfig) Complete(g *ClientCommonConfig) { func (c *XTCPVisitorConfig) Complete(g *ClientCommonConfig) {

View File

@ -108,9 +108,9 @@ func PreCheck(
} }
// Prepare is used to do some preparation work before penetration. // Prepare is used to do some preparation work before penetration.
func Prepare(stunServers []string) (*PrepareResult, error) { func Prepare(stunServers []string, udpListen string) (*PrepareResult, error) {
// discover for Nat type // discover for Nat type
addrs, localAddr, err := Discover(stunServers, "") addrs, localAddr, err := Discover(stunServers, udpListen)
if err != nil { if err != nil {
return nil, fmt.Errorf("discover error: %v", err) return nil, fmt.Errorf("discover error: %v", err)
} }