使用uPnP在路由器上映射端口
摘要:
使用uPnP方式在TP-Link上映射端口,配合WCF定时发送动态拨号IP实现远程访问与管理。
需求:
A客户使用拨号上网,IP经常变,有套系统刚部署经常要连过去更新程序与数据库,每次叫A总QQ远程相当不便,
当然直接在路由器上建立端口映射那是最方便,但是A总是刚伤人A企业的总经理,A企业的A网管对新上的系统有抵触(内中缘于大家都懂),
于是乎只能另辟蹊径,好在发现该企业http://192.168.1.1 可以访问到,并且是传说中的TP-Link,当然密码是拿不到地。
过程:
首先想到的是mgen兄的一片文章( http://www.cnblogs.com/mgen/archive/2013/02/03/2890987.html)
下载代码后运行报upnpnat.StaticPortMappingCollection;这句引用为空,检测发现是未开启xp系统的upnp,于是俺资料去开启
结果发现根本没装组件,安装组件时有发现没光盘---都是ghost版的,这年头那来的XP安装盘啊.
纠结中想到,你路由器上的端口映射为什么要电脑上装组件呢,于是在google C# upnp实现端口映射,果然找到2篇相关资料,发现在路由器上添加映射只需要调用路由器的ipc接口,调用是基于http的soap操作,到这里总算不用找xp安装盘了,遗憾的是那两篇资料下载的代码不能执行通过。
不过思路是有了,登录自家的路由器打开uPnP菜单,华丽的发现PPLive已经神奇般的映射4条记录,禁用uPnp,过一会再次打开UPnP,发现PPLive总能再我开启uPnP后顽强的添加一条TCP一条UDP映射^_^,到这里事情就简单了。
打开俺的HttP Analyzer ,一跟踪,SOAPAction:....AddProtMapping就呈现在眼前,于是马上打开VS2010写下
WebClient wc=new WebClient(); wc.Headers.Add("User-Agent", "OS/version, UPnP/1.0, MiniUPnPc/version"); wc.Headers.Add("SOAPAction", @"""urn:schemas-upnp-org:service:WANIPConnection:1#AddPortMapping"""); wc.Headers.Add("Content-Type", "text/xml"); var url=string.Format("http://192.168.1.1:1900/ipc",firewallAddress); byte[] data=Encoding.Default.GetBytes(xml); wc.UploadData(url, "POST", data); MessageBox.Show("zhong bu zhong ???")
执行完毕刷新路由器中的uPnP列表,果然一条本机3389端口到外网26691的TCP 映射成功添加.....
程序截图:
端口问题解决了,接下来就是使用WCF动态发送拨号获取的IP了,这个就比较简单,俺自己有个网站,租用了空间,在上面放个WCF服务页,客户电脑上安装个小程序定时请求下指定页面,就可以获取客户的公网IP了,WCF中代码入下
public string RegIp(string clientNo)
{
var properties = OperationContext.Current.IncomingMessageProperties;
var endPoint = properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
var ip= endPoint.Address;
..................
WCF部分代码到:http://www.cnblogs.com/wdfrog/archive/2013/04/12/3016184.html下载
上面那个端口映射程序的代码需要的留下Email,回家统一发个^_^!