最近研究了一台刷了OpenWRT的路由器,里面有一个科学上网的工具引发了我的兴趣。
研究了好几天,终于把国内国外流量自动分流的原理弄清了。
很多东西都是个人的猜测,如有不对的地方,欢迎大家留言讨论。

OpenWRT科学上网自动分流主要是利用了如下几个工具:iptables、ipset、dnsmasq、pdnsd。我先来一个一个的解释一下这几个东东:

iptables是Linux系统自带的基于包过滤的防火墙工具,可以对流入、流出及流经服务器的数据包进行精细的控制。

ipset是iptables的扩展,它允许你创建某一类IP地址的集合,然后将这个集合交给iptables来处理。

dnsmasq是一个DNS缓存服务器,它可以将特定的域名发送给不同的dns服务器进行解析,不仅如此,它还可以把解析出来的IP地址存储在指定的ipset中。

pdnsd也是一个DNS缓存服务器,相对于dnsmasq,pdnsd的优点是可以使用TCP方式来查询DNS,但是pdnsd无法设置ipset,所以需要将dnsmasq和pdnsd两个结合起来使用。

弄清楚了这些工具的作用,OpenWRT路由器科学上网自动分流的工作原理就不难理解了:

首先,科学上网的进程启动之后会自动将需要走代理的域名地址添加到dnsmasq的conf-dir目录下的一些名为*.conf的文件中,内容如下:
server=/google.com/127.0.0.1#1053
ipset=/google.com/gfwlist
第一行意思是解析google.com这个域名时不使用默认的DNS服务器,而是将查询请求转发到127.0.0.1#1053(pdnsd侦听的端口),由pdnsd来负责解析。
第二行意思是将google.com解析出来的IP地址添加到一个名为gfwlist的ipset集合里面。
这样,需要走代理的域名使用pdnsd来解析,不需要走代理的域名使用宽带运营商默认的DNS来解析,实现了域名解析的分流。

然后,它会修改iptables的转发规则,将gfwlist这个ipset添加到iptables的NAT规则列表中,利用iptables来转发这个ipset中的数据。
我们来查看一下路由器的iptables如何处理名为gfwlist的这个ipset:

[root@OpenWRT:/root]#iptables -t nat -L -n
REDIRECT  tcp -- 0.0.0.0/0  0.0.0.0/0  multiport dports 80,443 match-set gfwlist dst redir ports 1080

这样,所有访问gfwlist中IP地址的数据包都被转发到了1080端口(科学上网软件监听的端口)来进行处理,实现了数据的分流。

最后讲一下为什么要将指定的域名交给pdnsd来解析:因为pdnsd支持TCP方式查询,可以防止DNS污染,另外将pdnsd的上游查询服务器指定为OpenDNS,可以防止DNS劫持。至于什么叫DNS劫持和DNS污染,有兴趣的可以自行百度一下。
pdnsd的配置文件一般是/var/etc/pdnsd.conf
先设置pdnsd的global下的查询方式为TCP:
query_method=tcp_only;
然后设置一个OpenDNS的上游服务器:
server {
    label= "opendns";
    ip = 208.67.222.222, 208.67.220.220;
    port = 53;
    timeout=6;
    uptest=none;
    interval=10m;
    purge_cache=off;
}

创建于 2020-06-07 20:14:57, 最后更新于 2026-11-05 12:22:20.811972, 所属分类: 计算机 , 22117 次浏览。

6 条评论 最新

  • tianzhaidd
    2021-05-17 22:07:04

    你好 请问是否能在梅林上实现自动分流?

  • 愚蠢的地球人
    2021-05-24 21:26:01

    tianzhaidd:
    你好 请问是否能在梅林上实现自动分流?

    梅林固件没有研究过

  • 网络小包
    2022-05-07 17:43:07

    大佬,目前op里面的passwall又添加了chinadns-ng 还有pdnsd分流,这又变成了什么流程呢

  • 愚蠢的地球人
    2022-05-08 20:09:39

    网络小包:
    大佬,目前op里面的passwall又添加了chinadns-ng 还有pdnsd分流,这又变成了什么流程呢

    都是为了解决DNS劫持和污染问题的,选择一种最适合自己网络环境的方案就可以了,具体的工作原理我没有详细去研究。

  • 范强哲
    2022-10-29 22:42:02

    不明白 ,passwall 可以直接根据geo文件分别 指定DNS解析。为什么还需要其他dns 插件dns。

  • musicman
    2022-11-10 23:13:46

    范强哲:
    不明白 ,passwall 可以直接根据geo文件分别 指定DNS解析。为什么还需要其他dns 插件dns。

    因为geo域名集合其实是passwall用*ray核心处理的,如果只用geo的话会将所有流量都先导入*ray核心来分流,*ray处理流量的效率是远远不如iptables的

回复 愚蠢的地球人: 取消