路由具有相同源 IP 和目标 IP 的 IP 数据包

路由具有相同源 IP 和目标 IP 的 IP 数据包

我正在使用 手动制作以太网数据包socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP)),并已成功通过这种方式将 UDP 数据包从我的 PC 发送到我的路由器。tcpdump在两端使用 ,我可以看到 PC 发送了一个包含预期内容的数据包,而路由器接收到了它。具体来说,我使用以下命令来监视我使用 和 构建的数据source port = 0dest port = 34567sudo tcpdump -i any -e -x udp port 34567 -vvv

但是,我看到了一些意外行为,这取决于我在 v4 标头中输入的源 IP 和目标 IP。具体来说,如果我将源 IP 和目标 IP 都设置为 PC 地址,我会在 PC 上看到出站数据包,但在路由器上看不到网卡已收到该数据包的任何消息。如果我设置source = <pc>和 ,dest = <router>我会看到一条消息(显然),如果我设置source = 0.0.0.0dest = <pc>,我也会看到该消息。但在任何情况下,路由器都不会将数据包发送回 PC。

我的问题是:

  1. 为什么source = dest = <pc>IPv4 标头会阻止tcpdump显示数据包?
  2. 为什么我的路由器不转发数据包?请注意,我尝试在LAN 连接的网卡dest = <pc>上添加 iptables 规则,但没有帮助。-A FORWARD -i enp2s0 -o enp2s0 -j ACCEPTenp2s0

欲了解更多背景信息,请参阅我之前的问题:将以本地接口为目的地的数据包路由至网关

答案1

我终于让它工作了。事情没有成功有几个原因:

  1. 在 IPv4 标头中将源 IP 和目标 IP 设置为相同的值显然被归类为陆战攻击。虽然我制作的特定数据包不会触发 DOS(因为它不需要回复),但我怀疑 Linux 内核深处的某些东西在数据包到达之前就将其丢弃了tcpdump。我能够通过欺骗公共 IP 来解决这个问题。
  2. 我的路由器FORWARD链只有 LAN>WAN 和 WAN>LAN 规则。添加ACCEPTLAN>LAN 的新规则允许将数据包发送回 PC。
  3. 我的 PCINPUT允许ESTABLISHED/RELATED数据包,但由于地址欺骗,防火墙没有将转发的数据包归类为NEW,即使它只是作为传出数据包发送。添加一条新规则明确地将ACCEPT数据包固定下来。

后人的证明:

Hello, Raw!
Listening on port 34567 (0x8707)
Building ethernet packet with 64 bytes comprised of headers of size 14 (ETH) + 20 (IP) + 8 (UDP)
Interface eno1 at index 2
Interface eno1 has mac <redacted>
Sent 64 bytes:
 <redacted> 08 00
 45 00 00 32 00 00 00 00 40 11 B4 BE <redacted> C0 A8 03 53
 00 00 87 07 00 0C 08 61
 3F 4F 6B 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Server successfully read message from client: [?Ok!]

相关内容