CatWrt 使用经验
Proxy 软件 DNS 解析模式怎么选?
DNS 解析模式大致分为 Redir-Host 和 Fake-IP 两大类。
Fake-IP
什么是 Fake-IP 模式呢?
通俗地讲,Fake-IP 模式是指 Proxy 软件在处理 DNS 请求时,首先将域名解析到内网 IP 池中,并记住这个域名和内网 IP 的映射关系,然后 Proxy 软件会根据域名分流规则处理这些请求:
- 在 Proxy 链中的域名:使用 Fallback DNS(通常为国外 DNS)进行实际解析或直接封装为 Proxy 流量发送到对应的服务器。
- 在 Direct 链中的域名:使用 NameServer(通常为国内 DNS)进行实际解析。
当你对这些内网 IP 发起请求时,Proxy 软件会检查映射表,找到对应的域名,并根据分流规则将流量处理为 Direct 或 Proxy 流量。一般情况下,Meta Core 的配置如下:
fake-ip-range: 192.18.0.0/16
当你的 DNS 请求被 Meta Core 劫持后,返回的 DNS 解析结果就会是这个 IP 池中的地址。
这种做法的目的是:
- 对抗首次解析的干扰:减少已知 Proxy 域名的 DNS 泄露。第一次的 DNS 解析都会被 Proxy 软件根据分流规则处理,避免国内 DNS 泄露已知的 Proxy 域名。
- 利用国内 DNS 的速度优势:在访问国内服务时,解析速度不受影响。
然而,这种模式也有一些代价:
- 部分软件的验证:如果发现是内网网段,可能认为被中间人攻击,拒绝正常工作。
- 一些软件无法使用:比如 UWP 应用,BT、PT 等应用可能会有问题。UWP 应用尚且可以通过 fake-ip-filter 去解决,那其他类型的情况呢?
综合来看,Fake-IP 只适合大多数普通用户,他们只需要 Proxy 功能,而不对网络进行深入探索,不深度使用 BT、PT 等应用。
Redir-Host
现在说说 Redir-Host 模式。
通俗地讲,Redir-Host 不会将域名解析到内网 IP 池中。你的 DNS 查询会首先使用 NameServer 进行查询,当域名属于 Proxy 域名时,调用 Fallback DNS 进行二次查询。如果 NameServer 和 Fallback DNS 设置为同一个,你会明显观察到 Proxy 域名的查询时延是非 Proxy 域名的两倍。在正确设置下,Redir-Host 模式应始终返回域名的真实 IP,自然没有 Fake-IP 的问题。
然而,这种模式也有一些代价:首次解析使用 NameServer,无论域名是什么,首次解析都会通过 NameServer 进行。当 Proxy 软件匹配分流规则时,如果发现域名在 Proxy 链中,就会调用 Fallback DNS 进行二次查询,确保解析结果没有污染。结果是 Proxy 域名可能会在国内 DNS 泄露。
但也有解决办法:使用无污染的 DNS,例如,自建上游 DNS 或使用 Google DNS。这样就不需要 Fallback DNS,因为你已经能保证 DNS 的纯净,Proxy 域名不会传递给大陆 DNS,在这个过程中,你应该会使用加密 DNS,这样可以防止中间人劫持等。可以使用 ipleak 检查 Redir-Host 模式下的 DNS 泄露。如果没有一个大陆 DNS,则认为可以。
我个人强烈推荐 Redir-Host 模式,因为这个模式才是符合直觉的,不会造成很多非预期行为。
如果想详细了解这些,请在评论区告诉我,我会考虑再写一篇。
防火墙的 IP 动态伪装
这个名字有些拗口,直接称为 NAT 功能总开关更清晰明了。开启该功能即启用该接口的 NAT 模式,如果在 WAN 口开启,来自 LAN 口的流量会进行 FORWARD + NAT。
防火墙的 MSS 钳制
这个名字也不太好理解,称为 MTU 匹配功能开关更清晰明了。其功能非常简单:将发送的数据包匹配到当前接口的 MTU。当数据包大于 MTU 值时,会进行分包发送,使数据包更加碎片化,可能增加丢包率,网络延迟明显增大等,用户会观察到网页加载时间变长。打开这个开关可以避免这些问题,提高网页加载速度。
开启该功能开关后,可以防止 IP 分片,以及超大数据包导致的网络延迟。
这个功能有代价吗?当然有。CPU 处理数据包会有额外的性能开销,增加负载,可能影响极限性能。
如何手动调整网卡的 MTU 值呢?
首先应测试目标接口的 MTU 值。因为我的 CatWrt 是旁路网关,我就测试 PC 到该网关的 MTU 值。
ping -M do -s 1472 175.45.176.100 # 175.45.176.100 为 CatWrt 的 LAN(v4)口地址
如果数据包过大,会返回如下信息:
ping: local error: message too long
示例命令设置的数据包大小为 1472 字节,可以以 2 字节为梯度逐步减小数据包大小,直到找到合适的大小。假设 1472 字节的大小成功 ping 通,对于 IPv4 的计算方法如下:
1472 + 8(ICMP 报文长度)+ 20 (IPv4 头部长度)= 1500
对于 IPv6,假设 1450 字节成功,计算方法如下:
1450 + 8(ICMP 报文长度)+ 40(IPv6 头部长度)= 1498
这个值可以在 CatWrt 的接口设置中调整。如果你的 LANv6 和 LANv4(IPv6 和 IPv4 逻辑接口)绑定的是同一个物理接口,建议以 IPv6 设置 CatWrt LAN 接口的 MTU 值,然后修改 PC 网络接口的 MTU 值(可以不修改,正常的都会去自动设置 MTU 值),与之对应。如图所示: