前阵子因为工作需要,要在中继器(openwrt使用WDS)wifi中继过程中登陆中继器的web。
由于WDS是工作做OSI7层网络模型中的链路层(二层),直接使用iptables进行DNS劫持显然行不通,后来还尝试了使用libpcap进行抓包转发,哈哈,显然行不通,各种折腾。
最后发现Linux还有二层防火墙:)
ebtables – 与iptables相似
详细使用方法可参考 ebtables使用方法。
openwrt使用WDS时DNS劫持步骤
1.openwrt配置WDS
这不是本文章的重点:)
可按住openwrt官网的document进行配置openwrt配置WDS官方文档
我使用的是gl-inet的路由器,里面已经集成了该功能的配置,直接在web上配置即可,这路由器可以当成开发板学习,有兴趣的同学可以买一个来学习一下openwrt,哈哈哈!gl-inet路由器淘宝购买链接
WDS中继成功后,中继器会从上级获得一个ip
$ifconfig br-lan | grep "inet addr" | awk -F : '{print $2}' | awk '{print $1}'
192.168.7.106
我这获得的是192.168.7.106,需要记住这个ip,后面会用到。
2.安装ebtables
路由器连接上网络
$opkg update
$opkg install kmod-ebtables-ipv4
$opkg install ebtables-utils
3.配置防火墙
使用ebtables将OSI二层数据重定向到OSI三层
$ebtables -t broute -A BROUTING -p ipv4 --ip-proto udp --ip-dport 53 -j redirect
1
使用iptables将所有53端口的数据都DNAT到中继器本地DNS服务器
$iptables -t nat -A PREROUTING -p udp -m udp --dport 53 -j DNAT --to-destination 192.168.7.106
1
此时,DNS劫持已经完成。
最后添加本地域名解析到/etc/hosts,重启dns。这样就可以像市面上的中继器一样,通过域名访问中继器web了。
$echo "192.168.7.106 dengxinfa.com" >> /etc/hosts
$/etc/init.d/dnsmasq restart