在MacOS上使用PF将stream量redirect到特定的地址和端口

我想要testing一个移动应用程序。 为此,我想拦截所有WiFistream量并将其转发到在虚拟机中运行的Burp。

我启用了我的Macbook上的“互联网共享”,所以我的手机现在使用WiFi连接到笔记本电脑。 然后我想转发所有stream量到172.16.122.128:8080的Burp代理。

redirect到本地主机作品:

rdr pass on bridge100 inet proto tcp from any to any port {80,443} -> 127.0.0.1 port 8080 

我把这个规则放在一个文件中,并用pfctl -f pf.rules 。 之后,我使用nc -l -p 8080在端口8080上列出,当我在手机上浏览某处时,它实际上连接到本地主机。

但是,当我尝试转发到172.16.122.128,它不起作用:

 rdr pass on bridge100 inet proto tcp from any to any port {80,443} -> 172.16.122.128 port 8080 

数据包最终在虚拟机(使用Wiresharktesting),但没有连接。 这可能是因为它们起源于192.168.2.3。 我需要NAT吗? 我如何正确configuration?

我画了一张我的networking布局图。 (虚拟机实际上在我的笔记本电脑上运行,但我在这里单独绘制)。 我的网络布局

我想,问题是你没有configuration转发2networking,(1)VMnetworking(172.16.122.0/24)和(2)您的LAN(192.168.2.0/24)。 要在Mac上configuration转发,您可能需要执行以下操作(对不起,我没有Mac,所以我不能尝试):

1)如在https://apple.stackexchange.com/a/192183上所写:

 sudo sysctl -w net.inet.ip.forwarding=1 sudo sysctl -w net.inet.ip.fw.enable=1 

2)添加静态路由到两个networking,如果需要(我想,你已经有了,因为你可以连接到你的Mac到虚拟机的NC)

最后,另一种select(不将Macconfiguration为路由器)是使用虚拟化软件设置NAT,并将端口转发给虚拟机。 如果您使用VMware Fusion,请在这里或这里查看 。

然后,不要将stream量转发到VM上的端口,而是将其转发到vmnet8接口上的转发端口:

 rdr pass on bridge100 inet proto tcp from any to any port {80,443} -> 172.16.122.1 port 8080 

(vmnet8上的端口8080应通过VMware Fusion转发到VM上的端口8080)

以下PF规则的工作:

 nat on vmnet8 from bridge100:network to any -> (vmnet8) rdr pass on bridge100 inet proto tcp from any to any -> 172.16.122.128 port 8080 

这会将所有请求转发到172.16.122.128,同时在两者之间进行NAT。

NAT需要在两个networking的地址之间转换,即192.168.2.0/24和172.16.122.0/24。 前面的部分已经工作(如我的问题所述),但数据包被转发与错误的源地址。 NAT将源地址更改为172.16.122.1,以便VM知道将数据包发送回我的MacBook,然后再将它们转发给手机。

如果虚拟机是一个Linux的,你需要纳入传入的stream量和破坏它。 那是:

  1. 来自192.168.2.3的入局数据包被接受
  2. 将数据包的目标地址更改为172.16.122.128(mangle)
  3. 将数据包提交给linux路由层

防火墙命令

 # Enable forward sudo sysctl -w net.ipv4.ip_forward=1 # FLUSH ALL RULES iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X # Forward sudo iptables -A FORWARD -i eth0 -j ACCEPT # Mangling rule. I think you can add the port right after the dest ip sudo iptables -t nat -A POSTROUTING -s 192.168.2.3/32 -j SNAT --to 172.16.122.128