C语言 Linux 仅将接口用于原始套接字



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

其中一个网络接口 (eth0) 应仅用于原始套接字编程。我能够创建一个带有参数的套接字AF_PACKETSOCK_RAWETH_P_ALL。套接字接收所有网络流量,我可以发送数据包,一切正常。

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

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

这不可能用香草内核实现。但这可能接近:

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

echo 8 > /proc/sys/net/ipv4/conf/eth0/arp_ignore

然后,禁用 IPv6:

echo 1 > /proc/sys/net/ipv6/conf/eth0/disable_ipv6

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

iptables -I INPUT -i eth0 -j DROP

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

最新更新