重新绑定套接字到不同的接口

3
是否有现有的Linux / POSIX C / C ++库或示例代码可用于如何将套接字从一个物理接口重新绑定到另一个物理接口?
例如,我正在使用与物理连接A关联的套接字传输ping,并且我想将该套接字重新绑定到物理连接B,并在切换期间短暂延迟后继续在连接B上发送和接收ping数据包。
我只需要这个功能用于无会话协议。
谢谢!
更新:
我正在尝试为PPP和以太网设备提供故障转移解决方案。
我有一个基本脚本,可以通过使用iptables,NAT和路由表完成90%的功能。
问题是当发生故障转移时,ping继续在次要连接上发送,但它们的源IP来自旧连接。
我与几位从事商业路由器工作的人交谈过,他们建议将套接字重新绑定到次要接口。
更新2:
我很抱歉没有更早地指明这一点。此解决方案将在路由器上运行。我无法更改ping程序,因为它将在客户机上运行。我使用ping只是一个例子,任何非会话型连接都应能够切换。我在几个商业路由器上测试了此功能,它确实有效。不幸的是,他们的软件是专有的,但是从各种对话和测试中,我发现他们在故障转移时重新绑定了套接字。

1
我可能在这里漏掉了什么,但你尝试过先关闭套接字,然后绑定到另一个接口吗? - Duck
谢谢Duck,我会尝试一下,看看会发生什么。 - Misha M
3个回答

3
根据您更新的帖子,问题在于更改路由信息并不会更改ping的源地址,它只会强制其通过第二个接口发送。此答案包含一些相关信息。
您需要更改ping程序。您可以使用每个接口一个socket的方法,并在某种情况下通知程序失败。或者您将不得不关闭socket,然后绑定到第二个接口。
您可以通过调用带有SIOCGIFCONF选项的ioctl()和循环遍历返回的结构以获取接口地址信息来获取所需的接口信息。

最后我设置了proc参数,/proc/sys/net/ipv4/netfilter/ip_conntrack_icmp_timeout,将其设置为1以强制icmp数据包超时,然后将其重置为原始值。这迫使ping重新绑定到不同的接口。这是一个权宜之计,但是该NIC的Ralink驱动程序不支持很多ioctl调用。 - Misha M

0

我认为这不是一个很好定义的操作。物理接口具有不同的MAC地址,因此除非您有一个路由层将它们映射(NAT或类似方式),否则它们将具有不同的IP地址。

端口由<IP地址、端口号、协议>三元组标识,因此如果您的IP地址更改,则端口也会更改。

你真正想在这里做什么?


0

我不确定你想要达到什么目的,但是我猜测... 你是否试图做一些故障转移?如果是这样,有确实有方法可以实现,但为什么不在操作系统中而不是应用程序中进行呢?

在一端,您可以使用 CARP,而在另一端,您可以使用接口汇聚/绑定(术语因人而异)处于故障转移模式下。


我看到了CARP和绑定技术,但由于空间限制我无法使用它们之一。而且很不幸的是,Linux 2.6内核并没有为以太网和PPP设备提供绑定技术。 - Misha M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接