iptables ipv4 packet redirect:iptables 对 ipv4 数据包的重定向

iptables 对 ipv4 数据包的重定向

可以使用这个功能将android ipv4的流量转发给中间人代理。

简介

更多关于iptables的内容请看:iptables详解

Netfilter-packet-flow

iptables是一个命令行工具,可以用来增删改查netfilter内核组件维护的表、链和规则。

iptables/netfilter(以下统称为iptables)组成了Linux平台下的IPv4包过滤器,可以使用它提供的功能来实现软件防火墙,这也是iptables的最初用意。

它可以代替昂贵的商业防火墙解决方案,它可以做到修改数据包、包过滤、包重定向和网络地址转换(NAT)等功能。

iptables使用表、链和规则的概念来管理网络流量。表包含若干链;链包含若干规则;用户可以在表中新增自定义的链和规则来管理网络流量。

每个表,每个链的功能都是不同的。

iptables提供的内置表如下:

  • filter

filter表中包含的内置链:INPUT 、FORWARD 和 OUTPUT

  • nat

nat表中包含的内置链:PREROUTING 、OUTPUT 和 POSTROUTING

  • mangle

mangle表中包含的内置链:PREROUTING 、OUTPUT 、INPUT 、FORWARD 和 POSTROUTING

  • raw

raw表中包含的内置链:PREROUTING 和 OUTPUT

  • security

security表中包含的内置链:INPUT 、OUTPUT 和 FORWARD

流量转发

nat.OUTPUT链用来管理本机进程向外发送的数据包,为了做到控制本机所有流量,我们在这个表中配置规则即可。

启用iptables流量转发
  1. 创建nat.REDSOCKS链:

在nat表中创建REDSOCKS规则链

1
2
$ iptables -t nat -N REDSOCKS
$ iptables --line -t nat -nvxL REDSOCKS

结果如下图所示:

create REDSOCKS chain in nat table.

  1. nat.REDSOCKS链中忽略本地地址和保留地址:

不要处理发往本地地址或保留地址的数据包。我们RETURN即可,表示nat.REDSOCKS链不处理它们,它们将按原本的链继续执行;

关于本地地址或保留地址的更多信息请参阅以下网址:Reserved_IP_addressesrfc5735

1
2
3
4
5
6
7
8
9
10
$ iptables -t nat -A REDSOCKS -d 10.0.0.0/8     -j RETURN
$ iptables -t nat -A REDSOCKS -d 100.64.0.0/10 -j RETURN
$ iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
$ iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
$ iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
$ iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
$ iptables -t nat -A REDSOCKS -d 198.18.0.0/15 -j RETURN
$ iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
$ iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN
$ iptables --line -t nat -nvxL REDSOCKS

结果如下图所示:

add rules to nat.REDSOCKS chain.

  1. 将其它数据包转发到android设备的 8989 端口上
1
2
$ iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 8989
$ iptables --line -t nat -nvxL REDSOCKS

结果如下图所示,从图中可以看出我们过滤了发往本地或保留地址的数据包,对于发给其它网络设备的数据包我们全部转发至android设备的8989端口

add redirect rule to nat.REDSOCKS chain.

  1. nat.OUTPUT链中应用nat.REDSOCKS

iptables支持在一个链中挂上其它链

1
2
$ iptables -t nat -A OUTPUT   -p tcp -j REDSOCKS
$ iptables --line -t nat -nvxL OUTPUT

结果如下图所示:

apply nat.REDSOCKS on nat.OUTPUT chain.

  1. 使用第三方转发工具或adb将8989端口接收到的数据包转发给中间人代理。
  • 第三方工具redsocks转发流量:

    redsocks可以在android设备的任意端口(这里我们选择的是8989)创建监听,并将该端口接收到的数据包转发给其它网络设备。使用方式不做过多介绍,详见redsocks官网

  • adb方式转发流量:

    需要注意的是当使用adb方式转发流量时,必须开启系统代理,否则中间人代理将收不到数据包,该问题目前无法解决。

    adb reverse [--no-rebind] REMOTE LOCAL命令提供了反向代理的功能

    可以使adbd(运行在android设备上的adb守护进程)在android设备的REMOTE端口上创建监听,并将REMOTE端口接收到的数据包转发给adb server(无特殊情况下一般是执行adb reverse的计算机)设备上的LOCAL端口

    adb reverse提供了反向代理的功能,它可以在android设备的任意端口(这里我们选择的是8989)创建监听,并将该端口接收到的数据包转发给adb server(一般是执行adb reverse的计算机)

    adb reverse功能如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    reverse --list           list all reverse socket connections from device
    reverse [--no-rebind] REMOTE LOCAL
    reverse socket connection using:
    tcp:<port> (<remote> may be "tcp:0" to pick any open port)
    localabstract:<unix domain socket name>
    localreserved:<unix domain socket name>
    localfilesystem:<unix domain socket name>
    reverse --remove REMOTE remove specific reverse socket connection
    reverse --remove-all remove all reverse socket connections from device

使用adb reverse反向代理将8989端口转发到计算机的8888端口,在计算机上启动fiddler或charles中间人代理并咋计算机上监听8888端口。

1
2
$ adb reverse tcp:8989 tcp:8888
$ adb reverse --list

adb reverse

移除iptables的流量转发
  1. 关闭adb的反向代理,使用adb reverse --remove-alladb reverse --remove REMOTE命令
1
2
$ adb reverse --remove-all
$ adb reverse --remove tcp:8989
  1. 重新刷写nat表中的REDSOCKS链,这一操作将清空nat.REDSOCKS链下的所有规则
1
$ iptables -t nat -F REDSOCKS
  1. 删除nat.OUTPUT链下的REDSOCKS规则链
1
$ iptables -t nat -D OUTPUT -p tcp -j REDSOCKS
  1. 查看 nat.OUTPUTnat.REDSOCKS 链的规则是否生效
1
2
$ iptables --line -t nat -nvxL OUTPUT
$ iptables --line -t nat -nvxL REDSOCKS