外网如何获取内网的IP?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了外网如何获取内网的IP?相关的知识,希望对你有一定的参考价值。

如果用户在局域网内使用内部IP进行外网服务器访问,如何在服务器端获得用户的局域网IP呢?
最好使用C#来实现,谢谢
能获取客户端计算机名也行,可以吗?

  内网IP只能在内网局域网访问连接,在外网是不能认识内网IP不能访问的。有路由权限,且路由有固定公网IP,可以通过路由的端口映射,实现外网访问内网。如无路由,或路由无公网IP,需要借助第三方开放的nat123端口映射网络辅助实现外网访问内网。

  端口映射网络辅助的好处是适用于任何网络环境,外网访问内网的实现过程:

  1.在内网安装并启用nat123端口映射。添加映射,配置内外网映射信息,对应内网IP端口和外网自己的域名。外网地址可直接使用提示默认域名。

  

  2.NAT映射后,通过域名访问,即可以连接内网对应IP应用。

参考技术A 最近看到一些对IP的操作,感觉不错,而且以后可能会用到,所以收集过来,以备以后使用.

1.获取MAC地址操作:

using System;
using System.Runtime.InteropServices;

namespace UtilityControl

/// <summary>
/// 关于IP地址的若干操作
/// </summary>
public class IP

public IP()

//
// TODO: 在此处添加构造函数逻辑
//


[DllImport("Iphlpapi.dll")]
private static extern int SendARP(Int32 dest,Int32 host,ref Int64 mac,ref Int32 length);
[DllImport("Ws2_32.dll")]
private static extern Int32 inet_addr(string ip);

/// <summary>
/// 根据ip得到网卡mac地址
/// </summary>
/// <param name="ip">给出的ip地址</param>
/// <returns>对应ip的网卡mac地址</returns>
public static Int64 GetMACByIP(string ip)

Int32 ldest= inet_addr(ip); //目的地的ip
try

Int64 macinfo = new Int64();
Int32 len = 6;
int res = SendARP(ldest,0, ref macinfo, ref len);
return macinfo;

catch(Exception err)

Console.WriteLine("Error:0",err.Message);

return 0;




-----------------------------------------------------------------

用C#编写获取远程IP,MAC的方法

[DllImport("Iphlpapi.dll")]
private static unsafe extern int SendARP(Int32 dest,Int32 host,ref IntPtr mac,ref IntPtr length);
[DllImport("Ws2_32.dll")]
private static extern Int32 inet_addr(string ip);

Int32 ldest= inet_addr("157.60.68.163");//目的地的ip
Int32 lhost= inet_addr("157.60.68.33");//本地的ip

try

Byte[] macinfo=new Byte[6];
Int32 length=6;

IntPtr mac=new IntPtr(macinfo[0]);
IntPtr len=new IntPtr(6);
int ii=SendARP(ldest,lhost, ref mac, ref len);

Console.WriteLine("Mac Add:"+mac);
Console.WriteLine("length:"+len);


catch(Exception err)

Console.WriteLine(err);


-----------------------------------------------

用WMI
使用时首先添加System.Management.dll,然后引用
using System.Management;
using System.Threading;

ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
foreach(ManagementObject mo in moc)

if((bool)mo["IPEnabled"] == true)
Response.Write("MAC address"+mo["MacAddress"].ToString()+"<br/>");
mo.Dispose();



2.手动设置IP或设置动态IP

如果是winform的话,需要添加对System.Management.dll的引用

然后使用下面的类就可以实现你的前2个要求:
namespace modify

public class ChangeIP


public static readonly System.Version myVersion = new System.Version(1, 1);
private ManagementBaseObject iObj = null;
private ManagementBaseObject oObj = null;
private ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
private readonly ManagementObjectCollection moc;

/// <summary>
/// example:
/// <code>
/// ArLi.CommonPrj.ChangeIP o = new ArLi.CommonPrj.ChangeIP();
/// string[] ipList = new string[]"192.168.0.253","192.168.0.250";
/// string[] subnetList = new string[]"255.255.255.0","255.255.255.0";
/// o.ChangeTo(ipList,subnetList);
/// </code>
/// </summary>
public ChangeIP()

moc = mc.GetInstances();


/// <summary>cortrol</summary>
/// <param name="ipAddr">IPAddr List</param>
/// <param name="subnetMask">subnetMask List</param>
public void ChangeTo(string[] ipAddr, string[] subnetMask)

foreach (ManagementObject mo in moc)

if (!(bool)mo["IPEnabled"]) continue;

iObj = mo.GetMethodParameters("EnableStatic");
iObj["IPAddress"] = ipAddr;
iObj["SubnetMask"] = subnetMask;
oObj = mo.InvokeMethod("EnableStatic", iObj, null);



/// <summary>cortrol</summary>
/// <param name="ipAddr">IPAddr List</param>
/// <param name="subnetMask">subnetMask List</param>
/// <param name="gateways">gateway List</param>
/// <param name="gatewayCostMetric">gateway CostMetric List, example: 1</param>
public void ChangeTo(string[] ipAddr, string[] subnetMask, string[] gateways, string[] gatewayCostMetric)

foreach (ManagementObject mo in moc)

if (!(bool)mo["IPEnabled"]) continue;

iObj = mo.GetMethodParameters("EnableStatic");
iObj["IPAddress"] = ipAddr;
iObj["SubnetMask"] = subnetMask;
oObj = mo.InvokeMethod("EnableStatic", iObj, null);

iObj = mo.GetMethodParameters("SetGateways");
iObj["DefaultIPGateway"] = gateways;
iObj["GatewayCostMetric"] = gatewayCostMetric;
oObj = mo.InvokeMethod("SetGateways", iObj, null);



/// <summary>cortrol</summary>
/// <param name="ipAddr">IPAddr List</param>
/// <param name="subnetMask">subnetMask List</param>
/// <param name="gateways">gateway List</param>
/// <param name="gatewayCostMetric">gateway CostMetric List, example: 1</param>
/// <param name="dnsServer">DNSServer List</param>
public void ChangeTo(string[] ipAddr, string[] subnetMask, string[] gateways, string[] gatewayCostMetric, string[] dnsServer)

foreach (ManagementObject mo in moc)

if (!(bool)mo["IPEnabled"]) continue;

iObj = mo.GetMethodParameters("EnableStatic");
iObj["IPAddress"] = ipAddr;
iObj["SubnetMask"] = subnetMask;
oObj = mo.InvokeMethod("EnableStatic", iObj, null);

iObj = mo.GetMethodParameters("SetGateways");
iObj["DefaultIPGateway"] = gateways;
iObj["GatewayCostMetric"] = gatewayCostMetric;
oObj = mo.InvokeMethod("SetGateways", iObj, null);

iObj = mo.GetMethodParameters("SetDNSServerSearchOrder");
iObj["DNSServerSearchOrder"] = dnsServer;
oObj = mo.InvokeMethod("SetDNSServerSearchOrder", iObj, null);



/// <summary>DHCPEnabled</summary>
public void EnableDHCP()

foreach (ManagementObject mo in moc)

if (!(bool)mo["IPEnabled"]) continue;

if (!(bool)mo["DHCPEnabled"])

iObj = mo.GetMethodParameters("EnableDHCP");
oObj = mo.InvokeMethod("EnableDHCP", iObj, null);






测试代码:
using System.Management;
using modify;
namespace WindowsApplication13

public partial class Form1 : Form

public Form1()

InitializeComponent();
//对第二个问题验证
ChangeIP test = new ChangeIP();
string[] str1 = new string[] "192.168.1.5";
string[] str2 = new string[] "255.255.255.0" ;
test.ChangeTo(str1, str2);

MessageBox.Show("IP已经更改,请验证");

//对第一个问题的验证,如果IP可用,当前并不是自动获取IP,这时下面的方法会自动获取IP
test.EnableDHCP();


本回答被提问者采纳
参考技术B 需要把内网的ip设置,放到公网上,外网自然就获取到了内网ip。 参考技术C

内网SVN应用使用场景时,使用nat123内网穿透客户端登录并添加443https应用类型映射方式。

对于办公OA、ERP等不收录的WEB网站,使用非80网站应用类型映射方式以实现外网的访问。

外网访问内网服务器时,如外网远程桌面和SSH内网LINUX机,都可以使用非网站应用类型映射方式实现外网的访问。

参考技术D 不能

哪个有免费内网IP映射外网的软件网站?给我一个哇?

要免费的。可以使用的。

免费端口映射软件其实挺多的,关键要看稳定性和操作简便性。
网云穿端口映射不需要配置服务器,也不用设置路由器 ,就可以实现对外发布应用,物联网Socket调试、远程桌面、支付调试、NAS云盘、游戏联机等等,不再为网络不互通烦恼。关键可以白嫖
参考技术A 花生壳就有啊 http://www.oray.cn/注册后给你一个免费域名 你填好A记录 下载它的客户端装在你机子上 打开客户端 添加你免费域名它会自动映射你的动态IP到一个固定IP,并将免费域名DNS解析到这个固定IP上,此时,你自己的机子就相当一个空间
花生壳可以绑定二级域名

以上是关于外网如何获取内网的IP?的主要内容,如果未能解决你的问题,请参考以下文章

内网WEB服务器IP如何映射到外网

如何将内网的机器映射到外网?

如何让内网通过外网IP访问我的WEB服务器(外网IP)呢?

vmware 怎么可以让外网访问到

网站外网可以正常访问,内网无法访问是啥原因?

哪个有免费内网IP映射外网的软件网站?给我一个哇?