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

时间:2010-11-03 16:46:18

标签: windows sockets routing tcp

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

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

调整本地路由表有所帮助,但它让我想知道套接字绑定到特定本地IP的能力背后的整个推理。

做一些额外的阅读,我发现确实存在“源IP路由”这样的事情,但是由于安全原因,默认情况下在Windows中禁用它(通过DisableIPSourceRouting注册表设置)例如,描述这里:

问题:

  1. 如果我原来的理解是正确的(即Socket.Bind应该足够了) - 为什么没有修改路由表就无法工作?
  2. 如果我的理解不正确(即Socket.Bind被忽略并且使用了路由) - 那么拥有Socket.Bind是什么意思?为什么要这样做呢?
  3. 另外,我想更好地理解,启用源IP路由的实际风险是什么(最好是可能的漏洞利用示例)?
  4. 非常感谢任何解决需求而无需手动修改本地路由表的想法。
  5. 非常感谢。

1 个答案:

答案 0 :(得分:4)

好的,经过一些阅读,这里有一些关于正在发生的事情的高级解释。我仍然需要在我的系统中验证以下结论。显然,选择网络接口时通常会忽略本地绑定。相反,路由表用于此目的。但是,在强主机模型(默认情况下为Vista及更新版本,XP中不存在)中,源IP 在路由表查找中用作“约束”。< / p>