Dnsmasq+ipset+iptables基於域名的流量管理


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支持

 

首先我們編輯dnsmasq的配置文件,Ubuntu和Openwrt的目標均為/etc/dnsmasq.conf

添加如下黃線中的幾句

 

前兩句的意思是將所有.com和.hk結尾的域名請求都發往OpenDNS的服務器,端口5353,這樣可以防止ISP和GFW的一些域名污染,防止請求的頁面被誤導或者頁面上出現莫名其妙的廣告

最后一行是指將yahoo.com和google.com的域名解析IP結果存儲到vpn和search的ipset結果中,准備交給iptables識別和轉發。

而且在此之前我們需要建立v*n和search兩個ipset表,可以使用如下語句

sudo ipset create 列表名 hash:ip
然后我們建立完成之后可以列出這個表的所有ip記錄,目前當然是空的了

sudo ipset list 列表名
然后我們可以使用nslookup命令查詢我們上面規定好的yahoo.com和google.com,然后dnsmasq就會自動的將這兩個域名的解析結果存放到我們剛剛建立的ipset中去,該過程如下圖


如上圖,在查詢玩yahoo之后,雅虎的兩個IP就被存放到了我們設置的ip集合中去了

同樣我們可以再查詢一下google.com的域名並把這個域名放到ip集合中

 

看,這么多的ip都被放到vpn這個ip集合中了。

然后我么再使用iptables做相應的規則轉發即可,比如我們把目標地址為這兩個域名的流量轉發到1080端口進行SSH或者SS代理

sudo iptables -t nat -I PREROUTING -m set --match-set 列表名 dst -j REDIRECT --to-ports 1080
當然,如果你是黑名單可以做DROP或者RETURN處理
sudo iptables -t nat -I PREROUTING -m set --match-set 列表名 dst -j RETURN
如果IP集合不是目標地址而是原地址,可以把dst換成src


如果你要處理的域名很多,那么寫在/etc/dnsmasq.conf會顯得凌亂不堪,所以我們不妨另起一個或多個文件存放這些域名配置

首先我們可以找個目錄隨便起名建立一個文件,目錄我們就選/home/alex/config/dnsmasq.d好了,其中alex是我Ubuntu系統的用戶名

然后再這個目錄下建立一個文件,比如ip_filter.conf

然后把上面黃線的內容寫入進去,比如我要建立一個國內常用網址的就可以像下面這么寫

 

然后再/etc/dnsmasq.conf中添加如下

 

這樣就可以可以實現和直接寫在配置文件中相同的效果

 

參考文章:https://hong.im/2014/07/08/use-ipset-with-shadowsock-s-on-openwrt/




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM