我有一个场景,我们的Linux运行盒必须接收发往非本地地址的数据包。例如我没有在我的任何一个盒子的接口上配置1 :: 1,但我希望收到发往它的数据包。我的数据包达到ip6_input_route()
。
此处ip6_input_route()
返回指向discard函数的dst_entry。如果我将1 :: 1添加到其中一个接口,我看到ip6_input()
返回dst_entry和__
,并且应用程序通过套接字接收数据包。有没有办法实现这一点,而无需明确添加地址?
我正在使用IP_BINDTODEVICE和IP_TRANSPARENT选项。这些选项允许我将套接字绑定到1 :: 1,即使未在任何接口上配置地址。
答案 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握手。