diff --git a/README.md b/README.md index 0777037..ea7bf4d 100644 --- a/README.md +++ b/README.md @@ -184,7 +184,8 @@ encryption. If you need a proxy, just use our proxy modes. "recv_window_conn": 15728640, // QUIC stream receive window "recv_window_client": 67108864, // QUIC connection receive window "max_conn_client": 4096, // Max concurrent connections per client - "disable_mtu_discovery": false // Disable Path MTU Discovery (RFC 8899) + "disable_mtu_discovery": false, // Disable Path MTU Discovery (RFC 8899) + "ipv6_only": false // Only resolve domains to IPv6 address } ``` diff --git a/README.zh.md b/README.zh.md index b61f26c..98fc479 100644 --- a/README.zh.md +++ b/README.zh.md @@ -170,7 +170,8 @@ Hysteria 是一个功能丰富的,专为恶劣网络环境进行优化的网 "recv_window_conn": 15728640, // QUIC stream receive window "recv_window_client": 67108864, // QUIC connection receive window "max_conn_client": 4096, // 单客户端最大活跃连接数 - "disable_mtu_discovery": false // 禁用 MTU 探测 (RFC 8899) + "disable_mtu_discovery": false, // 禁用 MTU 探测 (RFC 8899) + "ipv6_only": false // 强制把域名解析成 IPv6 地址 } ``` diff --git a/cmd/config.go b/cmd/config.go index ee7ac9a..4b4902f 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -46,6 +46,7 @@ type serverConfig struct { ReceiveWindowClient uint64 `json:"recv_window_client"` MaxConnClient int `json:"max_conn_client"` DisableMTUDiscovery bool `json:"disable_mtu_discovery"` + IPv6Only bool `json:"ipv6_only"` } func (c *serverConfig) Check() error { diff --git a/cmd/server.go b/cmd/server.go index 828fd83..f5d7a44 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -128,6 +128,10 @@ func server(config *serverConfig) { if len(config.Obfs) > 0 { obfuscator = obfs.NewXPlusObfuscator([]byte(config.Obfs)) } + // IPv6 only mode + if config.IPv6Only { + transport.DefaultTransport = transport.IPv6OnlyTransport + } // ACL var aclEngine *acl.Engine if len(config.ACL) > 0 { diff --git a/pkg/transport/transport.go b/pkg/transport/transport.go index 8bcd407..fc48a6f 100644 --- a/pkg/transport/transport.go +++ b/pkg/transport/transport.go @@ -22,6 +22,12 @@ var DefaultTransport Transport = &defaultTransport{ Timeout: 8 * time.Second, } +var IPv6OnlyTransport Transport = &ipv6OnlyTransport{ + defaultTransport{ + Timeout: 8 * time.Second, + }, +} + type defaultTransport struct { Timeout time.Duration } @@ -67,3 +73,11 @@ func (t *defaultTransport) LocalListenTCP(laddr *net.TCPAddr) (*net.TCPListener, func (t *defaultTransport) LocalListenUDP(laddr *net.UDPAddr) (*net.UDPConn, error) { return net.ListenUDP("udp", laddr) } + +type ipv6OnlyTransport struct { + defaultTransport +} + +func (t *ipv6OnlyTransport) LocalResolveIPAddr(address string) (*net.IPAddr, error) { + return net.ResolveIPAddr("ip6", address) +}