【发布时间】:2016-06-29 18:08:50
【问题描述】:
如果我们在给定机器上有多个具有相同 DNS 后缀的网络接口,我如何以编程方式确定将路由的网络接口流量?
例如,我在办公室通过以太网连接到公司网络,并从办公室内部通过 VPN 连接到公司网络。这听起来很愚蠢,但是根据我们的网络连接方式,如果到我们数据中心的内部链接出现故障 - 我会从办公室内部 VPN 继续开发。
我们的软件具有确定“本地 IP 地址”的逻辑,并将其用于其他地方的身份验证逻辑。我从实践中知道,我的所有流量在连接时都通过 VPN 路由 - 但我正在努力在代码中正确实现以稳健地选择具有最高优先级的适配器的 IP 地址。
我现在拥有的是:
var unicastIpAddressInformation = NetworkInterface.GetAllNetworkInterfaces()
.Where(nic => nic.OperationalStatus == OperationalStatus.Up
&& nic.NetworkInterfaceType != NetworkInterfaceType.Loopback // ...ignore the loopback NIC as we don't want 127.0.0.1 (1 of 2)
&& nic.Name.IndexOf("loopback", StringComparison.OrdinalIgnoreCase) == -1 // ...ignore the loopback NIC as we don't want 127.0.0.1 (2 of 2)
&& nic.Name.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) == -1 // ... ignore virtual NICs so that VMs don't conflict with IP resolution
)
.Select(n => n.GetIPProperties())
// All developer network connections should have the my-company-internal.com suffix
.Where(ipp => ipp.DnsSuffix.ToLowerInvariant().IndexOf("my-company-internal.com", StringComparison.OrdinalIgnoreCase) >= 0)
.Where(ipp => ipp.UnicastAddresses.Any(u => u.Address.AddressFamily == AddressFamily.InterNetwork))
// Is this order by correct?
.OrderByDescending(ipp => ipp.GetIPv4Properties().Index)
.SelectMany(ipp => ipp.UnicastAddresses.Where(ip => ip.Address.AddressFamily == AddressFamily.InterNetwork))
.FirstOrDefault();
我知道 IPV4Properties.Index - 只有在启用 IPv4 时才会填充它;我不知道是否对应于优先级或度量,以及它们是否保证是不同的。
【问题讨论】:
-
对于IP,优先级由掩码大小决定。掩码越小优先级越高。流量将始终以较小的掩码流出路线。当主路由关闭时,数据会从次路由流出。
-
我知道 - 我两次连接到我的公司网络。我有 2 个 IP 地址,每个 IP 地址都具有相同的网络掩码,并且每个 IP 地址都可以访问相同的路由。我清楚地看到 VPN 适配器受到青睐 - 我如何在代码中以编程方式获取 VPN 适配器 IP 地址?
-
换面具!!!没有其他办法。 WINDOWS操作系统只用面具!!!
-
@jdweng "流量总是会从掩码较小的路线流出。" 这完全是倒退。较大的掩码更具体,因此使用具有较大掩码的路由。例如,默认掩码(
0.0.0.0= 0 位)是最小的掩码,默认路由是最不优选的,而最大的掩码(255.255.255.255= 32 位)是最具体的具有此掩码的路由是最喜欢的。
标签: c# networking