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

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

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

是否可以选择仅由我的程序而不由操作系统本身使用该接口(interface)?

最佳答案

这是不可能用 Vanilla 核实现的。但这可以接近:

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

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

然后,禁用IPv6:
echo 1 > /proc/sys/net/ipv6/conf/eth0/disable_ipv6

最后,过滤进入该接口(interface)的所有IPv4数据包
iptables -I INPUT -i eth0 -j DROP

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

09-11 17:53
查看更多