c - Linux 仅对原始套接字使用接口(interface)

标签 c linux sockets network-programming

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

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

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

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

最佳答案

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

首先,忽略该接口(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 地址或路由。这当然不是完美的,某些数据包仍然会被内核处理,但我认为没有更好的解决方案。

关于c - Linux 仅对原始套接字使用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44933610/

相关文章:

c - Google Protocol Buffers 是否有良好的 C 实现

检查矩阵中的行数是否等于 c 中的给定行数

linux - CoreOS - 通过 PID 获取 docker 容器名称?

c++ - C++ 在磁盘上的特定位置创建队列

sockets - 为 native 客户端运行套接字 API

c - 使用 epoll 处理多个 TCP 连接上的数据

Java Sockets 无法使用子网 IP 地址访问服务器

c - 插入排序有问题的区域

C - Linux 稀疏文件 : How to check if file is sparse and print 0-filled disk blocks

linux - 自动添加带空格的 SVN 命令行