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是连接外网的网卡。
    而使用过程中碰到如下问题:
    在Android5.1系统上的adb shell或调试串口SHELL命令行下运行相应的iptables命令,NAT功能仍不生效,但同样的命令在Android4.4和4.2上验证是成功的,于是通过iptables -t nat -nvL和iptables -nvL命令对比,并未发现区别,后来发现使用ip route list table 0命令时,5.1系统上多了一句:
    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的处理。

评论

此博客中的热门博文

I/O映射之I/O端口

通过Netlink检测网线插拔

使用seq_file