【问题标题】:Linux use interface for raw socket onlyLinux 仅使用原始套接字的接口
【发布时间】:2017-07-05 18:34:30
【问题描述】:

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

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

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

是否有任何选项只能由我的程序使用而不是由操作系统本身使用?

【问题讨论】:

    标签: c linux sockets network-programming


    【解决方案1】:

    这是用香草内核无法实现的。但这可以接近:

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

    【讨论】:

    • 好的。我已经配置了防火墙(iptables),以便每个 IPv4 数据包都被丢弃。但是如何在启动时禁用 ARP 和 IPv6。如果我将您在上面提供的两行放在rc.local 中,我总是在设备启动时收到一个 ICMPv6 数据包(路由器请求)。我认为文件rc.local 中的命令执行得太晚了。有什么建议吗?
    • @BenjaminJ。为什么这是个问题?您将始终收到该数据包,重要的是,内核对该数据包的处理不会损害您的应用程序。
    • 对不起。我表达了自己的错误。数据包由 OpenWrt 设备发送。我已经通过连接到 eth0 的 Windows PC 上的 Wireshark 进行了检查。
    • @BenjaminJ。您可以尝试通过附加ipv6.disable=1 在内核命令行上禁用 ipv6,但这将适用于整个系统
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多