第二种情况是,ISP虽然不给静态IP,但是给的动态IP是公网IP,而不是自己内网的IP。这种情况下依然可以做端口映射,但是由于IP地址不固定,所以需要通过方法来告知连接者IP到底是多少。解决这个问题最暴力的一种随时IP并发送邮件/信息来告知连接者真实IP。另外一种则是DDNS技术,这种技术比较简单,不单独做一小节描述,该技术就是首先获得一个域名,并要求内网设备每隔一段时间对于DDNS服务器发起请求,DNS服务器将请求的IP记录下来并且刷新相关域名的解析记录。最终可以通过该域名找到当前的IP地址。
最后一种情况就比较糟糕了,家庭路由器上面一层连接的是ISP的另一层路由器,甚至有层层链接。这种情况下,在自己的路由器上设置映射是没有作用的。这种时候就需要内网穿透的技术了。该技术在下一小节描述。
内网穿透的技术说起来也不是很难理解,对于在NAT之后的节点来说,其不是能主动访问公网端口,而是不能反过来有效的被公网访问。内网穿透的主要思路就是利用这一点,让在NAT之后的节点主动访问一个拥有公网IP地址的服务器,并由中间服务器搭桥,打通经过该服务器从其他主机到NAT之后节点的隧道。
已经停止更新的ngrok便是完成这样工作的开源项目,下面便是ngrok说明文档里面的配图。
”I want to expose a local server behind a NAT or firewall to the internet.”
利用参考文献6的例子详细解释内网穿透的原理:
假设拥有公网IP的中间服务器的IPv4地址为23.23.23.23,NAT之后节点的IP为192.168.1.2。现在需要将该NAT之后节点的80HTTP服务器暴露出去。在正式提供内网穿透之前,需要完成以下两点准备工作:
首先按照如下参数配置中间服务器:公网主机先80端口,同时其他任意一个端口,这个端口是用于让内网服务器主动连接进来打通一个隧道。
接着内网再主动向公网主机的指定端口发起一个请求,这样内网就成功与公网主机建立了一个连接通道。
准备工作结束后,就可以利用中间服务器进行内网穿透了:
客户端主动连接公网的80端口,即23.23.23.23:80
公网接收到连接请求之后,将请求通过先前建立好的隧道转发到内网主机
内网主机接收到来自隧道的数据包后,再连接内网主机自身的80端口
连接成功之后将数据包原封不动地转发数据包给80端口
待HTTP服务器程序处理完这个数据包,生成了响应报文之后再转发到隧道端口
隧道端口将响应报文发送给中间公网服务器
中间服务器将该报文转发到公网的80端口
然后返回给最开始请求公网服务器80端口的客户端
同样该技术除了可以访问隐藏在NAT之后的节点,同样可以穿透防火墙。由于防火墙只拦截了入站没有拦截出站,所以可以让防火墙内的服务器主动连接到一个公网服务器打通隧道,并通过该隧道最终链接到本地的其他端口。
总的来说,内网穿透技术可以适用于所有能够连通公网的机器,提供了一个通用的打通内网的方式。
国内提供这种服务器的有花生壳和nat123。
然而! 这样很明显的问题是,对于每一次内容的传输,都需要服务器做代理!!!这对于服务器流量与传输延迟都是非常非常不理想的。能否将服务器只当一个握手工具,当两边接上头了后直接P2P做全端口映射?
新华三有一篇技术博客专门分享穿越NAT的P2P的方法,见参考文献7。这里主要讲一下穿越NAT的P2P端口映射的思路。用H3C讲述此技术的一张图,描述非同一网段,两端均在NAT后的P2P技术:

客户端A,B均在NAT之后,现在需要他们两P2P通讯。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-66084-2.html
老美还有上万大军占领着伊拉克
楼上2B