Android5.1双网卡NAT功能的iptables规则
在Android5.1上面,我们参照了系统里的WiFi热点、USB Tether、Bluetooth Tether功能,发现有一组命令可实现双网卡的NAT网络地址转发功能:
echo 0 > /proc/sys/net/ipv4/ip_forward
/system/bin/iptables -t nat -A natctrl_nat_POSTROUTING -o eth0 -j MASQUERADE
/system/bin/iptables -A natctrl_FORWARD -i eth0 -o ap0 -m state --state ESTABLISHED,RELATED -g natctrl_tether_counters
/system/bin/iptables -A natctrl_FORWARD -i ap0 -o eth0 -m state --state INVALID -j DROP
/system/bin/iptables -A natctrl_FORWARD -i ap0 -o eth0 -g natctrl_tether_counters
/system/bin/iptables -A natctrl_tether_counters -i ap0 -o eth0 -j RETURN
/system/bin/iptables -A natctrl_tether_counters -i eth0 -o ap0 -j RETURN
/system/bin/iptables -D natctrl_FORWARD -j DROP
/system/bin/iptables -A natctrl_FORWARD -j DROP
echo 1 > /proc/sys/net/ipv4/ip_forward
其中,ap0是连接内网的网卡,eth0是连接外网的网卡。
192.168.43.0/24 dev wlan0 table local_network proto static scope link
于是,我们使用ip route add 192.168.43.0/24 dev wlan0 table local_network proto static scope link命令将相应路由规则添加上,就能正常使用NAT功能了,而不会出现其他WiFi连接映射出来的AP时握手时间过长、连接上AP的设备无法PING通AP等问题。
对比了/system/netd目录下的代码,5.1上也确认多了对local_network这张table的处理。
而使用过程中碰到如下问题:
在Android5.1系统上的adb shell或调试串口SHELL命令行下运行相应的iptables命令,NAT功能仍不生效,但同样的命令在Android4.4和4.2上验证是成功的,于是通过iptables -t nat -nvL和iptables -nvL命令对比,并未发现区别,后来发现使用ip route list table 0命令时,5.1系统上多了一句:
评论
发表评论