Socket.Bind和IP源路由,具有多个本地网络接口
我编写了一个运行在具有两个网络接口的系统(Win7)上的工具,每个接口连接到一个不同的子网,每个子网都有自己的网关,然后链接到两个分开遥远的网络(每个网关之后都有传出的防火墙)。我使用Socket.Bind
(在做Connect
之前)为每个相关NIC的IP地址启动通过两个NIC的传出TCP连接。第一个网卡工作正常,但对于第二个网卡,我得到SocketException
:“套接字操作尝试连接到无法访问的网络”。Socket.Bind和IP源路由,具有多个本地网络接口
我最初的理解是,由于套接字绑定到具有其网关定义的具体NIC的本地端点,连接应该路由到此网关,因此应该工作。但是,似乎源IP地址被忽略,并且路由根据本地路由表工作(即,第二个NIC的连接请求转到第一个,默认网络,并且因为它具有错误的子网而被拒绝)。
调整本地路由表有所帮助,但它让我想知道套接字能够绑定到特定本地IP的全部理由。由于安全原因,如上所述,我发现确实存在诸如“源IP路由”之类的东西,但它在Windows中默认是禁用的(通过DisableIPSourceRouting
注册表设置)。在这里:
- http://msdn.microsoft.com/en-us/library/ff648853.aspx
- http://www.bloggersbase.com/disableipsourcerouting/
问题:
- 如果我原来的理解是正确的(即
Socket.Bind
应该足够) - 为什么它没有修改工作路由表? - 如果我的理解不正确(即
Socket.Bind
被忽略并且使用了路由) - 使用Socket.Bind有什么意义?为什么要这样做? - 此外,我想更好地了解,启用源IP路由的实际风险是什么(最好以可能的漏洞为例)?
- 任何解决这个需求的想法都不需要手动修改本地路由表,我们将不胜感激。
非常感谢。
好的,在读完一些资料后,这里有一些关于发生了什么的高层次解释。我仍然需要在我的系统中验证下面的结论。显然,选择网络接口时通常会忽略本地绑定。相反,路由表用于此目的。但是,在强主机型号(Vista和更新版本的默认值,XP中不存在)中,源IP 是用作路由表查找中的“约束”。
关于强主机模型的简要说明与弱主机型号: http://technet.microsoft.com/en-us/magazine/2007.09.cableguy.aspx
说明什么在XP VS较新的Windows版本中对于上述不同了: http://blogs.technet.com/b/networking/archive/2009/04/24/source-ip-address-selection-on-a-multi-homed-windows-computer.aspx