是否可以将ForceBindIP限制为仅入站/出站流量?

问题描述 投票:3回答:2

我正在使用ForcebindIP 将应用指向特定的网络适配器,如下所示:

forcebindip -i 192.168.0.5  MyCSharpApp.exe

这可以正常工作,并且该应用程序不知道(或无法访问)PC上的任何其他网络适配器。

是否可以将ForceBindIP限制为仅允许应用程序从任何本地网络适配器接收数据的出站流量?甚至为出站指定一个网络适配器,为入站流量指定一个网络适配器?

我找不到用于此操作的ForceBindIP的额外启动参数。

非常感谢您的帮助。

networking winsock
2个回答
0
投票

您可以在Powershell中使用Set-NetAdapterAdvancedProperty命令来设置指定适配器的流控制

获得所有网络适配器的名称和属性:-

Get-NetAdapterAdvancedProperty -Name "*"

假设您希望仅将名为“ Ethernet 2”的网络适配器用于接收来自Internet的数据,然后键入:-

Set-NetAdapterAdvancedProperty -Name "Ethernet 2" -DisplayName "Flow Control" -DisplayValue "Rx Enabled"

您可以在中找到更多信息https://docs.microsoft.com/en-us/powershell/module/netadapter/set-netadapteradvancedproperty?view=win10-ps


0
投票

如果我正确地解决了您的问题,您希望绑定您的应用程序以侦听所有可用接口上的数据包,但仅通过一个给定的接口将数据包返回。我还假定它是服务器应用程序,并且您没有更简单的源代码,也无法控制其行为。

Disclosure:我不知道ForceBindIP在内部如何工作,我基于对网站的这段理解是对它的理解:

然后将注入一个DLL(BindIP.dll),该DLL将WS2_32.DLL加载到内存中并拦截bind(),connect(),sendto(),WSAConnect()和WSASendTo()函数,将它们重定向到代码中。 DLL,用于验证它们将绑定到哪个接口,如果没有指定接口,则(重新)绑定套接字

要解决的问题

我不相信仅使用一个应用程序级DLL注入器就可以实现您所需的配置。我将列出ForceBindIP要使其工作必须克服的一些问题:

  1. listen到套接字,应用程序必须先将其bind()设为唯一的protocol-address-port组合。应用程序可以将自身绑定到特定地址或通配符(即在所有接口上侦听)。显然,如this SO question中所述,可以同时绑定通配符和特定地址。但是,从应用程序角度来看,这将是两个不同的套接字。因此,您的应用程序将必须知道如何处理这种流量。

  2. [接受客户端连接时,accept()将在Windows上创建一个新的套接字和参数,我不相信这里有API可以拦截绑定-到此时就认为该连接已建立。

  3. 现在想像,我们以某种方式得到了一个魔法插槽。我们可以在一个接口上接收数据包,然后发送到另一个接口。客户端(以及途中的所有路由设备)将必须意识到,来自两个不同源IP地址的两个数据包实际上是同一连接的一部分,并且能够组装TCP会话(或正确合并UDP流)。 >

  4. 您可以有多个具有不同优先级和规则的gefault网关(这是一个完全不同的主题,但是据我所知,这并不能解决您的特定问题:大多数路由协议都假定链接是对称的并且期望数据包保留在同一接口内。 asymmetric routingnetwork interface teaming等特殊情况,但必须在每个接口级别上实现。

一种可能的解决方案

实现您所追求的目标的一种方法(我对您的环境不甚了解,无法声称它将起作用),将是创建一个virtual interface,将其设置到另一个IP网络中,将您的应用程序绑定到该网络上,然后使用防火墙(例如,允许多播backets进入“虚拟”网络)并使用metric set to 1从该网络路由到所需的默认网关。我也怀疑只是任何Windows都不会那么灵活,所以您可能需要像Server Edition

很抱歉,这并不是立即可用的解决方案,但是我希望这能为您提供更多有关所面临问题的背景信息,并为您指明其他探索的方向。

© www.soinside.com 2019 - 2024. All rights reserved.