我有一个用于嵌入式系统的OpenWrt Linux发行版。该设备有 3 个网络接口:eth0、eth1 和 wlan0。
其中一个网络接口 (eth0) 应仅用于原始套接字编程。我能够创建一个带有参数的套接字AF_PACKET
、SOCK_RAW
ETH_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 地址或路由。这当然不完美,某些数据包仍然会由内核处理,但我认为没有更好的解决方案。