fix(client): force AF_INET socket when resolvePreference is IPv4 - #1606
Open
HaizakiKu wants to merge 1 commit into
Open
fix(client): force AF_INET socket when resolvePreference is IPv4#1606HaizakiKu wants to merge 1 commit into
HaizakiKu wants to merge 1 commit into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #1599.
Problem
On Linux systems with IPv4-only virtual interfaces like
ip.greGRE tunnels,the Hysteria client fails with:
The root cause: Go's
netpackage defaults to dual-stackAF_INET6sockets whenthe network type is
"udp". Linux GRE tunnels are strictly IPv4 structures andsilently drop outbound UDP packets arriving from an
AF_INET6socket, causing theQUIC handshake to time out.
straceconfirms the issue -- even when the server address is a plain IPv4 address,the outbound QUIC socket was created as
AF_INET6and bound to:::Fix
After
fillServerAddrresolves the server address,fillConnFactorynow inspectsthe resolved IP and selects the appropriate UDP network type before opening the
socket:
"udp4"→AF_INETsocket"udp6"→AF_INET6socketThis applies to both the regular UDP path and the port-hopping path.
Changes
fillConnFactory: pass resolved network type toso.ListenUDPAddrNetworkinstead of the implicit dual-stack
so.ListenUDPudpNetworkFromAddrhelper