武汉勇远科技
勇远科技微信二维码
微信咨询
扫一扫获取方案
24小时服务热线
177 6259 3139

基于Tinc与MosDNS的IPv4 IPv6双栈高可用分流网关设计与实现

摘要
随着互联网环境的日益复杂,如何构建一个既能保证国内网络极速直连,又能安全、透明地代理海外流量的家庭/企业网关,成为了网络工程师和极客玩家面临的重要课题。本文提出并实现了一种基于 Tinc Mesh VPN 和 MosDNS 的双栈(IPv4/IPv6)高可用透明分流网关方案。通过内核级策略路由(Policy Routing)与 IPset 集合,实现了 IP 层面的精确分流;并通过引入带有 GeoIP 双重兜底验证的 MosDNS 架构,彻底解决了 DNS 污染问题。此外,本文详细剖析了在配置 IPv6 分流时常见的 Linux 内核路由陷阱(如 /128 掩码陷阱与 RA 通告冲突),并给出了标准化的解决方案。测试结果表明,该系统能在 5ms 内极速响应国内请求,同时以 0 丢包率完美转发海外双栈流量。

关键词:Tinc VPN;MosDNS;透明代理;策略路由;IPv6;DNS 污染;IPset


1. 引言

在现代混合网络环境中,单一的全局 VPN 路由会导致访问国内服务(如优酷、Bilibili、百度等)时出现极高的延迟与 CDN 调度异常。为了实现“国内直连、海外代理”的理想状态,透明分流网关(Transparent Split-Routing Gateway)应运而生。
传统的解决方案大多依赖于客户端软件或复杂的应用层代理(如 V2Ray、Clash),但这些方案往往缺乏对底层 ICMP/UDP 协议的完整支持,且难以在不修改终端配置的前提下实现全局接管。为此,本文设计了一种基于底层网络虚拟化接口(TUN/TAP)的网关方案,利用 Tinc 建立安全的跨洋加密隧道,并结合 Linux 原生的 iptables/ip6tables 实现无感知的双栈透明分流。

2. 系统架构设计

本系统的核心架构由三部分组成,分别承担网络互联、IP 路由和域名解析的任务:

  1. 底层传输层(Tinc VPN):在本地网关(LXC 容器,192.168.110.10)与海外节点(DMIT VPS)之间建立安全的 UDP 隧道(tun11),提供原生的 IPv4 与 IPv6 虚拟内网连通性。
  2. 流量调度层(策略路由与 Netfilter):利用 iptables/ip6tables 对经过网关的流量进行基于 IPset 的白名单匹配。匹配为国内 IP 的流量直接返回主路由表(通过 eth0 直连);匹配为海外 IP 的流量打上特定的防火墙标记(fwmark 0x2),强制引入自定义路由表(Table 200)送入 Tinc 隧道。
  3. 域名解析层(MosDNS):作为网关的本地 DNS 核心,通过 geositegeoip 数据库对 DNS 请求进行智能分流与 IP 溯源验证,彻底杜绝 GFW 的 DNS 抢答污染。

3. Tinc 隧道与双栈网络互通

Tinc 是一款轻量级、去中心化的 Mesh VPN,极度适合构建跨地域的虚拟局域网。

3.1 基础配置与 IPv4 互通

在本地与远端分别生成 RSA/Ed25519 密钥对,并交换 hosts 文件。海外节点配置为主动监听,本地节点负责发起连接。
本地虚拟 IP100.64.10.254/24
海外虚拟 IP100.64.10.3/24

3.2 IPv6 通信与子网宣告限制

在双栈配置中,我们需要在虚拟接口上分配唯一的 ULA(Unique Local Address,如 fd00:100:64::/64)。
挑战与解决:Tinc 1.0 版本对 ::/0 的全局路由宣告支持存在局限性。为确保海外节点能够接收本地发送的所有未知 IPv6 流量,必须在 hosts/dmit 文件中将全零路由拆分为两段进行声明:

Subnet = 0000::/1
Subnet = 8000::/1

3.3 Linux 内核路由陷阱剖析

在 IPv6 隧道的建立过程中,极易触发两个隐蔽的内核陷阱:
1. /128 掩码黑洞:若 tinc-up 脚本中直接绑定 /128 地址(如 ip -6 addr add fd00:100:64::254/128 dev tun11),Linux 内核将不会自动生成到达子网 fd00:100:64::/64 的链路层路由。这会导致内核在收到远端的 ICMP6 响应时,无法将其路由给 tun11 接口,而是错误地发向公网网卡从而被丢弃。
解决:在 tinc-up 中显式添加子网路由:ip -6 route add fd00:100:64::/64 dev $INTERFACE
2. 转发模式与 RA 通告冲突:当通过 sysctl -w net.ipv6.conf.all.forwarding=1 开启网关转发能力时,Linux 内核会默认忽略上游路由器的 RA(Router Advertisement)通告。这会导致网关丢失自身的 IPv6 默认路由,使得国内 IPv6 流量陷入 Destination unreachable
解决:强制网关在转发模式下依然接受 RA 通告:
bash
sysctl -w net.ipv6.conf.all.accept_ra=2
sysctl -w net.ipv6.conf.eth0.accept_ra=2

4. 策略路由与 IP 分流机制

系统采用双链结构(PREROUTING 处理局域网转发流量,OUTPUT 处理网关本机流量)进行分流打标。

4.1 基于 IPset 的国内白名单

在系统启动时,通过自定义脚本将中国大陆的 IPv4 与 IPv6 地址段加载入内存级别的哈希集合(cn_ipscn_ipv6)中。
利用 Netfilter 的 mangle 表进行匹配,命中白名单的流量直接 RETURN 跳出过滤链:

iptables -t mangle -A TINC_ROUTING -m set --match-set cn_ips dst -j RETURN
ip6tables -t mangle -A TINC_ROUTING -m set --match-set cn_ipv6 dst -j RETURN

4.2 避免加密隧道的路由环路

对于 Tinc 自身发往海外节点公网 IP(如 DMIT 的 2605:52c0:...)的加密 UDP 流量,如果未加豁免,同样会被打上 0x2 标记,导致数据包被扔回虚拟隧道,形成死循环(Routing Loop)。
因此必须在打标规则前增加豁免规则:

ip6tables -t mangle -A TINC_SELF -d 2605:52c0:2:2967:be24:11ff:fe69:feeb -j RETURN

4.3 MSS 钳制与防断流

VPN 隧道带来的额外封装包头会导致 MTU 减小,而部分网络节点会丢弃 ICMP 分片需求报文(PMTUD 黑洞),最终表现为“能 Ping 通但网页打不开”的假死现象。通过 TCPMSS 模块可彻底解决此问题:

iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

5. 基于 MosDNS 的防污染域名分流

即使 IP 路由正确,如果客户端向 DNS 发起请求时获取到了由 GFW 返回的伪造 IP(DNS Poisoning,通常返回 Facebook 等国外不相关 IP 导致连接超时),流量也无法到达真实的目标服务器。

5.1 GeoIP 双重兜底策略 (Dual-Fallback Mechanism)

为了实现无懈可击的 DNS 分流,网关未采用简单的“域名黑白名单”,而是引入了更加强大的 MosDNS 进行 IP 溯源验证。

其核心分流执行序列设计如下:
1. 已知列表快速匹配:匹配 geosite_cn 的域名直接交由国内 DNS(如湖北电信 202.103.24.68)解析;匹配 geosite_gfw 的被墙域名,直接交由海外 DNS(8.8.8.8)通过 Tinc 隧道加密解析。
2. 未知域名的双重验证(核心机制):对于不在任何已知列表中的域名,系统首先向国内 DNS 发起查询。当获得返回结果时,并不立即交付客户端,而是将返回的 IP 送入 geoip_cn 数据库比对:
– 如果 IP 属于中国大陆,证明未被污染,放行响应。
如果 IP 属于海外,判定其面临极高的污染风险,直接丢弃该响应 (drop_resp),并强制回退使用海外 DNS(8.8.8.8)重新解析。

该方案彻底消除了因规则库更新滞后而导致的漏网污染,保证了所有未知海外站点的访问安全性。

6. 结论

本文介绍的基于 Tinc 与 MosDNS 的透明分流网关方案,通过底层路由控制、IP 表集合与智能 DNS 策略的完美契合,成功建立了一个健壮、无感的家庭/企业级网络入口。测试证明,该网关对终端设备完全透明(无需安装任何代理软件),在保证内网 IPv4 与 IPv6 双栈海外畅游的同时,国内直连延迟保持在极优的本地级水平。所总结的关于内核 RA 接受机制及 /128 掩码陷阱的经验,对网络工程师排查同类双栈 VPN 故障具有重要的参考价值。

参考文献

[1] Tinc VPN Official Documentation. https://www.tinc-vpn.org/
[2] Linux iproute2 documentation. https://wiki.linuxfoundation.org/networking/iproute2
[3] MosDNS: A modular DNS forwarder. https://github.com/IrineSistiana/mosdns
[4] Loyalsoldier V2Ray Rules Dat. https://github.com/Loyalsoldier/v2ray-rules-dat