我编写了一个在具有两个网络接口(interface)的系统 (Win7) 上运行的工具,每个接口(interface)都链接到不同的子网,每个子网都有自己的网关,然后链接到两个独立的远程网络(每个网关后都有传出防火墙)。我通过使用 Socket.Bind
(在执行 Connect
之前)到每个相关 NIC 的 IP 地址,通过两个 NIC 启动传出 TCP 连接。第一个 NIC 工作正常,但对于第二个 NIC,我收到 SocketException
:“A socket operation was attempted to an unreachable network”。
我最初的理解是,由于套接字绑定(bind)到具体 NIC 的本地端点,该端点定义了网关,因此连接应该路由到该网关,因此应该可以正常工作。然而,源 IP 地址似乎被忽略,路由根据本地路由表工作(即第二个 NIC 的连接请求转到第一个,默认,网络并被拒绝,因为它有错误的子网)。
调整本地路由表有帮助,但这让我想知道套接字绑定(bind)到特定本地 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 路由的实际风险是什么(最好提供可能的利用示例)?
- 任何无需手动修改本地路由表即可解决需求的想法将不胜感激。
非常感谢。
最佳答案
好的,经过一些阅读后,这里有一些关于正在发生的事情的高级解释。我仍然需要在我的系统中验证以下结论。显然,在选择网络接口(interface)时通常会忽略本地绑定(bind)。相反,路由表用于此。但是,在强主机模型(Vista 和更新版本的默认设置,XP 中不存在)中,源 IP 被用作路由表查找中的“约束”。
关于强宿主模型与弱宿主模型的简要说明: http://technet.microsoft.com/en-us/magazine/2007.09.cableguy.aspx
关于 XP 与较新 Windows 版本在上述方面的不同之处的说明: http://blogs.technet.com/b/networking/archive/2009/04/24/source-ip-address-selection-on-a-multi-homed-windows-computer.aspx
关于windows - Socket.Bind 和 IP 源路由,具有多个本地网络接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4089416/