进阶配置

双栈网络配置

如何配置双栈(FRP + IPv6)网络
本文为进阶教程并面向专业用户,可能不适合大多数用户。
如果您在文章中看见了某些双语对照内容,它们的设计目的可能是:
  • 保证标准化的语法和词法。
  • 减少中文翻译的歧义性。

1. 引言

所谓 IPv4 over FRP 和 IPv6 实现的双栈网络,其基本原理即为利用 RFC 6724 和 RFC 8305 定义的自动选择规则,通过 DNS 的 A 记录和 AAAA 记录,分别指向源站的 IPv6 地址 和 FRPS 所在的 IPv4 地址。由于解析的地址通常各不相同,但应用程序连接的端口通常相同,因此我们需要将 IPv6 上监听的端口调整为与 FRPS 暴露的远程端口相同的端口,使域名解析到的每一个 IP 地址都监听了目标服务,此即完成配置。

1.1 架构拓扑

由于文档推荐如果应用支持则PROXY protocol总是处于开启状态,故此处分情况讨论。

本文的前提假定您的应用支持同时监听IPv4和IPv6(如果不支持同时监听的,可能需要从v6栈转发到v4栈并可能引起兼容性问题,篇幅问题不赘述)

当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 地址

  1. 首先,创建隧道。
  2. 创建完成后您会获得一个形如cn-frp-1.qwq.fan:14514FRPS的外部连接地址。
  3. 使用任何你喜欢的方式获取外部连接地址中的域名所对应的IPv4地址,然后记下来。
对于 Windows, 可使用nslookup cn-frp-1.qwq.fan -q=A获取 IP 地址,Linux 使用dig cn-frp-1.qwq.fan 或者用网页DNS查询,总之任何方式能拿到IP地址都可以。
  1. 使用任何你喜欢的方式,获取服务器的IPv6地址,通常 ipconfig(on Windows) 和 ifconfig(on Linux)即可,然后记下来。

2.2 配置 DNS 解析

由于篇幅受限(和作者懒得截图),不会使用具体服务商,只是通用说明。

在 DNS 服务商中,为你的域名添加一个或多个A记录解析到所有已创建隧道的 FRPS 的 IPv4 地址上。

如果您的服务器没有静态 IPv6 前缀,那么推荐搭配 ddns-go 使用。

在 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 连接。