【问题标题】:How to get Linux accept packets destined to non-local addresses?如何让 Linux 接受发往非本地地址的数据包?
【发布时间】:2017-05-30 05:58:51
【问题描述】:

我有一个场景,我们的 Linux 运行盒必须接收发往非本地地址的数据包。例如我没有在我的盒子的任何接口上配置 1::1,但我希望收到发往它的数据包。我的数据包到达ip6_rcv_finish()。

这里ip6_input_route() 返回一个指向丢弃函数的dst_entry。如果我将 1::1 添加到其中一个接口,我会看到 ip6_input_route() 返回带有 ip6_input() 的 dst_entry 并且应用程序通过套接字接收数据包。有没有办法在不显式添加地址的情况下实现这一点?

我正在使用 IP_BINDTODEVICE 和 IP_TRANSPARENT 选项。这些选项让我可以将套接字绑定到 1::1,即使该地址未在任何接口上配置。

【问题讨论】:

  • 更新另一个相关问题。 IP_TRANSPARENT 不应该在这里提供帮助吗?如果您可以选择绑定到非本地地址,它是否也应该不提供接收该地址的数据包?否则只绑定到非本地地址而不接收相同的数据包有什么用?
  • 对于不熟悉此处使用的“压缩 IP 格式”的人,请参阅gestioip.net/docu/ipv6_address_examples.html

标签: c linux sockets ipv6


【解决方案1】:

如果您将邻居路由器/主机配置为 1::1 目的地的路由,以从您连接的接口出去...它将到达您。

【讨论】:

    【解决方案2】:

    IP_TRANSPARENT 设置使用 TProxy,记录在 here。棘手的部分似乎是将数据包发送到套接字绑定的接口。根据 IPv6 文档中的说明,您应该执行以下操作:

    # Mark packets whose destination IPs match a local socket
    ip6tables -t mangle -N DIVERT
    ip6tables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
    ip6tables -t mangle -A DIVERT -j MARK --set-mark 1
    ip6tables -t mangle -A DIVERT -j ACCEPT
    
    # Configure policy routing to allow marked packets
    ip -6 rule add fwmark 1 lookup 100
    ip -6 route add local default dev eth1 table 100
    

    请注意,路由中的eth1 是我的套接字绑定到的接口。您可能必须尝试使用​​这些设置才能使其正常工作。请参阅here 了解更多信息。

    我在两盒 Vagrant 环境中对此进行了测试,并且能够成功地执行 TCP 握手,并将套接字绑定到伪造的 IPv6 地址。

    【讨论】:

    • 添加到 lo 会有所帮助。但要求是多个 IP 地址。
    • @user7420724 我完全重写了我的答案。让我知道这是否有帮助!
    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 2016-04-19
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 2017-05-11
    • 2017-06-18
    相关资源
    最近更新 更多