具有多个本地网络接口的Socket.Bind和IP源路由

Bor*_*rka 4 sockets windows routing tcp

我写了一个在具有两个网络接口的系统(Win7)上运行的工具,每个网络接口链接到一个不同的子网,每个接口都有自己的网关,然后将其链接到两个单独的远程网络(每个网关后都有出站防火墙)。我正在通过使用Socket.Bind(在之前Connect)到每个相关NIC的IP地址来通过两个NIC启动传出TCP连接。第一个NIC工作正常,但是对于第二个NIC,我得到SocketException“尝试对不可达的网络进行套接字操作”

我最初的理解是,由于套接字绑定到具体的NIC本地端点(已定义网关),因此应该将连接路由到此网关,因此应该可以正常工作。但是,似乎源IP地址已被忽略,并且路由正在根据本地路由表运行(即,第二个NIC的连接请求转到第一个,默认,网络,并且由于子网错误而被拒绝)。

调整本地路由表会有所帮助,但这使我想知道套接字绑定到特定本地IP的能力背后的全部原因。

做一些额外的阅读后,我发现确实存在诸如“源IP路由”之类的东西,但是DisableIPSourceRouting由于安全原因,Windows默认情况下(通过注册表设置)将其禁用,例如:

问题:

  1. 如果我的最初理解是正确的(即Socket.Bind应该足够)–为什么不修改路由表就无法正常工作?
  2. 如果我的理解不正确(即被Socket.Bind忽略并使用路由)–拥有Socket.Bind有什么意义?为什么要这么做?
  3. 另外,我想更好地理解,启用源IP路由的实际风险是什么(最好是带有可能的利用示例)?
  4. 在不手动修改本地路由表的情况下解决需求的任何想法将不胜感激。

非常感谢。

Bor*_*rka 5

好了,经过阅读后,这里有一些高级解释。我仍然需要在系统中验证以下结论。显然,选择网络接口时通常会忽略本地绑定。而是,为此使用路由表。然而,在强主机模式(默认为Vista和XP中较新的,不存在的),源IP 用作路由表中查找一个“约束”。