愚蠢的地球人

OpenWRT路由器科学上网自动分流的工作原理

最近研究了一台刷了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;
}

tianzhaidd 评论于
回复
你好 请问是否能在梅林上实现自动分流?
愚蠢的地球人 评论于
回复
梅林固件没有研究过
网络小包 评论于
回复
大佬,目前op里面的passwall又添加了chinadns-ng 还有pdnsd分流,这又变成了什么流程呢
愚蠢的地球人 评论于
回复
都是为了解决DNS劫持和污染问题的,选择一种最适合自己网络环境的方案就可以了,具体的工作原理我没有详细去研究。
范强哲 评论于
回复
不明白 ,passwall 可以直接根据geo文件分别 指定DNS解析。为什么还需要其他dns 插件dns。
musicman 评论于
回复
因为geo域名集合其实是passwall用*ray核心处理的,如果只用geo的话会将所有流量都先导入*ray核心来分流,*ray处理流量的效率是远远不如iptables的

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

相关推荐

友情链接

网站分类

最新留言

最近发表