愚蠢的地球人

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:

More...