监听使用服务器的 ipv4, 转发流量的时候 使用ipv6 出
Chanli520 opened this issue · comments
功能需求
监听使用服务器的 ipv4, 转发流量的时候 使用ipv6 出 , 怎样实现?
预期目标
监听使用服务器的 ipv4, 转发流量的时候 使用ipv6 出 , 怎样实现?
SNIProxy 这方面都是交给系统处理的(DNS 解析、缓存等等)。
SNIProxy 传入协议和传出协议(也就是 IPv4 / IPv6)是无关联的,转发流量的目的 IP 取决于系统 DNS 解析结果,因此走 IPv4 还是 IPv6 也取决于系统给出的域名 DNS 解析结果。
当某个程序在请求某个域名的 DNS 解析结果时,系统会同时解析该域名的 A 记录和 AAAA 记录,如果域名是双栈的(同时有 IPv4 和 IPv6),那么系统会根据当前的 DNS 优先级来决定返回的是 IPv4 还是 IPv6。
如果目标域名压根没有 IPv6 解析结果,那么自然只能走 IPv4 了(反过来同理)。
如果目标域名同时有 IPv4 和 IPv6 解析结果,那么则取决于系统是 IPv6 优先还是 IPv4 优先,不过默认都是 IPv6 优先。
我这边也顺便在 Linux 服务器上测试了下,也确实是这样。
因此在默认系统 DNS IPv4/IPv6 优先级的情况下,访问有 IPv6 解析结果的域名时,SNIProxy 转发流量会走 IPv6(当然服务器本身也要有 IPv6 )。
所以说,对于你提的需求 "监听使用服务器的 ipv4, 转发流量的时候 使用ipv6 出 "
,你什么都不用做,默认就是这样,除非目标域名没有 IPv6 解析结果,或者你修改了系统 DNS 优先级。
你可以在 Linux 服务器上 ping cloudflare.com
如果显示的是 IPv4 说明你的系统是 IPv4 优先,显示 IPv6 则同理。
如果你修改了 /etc/gai.conf
文件来更改系统 IPv4/IPv6 优先级,那么需要重启 SNIProxy + 清理 Linux 系统的 DNS 缓存(如果还不行,则尝试重启 Linux 服务器试试),这样再去访问同一个目标域名,才能确保 SNIProxy 转发流量走的 IP 协议是你设置的优先级。
如果你想要系统是优先 IPv4,但是部分域名优先 IPv6,那么只能去修改 /etc/hosts
来手动给这些域名指向 IPv6 地址,这样系统 DNS 解析时就会返回 hosts 里指定的 IP 了。