【问题标题】:How to Change Public IP Address in C#如何在 C# 中更改公共 IP 地址
【发布时间】:2017-05-03 00:29:48
【问题描述】:

我正在创建一个 C# winform 应用程序,我想在其中更改公共 IP 地址,而不是像(Hotspot-Shield、ZenMate、OpenVPN 等)那样的 IPv4 地址。

我检查了以下链接,但没有找到足够的帮助,所以我发布了这个问题:

How can you change Network settings (IP Address, DNS, WINS, Host Name) with code in C#

Changing IP address in C#

我编写的代码与第一个链接的答案相同,也使用了库,但是当我通过 google.com 检查我的 IP 地址时,它保持不变。我不懂socket编程。

这是我的代码:

namespace WindowsFormsApplication1
{
class ChangeIP
{
    public void SetIP(string ipAddress, string subnetMask, string gateway)
    {
        using (var networkConfigMng = new ManagementClass("Win32_NetworkAdapterConfiguration"))
        {
            using (var networkConfigs = networkConfigMng.GetInstances())
            {
                foreach (var managementObject in networkConfigs.Cast<ManagementObject>().Where(managementObject => (bool)managementObject["IPEnabled"]))
                {
                    using (var newIP = managementObject.GetMethodParameters("EnableStatic"))
                    {
                        // Set new IP address and subnet if needed
                        if ((!String.IsNullOrEmpty(ipAddress)) || (!String.IsNullOrEmpty(subnetMask)))
                        {
                            if (!String.IsNullOrEmpty(ipAddress))
                            {
                                newIP["IPAddress"] = new[] { ipAddress };
                            }

                            if (!String.IsNullOrEmpty(subnetMask))
                            {
                                newIP["SubnetMask"] = new[] { subnetMask };
                            }

                            managementObject.InvokeMethod("EnableStatic", newIP, null);
                        }

                        // Set mew gateway if needed
                        if (!String.IsNullOrEmpty(gateway))
                        {
                            using (var newGateway = managementObject.GetMethodParameters("SetGateways"))
                            {
                                newGateway["DefaultIPGateway"] = new[] { gateway };
                                newGateway["GatewayCostMetric"] = new[] { 1 };
                                managementObject.InvokeMethod("SetGateways", newGateway, null);
                            }
                        }
                    }
                }
            }
        }
    }

    /// <summary>
    /// Set's the DNS Server of the local machine
    /// </summary>
    /// <param name="nic">NIC address</param>
    /// <param name="dnsServers">Comma seperated list of DNS server addresses</param>
    /// <remarks>Requires a reference to the System.Management namespace</remarks>
    public void SetNameservers(string nic, string dnsServers)
    {
        using (var networkConfigMng = new ManagementClass("Win32_NetworkAdapterConfiguration"))
        {
            using (var networkConfigs = networkConfigMng.GetInstances())
            {
                foreach (var managementObject in networkConfigs.Cast<ManagementObject>().Where(objMO => (bool)objMO["IPEnabled"] && objMO["Caption"].Equals(nic)))
                {
                    using (var newDNS = managementObject.GetMethodParameters("SetDNSServerSearchOrder"))
                    {
                        newDNS["DNSServerSearchOrder"] = dnsServers.Split(',');
                        managementObject.InvokeMethod("SetDNSServerSearchOrder", newDNS, null);
                    }
                }
            }
        }
    }
}
}

以下是我如何调用这些方法:

{
static string local_ip;
string public_ip;

public static string GetLocalIPAddress()  //Method For Getting Local Machine IP
    {
        var host = Dns.GetHostEntry(Dns.GetHostName());
        foreach (var ip in host.AddressList)
        {
            if (ip.AddressFamily == AddressFamily.InterNetwork)
            {
                return ip.ToString();
            }
        }
        throw new Exception("Local IP Address Not Found!");
    }
// Mehod End
            local_ip = GetLocalIPAddress();
            ChangeIP ip = new ChangeIP();
            ip.SetIP(local_ip, null, null); // Calling Method
            var getNIC = NetworkInterface.GetAllNetworkInterfaces();
            NetworkInterface[] NI = NetworkInterface.GetAllNetworkInterfaces();
            string nic = string.Empty;
            string dnsServer = string.Empty;
            foreach(var r in getNIC)
            {
                nic = r.Name;                    
            }
            foreach(NetworkInterface ninter in NI)
            {
                if(ninter.OperationalStatus == OperationalStatus.Up)
                {
                    IPInterfaceProperties ipProperties = ninter.GetIPProperties();
                    IPAddressCollection dnsAddresses = ipProperties.DnsAddresses;
                    foreach(IPAddress dnsAdrs in dnsAddresses)
                    {
                        dnsServer = dnsAdrs.ToString();
                    }
                }
            }
            ip.SetNameservers(nic, dnsServer);  // Calling Method
            public_ip = new WebClient().DownloadString("http://icanhazip.com");
}

【问题讨论】:

  • 我在想的只是“嗯?”
  • 您是在更改您的计算机在网络上的 IP 地址还是公共 IP 地址?如果您在网络上的家用计算机上运行此代码,则很可能您只是更改了自己的 IP,而 Google 会告诉您网络网关(路由器/调制解调器)的 IP。
  • 想换网路IP,不懂socket编程。
  • but when I check my IP address through google.com it remains the same 这是完全合理的。您不能只通过网络中本地计算机上的一些魔术代码来更改您的公共互联网 IP,这是由您的路由器决定的。除非您重新启动路由器并使其绘制其他 IP,否则外部互联网 (google.com) 会像以前一样看到您。我们在这里讨论的是两个完全不同的网络,您的本地网络和您的路由器连接到互联网的 IP。
  • VPN 和 IPSec 是完全不同的领域,它通过安全通道对数据包进行实际的重新路由。简而言之,如果您使用 HotSpot-Shield 之类的程序,互联网将看到 HotSpot-Shield VPN 服务器的 IP 地址,而不是您的,因为您的所有数据包都通过该 VPN 服务器重新路由。

标签: c# winforms ip


【解决方案1】:

您如何描述您的问题不是互联网(应该)如何工作。

Windows 不允许您编写原始 IP 数据包,为此您需要使用 TAP/TUN 驱动程序。但是,虽然你发送了欺骗源 IP 地址的数据包,但你和目标之间的互联网不会返回路由。

如果您在一个 IP 地址块后面进行操作,并且只想在该块中欺骗另一个,则返回地址将返回到您的本地路由器,但仍然不需要路由返回给您。

除非您使用 TAP/TUN,否则没有其他方法可以窃取他人的公共 IP 地址,但本论坛范围之外的其他网络安全漏洞利用除外。

即使使用 TAP/TUN,您在一个方向上通过欺骗性 IP 数据包实现的功能也非常有限。事实上,ISP 可能会过滤掉伪造的 IP 地址。

【讨论】:

    猜你喜欢
    • 2022-09-23
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多