花生壳域名绑定动态IP原理浅析
闲来无事,想自己搭一个web服务器,在家里自己的内网玩一玩。上网搜索发现可以在花生壳申请免费域名,而且还能不做任何端口映射配置,就能穿越NAT,对外发布,真是挺神奇的!带着疑问和好奇心,笔者按部就班地搭建了一个最简单的web服务器。
一、实现
步骤就不详述了,主要有以下几步:
1、 后台搭建WEB服务器。
2、 注册花生壳账户,申请免费域名。
3、 下载花生壳客户端。在WEB服务器上安装,填写映射内网IP、端口号等信息。
4、 登陆花生壳客户端,开启映射。
这样,在浏览器中输入域名,就能连接到web服务器了。
图一
二、原理分析
绑定动态IP还好理解,因为本地运行的客户端去和远端花生壳服务器通信,都是带着拨号成功后的新IP,服务器收到报文后,也就把域名和新IP绑定了。但是,为何路由器等中间网络设备不需要做任何端口映射等配置,就可以对外发布服务呢?网上搜索了一下,并没有找到答案。本着自己动手丰衣足食的原则,笔者自己试着寻找答案。
在输入网页连接服务时,抓包查看:
图二
发现并没有和WEB服务器的公网IP通信,而是和103.6.84.190通信。
连接成功后,我们在服务器上查看端口连接状态:
图三
发现WEB服务器也是和103.6.84.190通信,并且存在两条连接。
这样,我们可以知道,在输入网页后,并没有直接连接到WEB服务器,而是通过另外一台服务器中转。也就是说,域名绑定的IP并不是WEB服务器真正的公网IP,而是某台中转服务器的公网IP。
到现在,大概的原理已经比较清楚了:
1、 输入网站,DNS域名解析到中转服务器103.6.84.190。
2、 中转服务器和WEB服务器连接。
但是还有一个问题是始终绕不开的,为什么我在拨号路由器上没有任何端口映射或者虚拟服务器的配置,中转服务器又如何能主动连接WEB服务器的8086(IIS设定的开放端口)服务呢?答案只有一种可能,那就是中转服务器根本就没有连接WEB服务器的8086端口。
我们再看图三,正是印证了我们的猜想。103.6.84.190没有和服务器的8086端口,而是和1547、1533端口连接。真正连接WEB服务的是下一条连接:
Localhost :1554 -> localhost:8086
“中转”似乎可以用来概括整个通信过程。通过远端服务器和本地服务器两次中转,最终建立连接。而整个通信的关键,在于本地花生壳客户端和远端服务器之间的通信。我们通过抓包来看。
启动花生壳客户端时,在web服务器上抓包查看:
图四
发现有大量和220.170.79.222通信的报文。这不难理解,此时客户端需要和服务器建立连接,完成用户名密码验证等步骤。
Localhost : 1430 -> 220.170.79.222 : 6060
此后客户端必须要告诉服务器,此用户使用的域名。我们找到了这个报文:
图五
服务器收到此报文后,设定某一服务器103.6.84.190用于中转,也就是使用服务器IP绑定域名,并把该IP告诉客户端。后断开此连接。
客户端连接103.6.84.190,并保持连接:
① Localhost : 1547 ->103.6.84.190 : 6064
外网访问WEB服务器时,在WEB服务器上抓包:
图六
可以看到客户端使用另一端口连接服务器的6064:
② Localhost : 1553 <-> 103.6.84.190 : 6064
并且生成一条本地连接:
③ Localhost : 1554 <-> localhost : 8086
连接①可以看做是控制连接,只要运行花生壳客户端,一直存在。
连接②、③可以看做是数据连接,每连接一次服务,生成一个新连接。
而关键在控制连接①,如果没有连接①,则中转服务器无法主动去连接到内网来。
现在,整个过程应该比较清楚了。另外要说明的是,我们以上实验,花生壳客户端是安装在web服务器上,实际并不一定要这么做,可以安装在任何一台能够访问web服务器PC机,和上面的区别只是连接③非本地连接而已。
因此整个过程可以用图七来描述:
图七
1、 在局域网PC运行花生壳客户端,和花生壳服务器建立连接,
2、 花生壳服务器选择中转服务器,将域名和中转服务器公网IP绑定。并告诉花生壳客户端。
3、 花生壳客户端和中转服务器保持连接。
4、 外网用户输入网址,DNS解析到中转服务器IP,向中转服务器发送请求。
5、 中转服务器收到请求后,向花生壳客户端发送请求。
6、 花生壳客户端根据配置的WEB服务器IP和端口,向WEB服务器发送请求。
7、 WEB服务器收到请求后,应答,通过花生壳客户端、中转服务器,最后到达外网用户。
三、结语
实际上,域名绑定动态IP的说法并不准确,WEB服务器所在的ADSL线路拨号所产生的公网IP变化,并不影响域名和IP的绑定,域名一直和中转服务器IP绑定,只是和中转服务器建立连接的IP变了而已。