XIU2 / SNIProxy

🧷 自用的简单 SNIProxy(常用于网站负载均衡、基于域名(SNI)的端口转发等

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

监听使用服务器的 ipv4, 转发流量的时候 使用ipv6 出

Chanli520 opened this issue · comments

功能需求

监听使用服务器的 ipv4, 转发流量的时候 使用ipv6 出 , 怎样实现?

预期目标

监听使用服务器的 ipv4, 转发流量的时候 使用ipv6 出 , 怎样实现?

commented

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 了。