我正在使用 手动制作以太网数据包socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP))
,并已成功通过这种方式将 UDP 数据包从我的 PC 发送到我的路由器。tcpdump
在两端使用 ,我可以看到 PC 发送了一个包含预期内容的数据包,而路由器接收到了它。具体来说,我使用以下命令来监视我使用 和 构建的数据source port = 0
包dest port = 34567
:sudo tcpdump -i any -e -x udp port 34567 -vvv
但是,我看到了一些意外行为,这取决于我在 v4 标头中输入的源 IP 和目标 IP。具体来说,如果我将源 IP 和目标 IP 都设置为 PC 地址,我会在 PC 上看到出站数据包,但在路由器上看不到网卡已收到该数据包的任何消息。如果我设置source = <pc>
和 ,dest = <router>
我会看到一条消息(显然),如果我设置source = 0.0.0.0
和dest = <pc>
,我也会看到该消息。但在任何情况下,路由器都不会将数据包发送回 PC。
我的问题是:
- 为什么
source = dest = <pc>
IPv4 标头会阻止tcpdump
显示数据包? - 为什么我的路由器不转发数据包?请注意,我尝试在LAN 连接的网卡
dest = <pc>
上添加 iptables 规则,但没有帮助。-A FORWARD -i enp2s0 -o enp2s0 -j ACCEPT
enp2s0
欲了解更多背景信息,请参阅我之前的问题:将以本地接口为目的地的数据包路由至网关
答案1
我终于让它工作了。事情没有成功有几个原因:
- 在 IPv4 标头中将源 IP 和目标 IP 设置为相同的值显然被归类为陆战攻击。虽然我制作的特定数据包不会触发 DOS(因为它不需要回复),但我怀疑 Linux 内核深处的某些东西在数据包到达之前就将其丢弃了
tcpdump
。我能够通过欺骗公共 IP 来解决这个问题。 - 我的路由器
FORWARD
链只有 LAN>WAN 和 WAN>LAN 规则。添加ACCEPT
LAN>LAN 的新规则允许将数据包发送回 PC。 - 我的 PC
INPUT
允许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!]