【发布时间】:2010-11-03 16:46:17
【问题描述】:
我编写了一个在具有两个网络接口的系统 (Win7) 上运行的工具,每个网络接口都链接到不同的子网,每个都有自己的网关,然后链接到两个独立的远程网络(每个网关后面都有传出防火墙)。我使用Socket.Bind(在使用Connect之前)通过两个NIC 发起传出TCP 连接到每个相关NIC 的IP 地址。第一个 NIC 工作正常,但对于第二个 NIC,我收到 SocketException:“尝试对无法访问的网络进行套接字操作”。
我最初的理解是,由于套接字绑定到具体 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 路由的实际风险是什么(最好有可能的利用示例)?
- 任何在不手动修改本地路由表的情况下解决需求的想法将不胜感激。
非常感谢。
【问题讨论】:
标签: windows sockets routing tcp