我正在尝试以透明模式使用 MITMproxy。我有两台机器:
- 我运行 MITMProxy 的一台 Linux 机器
- 我想要透明地重定向一个 Android 嵌入式设备的流量
为了简单起见,我现在只关注 IPv4 和 HTTP。而不是 TLS 或 IPv6。
在 Linux 上我运行 MITMProxy
mitmproxy --mode transparent --showhost
在 Android 上我运行过
adb shell sysctl -w net.ipv4.ip_forward=1
adb shell sysctl -w net.ip4.conf.all.send_redirects=0
adb shell iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination $IP_LINUX:8080
目的是将所有流向端口 80 的流量重定向到我的 Linux 机器上的端口 8080,即 mitmproxy 默认监听的端口。
adb shell iptables -t nat -L --line-numbers
Chain PREROUTING (policy ACCEPT)
num target prot opt source destination
1 oem_nat_pre all -- anywhere anywhere
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 DNAT tcp -- anywhere anywhere tcp dpt:http to:192.168.2.123:8080
Chain POSTROUTING (policy ACCEPT)
num target prot opt source destination
1 tetherctrl_nat_POSTROUTING all -- anywhere anywhere
Chain oem_nat_pre (1 references)
num target prot opt source destination
Chain tetherctrl_nat_POSTROUTING (1 references)
num target prot opt source destination
然后我尝试使用android 浏览器连接到http://www.cs.sjsu.edu
端口 80(我在网上通过 http 找到的使用 IPv4 的主机) 。netcat
我可以在 Android 和 Linux 上看到tcpdump
数据包被重定向,但是在 MITProxy 中我看不到任何内容,并且连接网站仍然失败。
ping www.cs.sjsu.edu
PING cos-cwebwebster.sjsu.edu (130.65.255.57) 56(84) bytes of data.
--- cos-cwebwebster.sjsu.edu ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
adb shell nc 130.65.255.57 80
使用 tcpdump 我可以看到重定向的数据包
在 Android 上
adb shell tcpdump -l -nn dst $IP_LINUX and dst port 8080
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:30:17.513892 IP 192.168.2.101.47970 > 192.168.2.123.8080: Flags [S], seq 1827135764, win 65535, options [mss 1460,sackOK,TS val 368320 ecr 0,nop,wscale 9], length 0
10:30:17.514078 IP 192.168.2.101.47968 > 192.168.2.123.8080: Flags [S], seq 2479685048, win 65535, options [mss 1460,sackOK,TS val 368320 ecr 0,nop,wscale 9], length 0
10:30:17.514296 IP 192.168.2.101.47966 > 192.168.2.123.8080: Flags [S], seq 1020904415, win 65535, options [mss 1460,sackOK,TS val 368320 ecr 0,nop,wscale 9], length 0
在 Linux 上
sudo tcpdump -i any -l -nn src $IP_ANDROID and dst port 8080
tcpdump: data link type LINUX_SLL2
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
10:30:17.577226 wlp65s0 In IP 192.168.2.101.47970 > 192.168.2.123.8080: Flags [S], seq 1827135764, win 65535, options [mss 1460,sackOK,TS val 368320 ecr 0,nop,wscale 9], length 0
10:30:17.578696 wlp65s0 In IP 192.168.2.101.47968 > 192.168.2.123.8080: Flags [S], seq 2479685048, win 65535, options [mss 1460,sackOK,TS val 368320 ecr 0,nop,wscale 9], length 0
但 MITMProxy 上仍然没有显示任何内容,并且连接失败。
我遗漏了什么?谢谢!
答案1
您希望在流量到达 Linux 网络进程之前对其进行 nat。您的 nat 语句位于 OUTPUT 链上,位于之后。
https://docs.mitmproxy.org/stable/howto-transparent/
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
您还可以在 android 主机 IP 上执行 tcpdump,而不是 src/and 端口。然后您也可以监控返回流量。(tcpdump -l -nn host 1.2.3.4)
答案2
您需要确认几件事;
- 您的 Linux(MITM 主机)已启用 IP 转发(或通过它进行路由)。
- 你期望 Android 盒子所在的 IP 地址/子网最好位于同一子网中
- 通过 DHCP 或静态 IP 地址配置,将您的 Android 盒默认网关指向 Linux 盒 IP 地址。
像这样:
[Android 10.1.1.2/24,默认网关 = 10.1.1.1] --> WLAN AP | LAN 电缆 -> <--- [linux inside eth0 10.1.1.1/24,默认网关你的互联网路由器/pppoe] --> 互联网
https://docs.mitmproxy.org/stable/howto-transparent/
确保按照那里的步骤启用 IP 转发和预 nat。