https://book.2cto.com/201405/43238.html
NatCmd仅支持“enable”和“disable”两个命令选项。不过和上一节介绍的不同,Android中的NAT并不是只利用iptables的nat表来做转换,而是借助ip route命令和iptables的filter表在源和目标网络设备及指定IP地址之间进行地址转换。以“enable”选项为例,其使用方式如下。
ndc nat enable lo wlan0 1 202.106.25.35/14
其中:
lo为本地回环设备、代表输入设备。
wlan0为无线NIC,代表输出设备。
1代表后面的地址组合只有一个。
202.106.25.35/14指明IP地址和子网掩码。
以上面的命令为例,NatCmd执行它所涉及的iptables命令的调用序列如下所示。
iptables -A natctrl_FORWARD -i eth0 -o lo -m state --state ESTABLISHED,RELATED -j RETURN
iptables -A natctrl_FORWARD -i lo -o eth0 -m state --state INVALID -j DROP
iptables -A natctrl_FORWARD -i lo -o eth0 -j RETURN
iptables -D natctrl_FORWARD -j DROP
iptables -A natctrl_FORWARD -j DROP
iptables -t nat -A natctrl_nat_POSTROUTING -o eth0 -j MASQUERADE
#MASQUERADE能自动读取eth0现在的IP地址然后做SNAT
#这样就避免了每次eth0地址发生改变时都需更新iptables的烦恼
注意 上边的命令中并没有利用传递的IP地址,这是因为这些地址和ip命令的多路由策略管理有关,只有使用了多路由策略管理,这些IP地址才能被ip命令用上。由于代码中没有任何说明,所以笔者也很难理解这部分内容。如果有知晓的读者,还请和大家一起分享相关知识。
根据上面的iptables调用命令,读者也能猜测出enableNat的目的是修改来自源设备的数据包,使它看起来是目标设备发出的数据包。
图2-23所示为利用ndc在Galaxy Note 2测试nat命令的结果。
图2-23所示为利用ndc nat enable rmnet0 wlan0 0添加nat规则后,再通过iptables-S查看natctrl_FORWARD链的具体规则时得到的结果。
注意 其中TCPMSS这条规则应该是三星公司自己添加的,不过令人匪夷所思的是该命令竟然打出了“FIX ME!”这样的输出。看来,网络管理的确是一个很有技术含量的活。