Android iptables规则

ip route get <address>
/proc/net/nf_contrack,NAT操作只会修改回复方向(第二个)四元组。
QNX route get <address>

Windows IP = 0.0.0.0

1 iptables
1.1 Linux netfilter hook
Ethernet switch ACL tables can implement hardware netfilter.
Linux内核网络代码被netfilter cut off的函数都分为了两个阶段:XXX以及XXX_finish。
struct nf_hook_ops
nf_register_net_hook()
nf_unregister_net_hook()

kernel IPv4 print: %pI4
user IPv4 print: inet_ntoa
meta|match1|match2|...|target

1.1.1 match
iptables -m xxx: xxx = kernel struct xt_match, libipt_xxx.so
net/netfilter/xt_owner.c
external/iptables/extensions/libxt_owner.c

1.1.2 target
iptables -j xxx: xxx = kernel struct xt_target, libipt_xxx.so

xt_register_target()
xt_unregister_target()

1.2 iptables port mirror
1) Android iptables TEE
CONFIG_NF_DUP_IPV4=m
CONFIG_NF_DUP_IPV6=m
CONFIG_NETFILTER_XT_TARGET_TEE=m

# eth0 -> USB eth1 (192.168.2.5) -> Windows NIC (192.168.2.100)
iptables -A PREROUTING -t mangle -i eth0 -j TEE --gateway 192.168.2.100
iptables -A POSTROUTING -t mangle -o eth0 -j TEE --gateway 192.168.2.100

TEE复制报文时,同时替换复制报文的源和目的MAC地址分别到USB eth1和Windows NIC的MAC地址(组播MAC地址也被替换成了Windows NIC的MAC),IP地址不做替换,所以没有路由功能,报文止步于Windows NIC。其缺点是阻碍了原始数据包的快速通过。

2) Windows Tools
Netmon: uses LWF (Light-Weight Filter) NDIS driver
Wireshark: uses NPcap

Windows 10上,Netmon可以抓取所有TEE后的报文,而Wireshark不可以,必须要用SocketTool或者其它工具监听对应的IP和port,才能够抓到相应的报文。

1.3 查看Android已生效的规则
iptables-save -c:dump已配置的规则,格式是[packets, bytes];可以用“>”重定向到一个文件中
iptables -D xxx:-D与-A对应,表示删除一条规则
Android netd iptables自定义链:iptables -N BLOCK
Android iptables策略是先禁止整个系统上网,再设置iptables规则允许哪些应用(5-tuple)可以上网。

ICMP showcase
iptables -A INPUT -i eth0 -p icmp -j ACCEPT
iptables -A OUTPUT -o eth0 -p icmp --icmp-type echo-request -j ACCEPT

1.4 iptables翻译成nftables
iptables-save > default.rules
iptables-restore-translate -f default.rules

2 NAT
2.1 iptables static NAT
PREROUTING:DNAT专用。
POSTROUTING:SNAT专用。
MASQUERADE:SNAT转换时,如果--to-source的地址经常变化,那么就无法在iptables命令中固定,譬如路由器WAN口上的IP地址,内网设备通过WAN口访问外网时,只要指定使用MASQUERADE参数,iptables就会统一将内网设备的IP地址替换为路由器WAN口的IP地址。
Figure 2-1 NAT chain

eth0: 192.168.0.99
eth1: 192.168.5.99

# client -> eth1 -> eth0 -> server
iptables -t nat -A PREROUTING -d 192.168.5.99 -i eth1 -j DNAT --to-destination 192.168.0.99
# client -> eth0 -> eth1 -> server
iptables -t nat -A POSTROUTING -s 192.168.0.99 -o eth1 -j SNAT --to-source 192.168.5.99
echo 1 > /proc/sys/net/ipv4/ip_forward

Android TCP Server: busybox nc -lvz -s 192.168.0.99 -p 8001
Windows SocketTool

2.2 硬件NAT
参考AR8327N(N表示支持硬件NAT)page 50的NAT Entry Table,NAT有32个entries,每个entry的长度是80 bits。表编辑控制寄存器是Entry Edit Control Register。AR8327N HWNAT时私有IP地址的默认高20位是192.168.0.0/20,低12位在HWNAT表中指定,参考手册的page343。

flow offload is developed by Mellanox.
iptables -I FORWARD 1 \
-m conntrack --ctstate \
RELATED,ESTABLISHED  \
-j FLOWOFFLOAD

2.3 NAT affects TCP
tcp_tw_recycle - server
tcp_tw_reuse - client
tcp_timestamps - both server and client

2.4 ARP
ARP is in L2, need Proxy ARP to cross LAN, must consider ARP when configure QNX hypervisor NAT.
/proc/sys/net/ipv4/conf/eth0/proxy_arp

3 Android UID
3.1 UID查找方法
Android中,使用iptables绑定一个APP到特定的路由时,需要用到UID。
ps -A后每一行的第一个字符串表示UID,查看该UID对应的数值,使用id <parameter>
例如:
id u0_a50

其中u0_a50的含义:
u0:默认的手机第一个用户
a:代表app
50:代表着第50个应用

转换公式:
u0_a50 = “u0_” + “a” + (uid(这里是10050) – FIRST_APPLICATION_UID(固定值10000))

3.2 UID查找脚本示例
#!/vendor/bin/sh

APP_LIST=("com.android.email"
 "com.android.systemui"
 "android.hardware.audio@2.0-service")

SH_PS="/vendor/bin/ps"
SH_GREP="/vendor/bin/grep"
SH_ID="/vendor/bin/id"
SH_TR="/vendor/bin/tr"
SH_ECHO="/vendor/bin/echo"
SH_TEE="/vendor/bin/tee"
SH_USLP="/vendor/bin/usleep"

for app in ${APP_LIST[@]}
do
    count=1
    while [ $count -le 10 ]; do
        line=$($SH_PS -A | $SH_GREP ${app})
        if [ $? -eq 0 ]; then
            $SH_ECHO "got ${app}, count $count" \
                | $SH_TEE /dev/kmsg
            break
        fi

        $SH_ECHO "waiting ${app}, count $count" \
            | $SH_TEE /dev/kmsg
        $SH_USLP 500000
        count=$((count + 1))
    done

    line=$($SH_PS -A | $SH_GREP ${app})
    if [ $? -eq 0 ]; then
        list=(${line}) # switch str to list
        # len=${#list[@]} # length of list
        # len=$((len - 1))
        uid_str=${list[0]}

        line=$($SH_ID $uid_str)
        list=(${line}) # switch str to list
        uid_str=${list[0]}
         # uid=10017(u0_a17) -> uid=10017
        uid_str=${uid_str%\(*}

        uid=$($SH_ECHO $uid_str | \
            $SH_TR -cd "[0-9]")
        # Now got the process UID
        $SH_ECHO $uid | $SH_TEE /dev/kmsg
    fi
done

4 绑定某个应用到指定的网络
1)添加main rule
ip rule add from all lookup main pref 9999
# 上一条命令等价于在netd中添加modifyIpRule(RTM_NEWRULE, 9999, 254, 0, 0);

2)为eth0接口添加VLAN ID 5
ip link add link eth0 name eth0.5 type vlan id 5
ip -d link show eth0.5

3)设置VLAN QOS
i=0
while [ $i -le 7 ]; do
    ip link set dev eth0.5 type vlan \
        egress-qos-map $i:0
    # ip link set eth0.5 type vlan egress $i:0
    i=$((i + 1))
done
其中$i表示skb_priority,0表示vlan_qos,vlan_qos对应到VLAN以太网帧中的3bit PCP。因为PCP的值越大优先级越高,由于AVB PCP的值为2和3,所以将普通应用程序的PCP值都设置为0后,就低于AVB流的优先级了。

4)分配IP并启动
ip addr add 192.168.5.200/24 brd 192.168.5.255 \
dev eth0.5
ip link set dev eth0.5 up
或者
ifconfig eth0.5 192.168.5.200/24 up

5)设置iptables fwmark
ip rule add fwmark 0x66 priority 9998 table 200
ip route add 192.168.5.0/24 via 192.168.5.1 \
dev eth0.5 table 200
ip route flush cache

# -j means jump, u0_a50 = 10050
# net/netfilter/xt_owner.c
# external/iptables/extensions/libxt_owner.c
iptables -t mangle -A OUTPUT -m owner \
--uid-owner u0_a50 -j MARK --set-mark 0x66
echo 0x66 > \
/proc/sys/net/ipv4/conf/eth0.5/rp_filter

# delete this fwmark
# iptables -t mangle -D OUTPUT -m owner \
--uid-owner u0_a50 -j MARK --set-mark 0x66
# echo 0 > \
/proc/sys/net/ipv4/conf/eth0.5/rp_filter

# merge ip rule and iptables to one
# ip rule add uidrange 10050-10050 priority 9998 table 200
# ip rule del uidrange 10050-10050 priority 9998 table 200

6)查看是否生效
CONFIG_NETFILTER_NETLINK_LOG=m
CONFIG_NETFILTER_XT_TARGET_LOG=m

iptables -A PREROUTING -t raw -i eth0 \
-j TRACE
iptables -A OUTPUT -t raw -o eth0 \
-j TRACE
echo "nf_log_ipv4" > \
/proc/sys/net/netfilter/nf_log/2

dmesg | grep TRACE

5 Abbreviations
DSA:Linux Distributed Switch Architecture
ipt: iptables
masquerade:伪装,源ip地址欺骗,是SNAT的一种
NAPT:Network Address and Port Translation
ndc:vold native daemon connector
nftables: netfilter tables
Nginx: engine x
SNAT:Source Network Address Translation

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值