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

问题描述:

我编写了一个运行在具有两个网络接口的系统(Win7)上的工具,每个接口连接到一个不同的子网,每个子网都有自己的网关,然后链接到两个分开遥远的网络(每个网关之后都有传出的防火墙)。我使用Socket.Bind(在做Connect之前)为每个相关NIC的IP地址启动通过两个NIC的传出TCP连接。第一个网卡工作正常,但对于第二个网卡,我得到SocketException“套接字操作尝试连接到无法访问的网络”Socket.Bind和IP源路由,具有多个本地网络接口

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

调整本地路由表有所帮助,但它让我想知道套接字能够绑定到特定本地IP的全部理由。由于安全原因,如上所述,我发现确实存在诸如“源IP路由”之类的东西,但它在Windows中默认是禁用的(通过DisableIPSourceRouting注册表设置)。在这里:

问题:

  1. 如果我原来的理解是正确的(即Socket.Bind应该足够) - 为什么它没有修改工作路由表?
  2. 如果我的理解不正确(即Socket.Bind被忽略并且使用了路由) - 使用Socket.Bind有什么意义?为什么要这样做?
  3. 此外,我想更好地了解,启用源IP路由的实际风险是什么(最好以可能的漏洞为例)?
  4. 任何解决这个需求的想法都不需要手动修改本地路由表,我们将不胜感激。

非常感谢。

好的,在读完一些资料后,这里有一些关于发生了什么的高层次解释。我仍然需要在我的系统中验证下面的结论。显然,选择网络接口时通常会忽略本地绑定。相反,路由表用于此目的。但是,在强主机型号(Vista和更新版本的默认值,XP中不存在)中,源IP 用作路由表查找中的“约束”。