windows - Socket.Bind 和 IP 源路由,具有多个本地网络接口(interface)

标签 windows sockets routing tcp

我编写了一个在具有两个网络接口(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 注册表设置)原因,如所述,例如这里:

问题:

  1. 如果我最初的理解是正确的(即 Socket.Bind 应该足够了)——为什么不修改路由表就不能工作?
  2. 如果我的理解不正确(即忽略 Socket.Bind 并使用路由)——拥有 Socket.Bind 有什么意义?为什么要这样做?
  3. 此外,我想更好地了解启用源 IP 路由的实际风险是什么(最好提供可能的利用示例)?
  4. 任何无需手动修改本地路由表即可解决需求的想法将不胜感激。

非常感谢。

最佳答案

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

关于windows - Socket.Bind 和 IP 源路由,具有多个本地网络接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4089416/

相关文章:

c++ - 从 USB 设备中的设备路径获取卷名称

java - 在 Windows Media Player 中获取当前正在播放的媒体

c++ - 许多 linux 套接字后服务器卡住

docker - Docker-无法从容器内部ping主机子网上的任何内容

asp.net-mvc - ASP.NET MVC : Form Input to pretty URLs

c - 如何在客户端应用程序中使用 "control endpoint"(默认端点)?

Java 应用程序在 Windows 关闭时挂起

Windows 上的 python select.select()

python - Python 中使用套接字的 SMTP 服务器显然无法通过 Gmail 访问

angular - Ionic 4 Angular Back Button 到上一页而不是 root?