iptables似乎没有将SNAT应用于原始套接字上发送的数据包

我正在从用户空间程序发送数据包到我的无线接口wlan0。 我已经用iptables设置了一个SNAT规则,如下所示

iptables -t nat -A POSTROUTING -o wlan0 -j SNAT --to 192.168.1.3 

它适用于从我的机器出来的所有正常stream量。

我正在开发一个程序,需要从第2层开始创build数据包.Iptables不会将SNAT应用于此程序发送的任何第3层数据包。

有没有什么办法可以从第二层的用户空间发送数据包,仍然有NAT应用到他们?

我已经从超级用户转发了这个。 如果我在那里得到任何东西,将会更新。

当数据包直接在以太网接口上发送时,它们将不会穿过内核networking堆栈中的IP层。 这意味着没有iptables。

您需要让程序按照您希望的方式生成数据包,否则您需要将数据包通过networking堆栈中的IP层发送出去。

有几种不同的方法可以通过networking堆栈获取数据包:

  • 将其发送到您自己的机器的MAC地址,以便它被内核路由,然后转发回相同的接口。
  • 通过虚拟networking接口而不是物理接口发送。
  • 在IP层使用套接字而不是以太网层。

原始套接字绕过netfilter堆栈,所以iptables将不会影响这些数据包。