双栈网络配置
- 保证标准化的语法和词法。
- 减少中文翻译的歧义性。
1. 引言
所谓 IPv4 over FRP 和 IPv6 实现的双栈网络,其基本原理即为利用 RFC 6724 和 RFC 8305 定义的自动选择规则,通过 DNS 的 A 记录和 AAAA 记录,分别指向源站的 IPv6 地址 和 FRPS 所在的 IPv4 地址。由于解析的地址通常各不相同,但应用程序连接的端口通常相同,因此我们需要将 IPv6 上监听的端口调整为与 FRPS 暴露的远程端口相同的端口,使域名解析到的每一个 IP 地址都监听了目标服务,此即完成配置。
1.1 架构拓扑
由于文档推荐如果应用支持则PROXY protocol总是处于开启状态,故此处分情况讨论。
当PROXY protocol支持时:
- FRPC应当总是启用PROXY protocol v2支持
- 如果您的应用支持分别配置ipv6监听的地址和是否启用PROXY protocol,则直接监听与frps一致的外部端口即可
- 如果您的应用不支持分别配置ipv6监听的地址和端口,通常你需要一个端口映射,例如iptables的端口转发(并保留源ip和端口)
- 如果您的应用不支持在各个端口上分别配置是否启用PROXY protocol,则前端需要添加一个PROXY protocol Header,不再使用端口转发
2. 基本配置方法
本文假设您对网络有基本认识,能够区分IPv4, IPv6, FRPC, FRPS, PROXY protocol, DNS Record等相关术语并以了解如何配置。
此处适用于 Windows 和 Linux, 请发挥举一反三的能力。
2.1 获取 IPv4 和 IPv6 地址
- 首先,创建隧道。
- 创建完成后您会获得一个形如
cn-frp-1.qwq.fan:14514FRPS的外部连接地址。 - 使用任何你喜欢的方式获取外部连接地址中的域名所对应的IPv4地址,然后记下来。
nslookup cn-frp-1.qwq.fan -q=A获取 IP 地址,Linux 使用dig cn-frp-1.qwq.fan 或者用网页DNS查询,总之任何方式能拿到IP地址都可以。- 使用任何你喜欢的方式,获取服务器的IPv6地址,通常
ipconfig(on Windows) 和ifconfig(on Linux)即可,然后记下来。
2.2 配置 DNS 解析
由于篇幅受限(和作者懒得截图),不会使用具体服务商,只是通用说明。
在 DNS 服务商中,为你的域名添加一个或多个A记录解析到所有已创建隧道的 FRPS 的 IPv4 地址上。
在 DNS 服务商中,为你的域名添加一个或多个 AAAA 记录解析到所有服务器的网络接口卡的 IPv6 地址上。
IPv6 地址(而不是临时 IPv6 地址),创建一个 DNS 解析记录即可。2.3 配置端口
如果您的服务不支持 PROXY protocol, 那么直接将内部端口设置为与外部端口一致,并修改frpc的本地端口也是可以的。
如果您的服务支持 PROXY protocol v2(由于UDP不支持在PROXY protocol v1上工作,并且v2性能高得多),那么您需要一些额外的配置。
推荐使用HAProxy监听一个与FRPS相同的远程端口,然后回源添加PROXY protocol Header。
2.4 访客连接
直接使用 域名:端口 连接即可。
3. 一般性安全建议
如果您的后端服务支持 PROXY protocol 并已在 FRPC 上启用,那么您应当使用防火墙禁止任何外部流量直接访问到后端服务,并且在本地部署支持 PROXY protocol Header 的反向代理监听以完整记录来自 IPv4 和 IPv6 的流量的原始四元组信息,如 HAProxy 或 NGINX 或 FRPC + FRPS 等方法,您可以自行探索。
推荐支持的应用启用TLS以保护传输层安全。
4. 常见问题
此处记录了一些常见问题。
FRPS 的 IP 地址经常变更怎么办,可以使用 CNAME 吗
不行,CNAME会覆盖AAAA。
您可以尝试使用脚本轮询 FRPS 的 IPv4 地址,并通过服务商的 DNS 解析 API 更新 A 记录。
配置之后 v6/v4 只有一个能连
IPv6 上的 timeout 通常是防火墙问题。
如果不是 timeout, 可能你的IPv6地址没有添加PROXY protocol Header(如果你的应用启用了)。
对于一般的应用,是不能兼容同时启用和不启用PROXY protocol Header的。
亦有可能你本地服务根本没有监听 IPv6 地址([::], 或 [::1] (当本机运行HAProxy并为后端添加防火墙时)),或你的应用不支持使用 IPv6 连接。