手动选择TCP上的接口以发送数据

时间:2020-03-06 14:35:09  来源:igfitidea点击:

我有一个仅在特定接口上侦听的TCP服务器。我希望在" accept()"调用之后,如果传入连接来自" xxx.xxx.xxx.0"子网,则数据应通过intf1,否则数据应通过intf2发送,这是我的服务器正在侦听的位置。

两个接口的路由设置和优先级相同。从这两个接口均可访问所有网络。

一种解决方法可能是通过具有更高优先级的intf1添加新路由,但是我希望这是基于代码的决策。

该代码是用Linux上的纯C语言编写的。

解决方案

不幸的是,选择受到限制,因为TCP / IP堆栈是在内核中实现的,并且接口是路由表。最好的选择是手动分配路线。

我们也可以使用netlink库即时添加/删除路由,但是TCP数据包的某些部分将通过"错误"接口,直到进行调用为止。当具有原始接口地址的数据包通过另一个接口发出时,我们可能会遇到路由问题。

尽管我们所寻找的不完全是纯C选项,也许我们可​​以在收到accept()时使用iptables规则。

(尽管快速浏览/ lib / iptables显示我们可能很幸运)

我正在想象一个规则,它将所有tcp流量重定向到我们指定的设备。我们甚至可以使规则知道套接字状态,从而无需在accept()之后指定接口。

所有这一切都适用,直到我发现该计划中的明显缺陷,拍了一下头并说" D'oh!

我们可以通过rtnetlink在程序中更改路由。
我们可以修改所需的所有参数。另请参见netdevice。