iptables只能根据ip地址进行转发,不能识别域名,而dnsmasq-full不仅可以实现域名-IP的映射,还可以把这个映射关系存储在ipset中,所以使用dnsmasq+ipset就可以实现iptables对域名的转发,可以实现很多功能,比如:
禁止浏览某些网站,如taobao.com
对国内和国外的流量进行不同路径的转发或者代理,可以应用在ss或者SSH这样的代理中,加速某些网站访问速度。
原理很简单,就是Dnsmasq接收到一个DNS查询请求,首先匹配配置文件中的域名列表,如果匹配成功某域名,就把IP的查询结果存储在一个或几个ipset集合中,然后使用iptables对这个ipset中的全部ip进行匹配并做相应的处理,如DROP或者REDIRECT。
下面来看一下Dnsmasq+ipset的工作过程
首先Ubuntu16.04自带dnsmasq-full,Openwrt 15.05等较新的版本的dnsmasq也支持ipset,并将本机的dns服务器设置为dnsmasq(/etc/resolv.conf中将域名服务器设置为127.0.0.1遍指向了本地的dnsmasq服务)。
其中ipset默认没有被安装,Ubuntu和Openwrt均可使用自带的软件包安装源进行安装,具体步骤这里就不细说了,就像安装普通的包一样。
我们可以通过dnsmasq -v来查看当前主机的dnsmasq是否添加了ipset支持