内容提要
本文介绍了如何使用OpenWRT和iptables来实现国内流量直连的方法。通过设置iptables规则,将国内IP地址直接返回,从而实现国内流量的直连。同时,还介绍了使用ipset来存储国内IP地址的方法,并提供了一个简单的脚本来导入APNIC的国内IP段列表。此外,还介绍了如何在xray配置文件中拦截广告流量,并通过监听xray的访问日志来判断是否是国内IP,并将其写入ipset中。通过这些方法,可以实现国内流量的直连和广告拦截,提高访问速度并防止DNS泄漏。
延伸解读
内核转发与用户空间转发的性能差异
文章指出,iptables 修改的是内核空间的 netfilter,而 Xray 工作在用户空间。转发流量若走内核只需经过 netfilter,而走 Xray 则需将数据包从内核传递到用户空间处理,再返回内核,增加了上下文切换和拷贝开销。因此,将国内 IP 直接在内核层 RETURN,可避免不必要的用户空间处理,从而提升转发效率。
ipset 在规则匹配中的效率优势
文章解释,ipset 是 iptables 的扩展,允许创建匹配整个地址集合的规则,而普通 iptables 链只能单 IP 匹配。ipset 将 IP 集合存储在带索引的数据结构中,即使集合较大也能高效查找。因此,将国内 IP 段存入 ipset 后,iptables 规则只需匹配集合,无需逐条列出 IP,既简化配置又提升匹配速度。
动态更新国内 IP 列表以兼顾广告拦截与防 DNS 泄漏
文章提到,若国内广告 IP 被直接转发,Xray 中的广告拦截规则将失效。为此,作者通过监听 Xray 的 access log,提取 direct 和 out-proxy 流量的目标 IP,判断是否属于国内 IP,并将结果写入专门的 ipset。这样,iptables 仅针对该动态 ipset 进行直连判断,既能排除广告 IP,又能排除 DNS 服务器 IP,有助于防止 DNS 泄漏。
脚本实现中的关键细节
文章提供的 Python 脚本使用 async_tail 监听日志,通过正则解析出协议、目标 IP、端口及出站标签。对于 direct 和 out-bt 流量,直接保存;对于其他流量,则先查询 APNIC 的国内 IP ipset 判断是否为中国 IP。保存时区分 TCP 和 UDP,且排除 UDP 53 端口(DNS),分别写入不同的 ipset。脚本依赖 pyroute2 操作 ipset,并通过 .env 文件配置参数。
Q&A
如何使用OpenWRT和iptables实现国内流量直连?
通过设置iptables规则,将国内IP地址直接返回,从而实现国内流量的直连。
ipset在这个过程中有什么作用?
ipset用于存储国内IP地址,提高查找效率,并允许创建匹配整个地址集合的规则。
如何导入APNIC的国内IP段列表?
可以使用一个简单的脚本,通过curl命令下载APNIC的国内IP段列表并导入到ipset中。
如何在xray中拦截广告流量?
在xray的配置文件中增加广告流量的拦截规则,并监听访问日志判断是否是国内IP。
这个方法如何防止DNS泄漏?
通过排除DNS服务器的IP地址,确保国内流量直接走内核转发,从而防止DNS泄漏。
如何动态更新ipset以提高访问速度?
通过实时监听xray的访问日志,动态判断并更新ipset中的国内IP地址。