如何让Linux接受发往非本地地址的数据包?

时间:2017-01-15 07:10:59

标签: c linux sockets ipv6

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

此处ip6_input_route()返回指向discard函数的dst_entry。如果我将1 :: 1添加到其中一个接口,我看到ip6_input()返回dst_entry和__,并且应用程序通过套接字接收数据包。有没有办法实现这一点,而无需明确添加地址?

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

2 个答案:

答案 0 :(得分:0)

如果您的邻居路由器/主机配置了到达目的地1 :: 1的路由,那么您将连接到您所连接的接口...它将与您联系。

答案 1 :(得分:0)

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环境中对此进行了测试,并且能够使用绑定到虚假IPv6地址的套接字成功执行TCP握手。