在開發路由器的時候,有個需求,是要求將xxx.com域名解析爲路由器的本地ip。相似於在極路由下的電腦解析hiwifi.com,會指向極路由的192.168.199.1。
起初想的很簡單,直接改/etc/hosts文件,增長一個hosts就行了,或者在/etc/dnsmasq.conf裏增長一條也行。但當路由器下的主機本身指定dns服務器的時候,這招就完全無效了。
因而想到用萬能的iptables來實現。思路是要解析xxx.com,那最好是用iptables的string模塊了,而後在nat表中,使用DNAT,把包含此字符串的發向53端口的udp的包都重定向到路由器本地ip,由路由器經過hosts也好,經過dnsmsaq.conf也好,解析完成後再回給主機。因而乎這麼寫:web
iptables -t nat -A PREROUTING -p udp --dport 53 -m string --string "aabb.com" -j DNAT --to-destination 10.168.77.1
暢快的寫完以後傻眼了,不能用,徹底沒效果,這是咋回事?
因而使用tcpdump命令,截包看一下,dns請求的時候,是哪一步和我想象的不同,因而截取到了下面圖中的數據:
在紅色框中,能夠看到有aabb.com的字符串。等等!爲啥」.」在這裏不是用的ascii字符而是用的0x03來表示??
看來問題就出在這裏了,原來dns解析的時候,」.」這個特殊字符是用的hex裏的0x03來表示,難怪上面的iptables命令無效。
那麼就像下面這樣來寫:服務器
iptables -t nat -A PREROUTING -p udp --dport 53 -m string --hex-string "aabb|03|com" -j DNAT --to-destination 10.168.77.1
而後一測試,果真就OK了~!tcp