Linux 仅将接口用于原始套接字

Ben*_* J. 5 c sockets linux network-programming

我的嵌入式系统有一个 OpenWrt Linux 发行版。该设备有 3 个网络接口:eth0、eth1 和 wlan0。

网络接口 (eth0) 之一应仅用于原始套接字编程。我可以使用参数AF_PACKET, SOCK_RAW,来创建套接字ETH_P_ALL。套接字接收所有网络流量,我可以发送数据包,一切正常。

但我的问题是,操作系统也使用接口来发送接收(例如 ARP 和 ICMP 请求/响应)。

是否有任何选项表明该接口仅由我的程序使用而不是由操作系统本身使用?

Ctx*_*Ctx 2

这是普通内核无法实现的。但这可以接近:

首先,忽略该接口上的所有 arp 请求:

echo 8 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
Run Code Online (Sandbox Code Playgroud)

然后,禁用 IPv6:

echo 1 > /proc/sys/net/ipv6/conf/eth0/disable_ipv6
Run Code Online (Sandbox Code Playgroud)

最后,过滤来自该接口的所有 IPv4 数据包

iptables -I INPUT -i eth0 -j DROP
Run Code Online (Sandbox Code Playgroud)

并且不要在该接口上设置 IP 地址或路由。这当然并不完美,某些数据包仍然会由内核处理,但我认为没有更好的解决方案。