写在前面:
昨天呢,在校招群里的小伙伴问了我们一个问题,让我们帮给看看:
一开始呢,博主按照经验呢跟他说是端口号被占用了,因为自己之前就遇到过这个问题。但是经过排查呢,实际上是ip地址绑定错误的问题。那么为什么不能绑定公网ip呢?
云服务器的部署:数据中心
要明白这个问题的原理,我们首先就需要明白你买的服务器(假设是腾讯云)在腾讯csig的机房是怎么布置的?
云服务器一般存放在腾讯csig的数据中心,其放在一个叫机架的地方。机架呢就是一个个的架子,每个架子中摆了好几台服务器,这个服务器就是你云服务器的主体。在机架的顶端呢,往往会存放一台交换机,又称TOR交换机。该机架上的所有的服务器都连在这个交换机上,构成一个子网。
当一个机架放不下的时候,就需要多个机架,还需要有交换机将多个机架连接在一起。这些交换机对性能的要求更高,带宽也就越大,被称为汇聚交换机。
汇聚交换机又称汇聚层,其将大量的计算节点相互连接在一起,形成集群。在这个集群中,服务器之间通过二层互通,这个区域常称为一个POD,有时候也称为一个可用区。
当节点数据再多的时候,一个可用区放不下,需要将多个可用区连在一起,连接多个可用区的交换机称为核心交换机。
核心交换机的吞吐量更高,高可用要求更高,遇到部署多组核心交换机。核心和汇聚交换机之间为了高可用,也是全互连模式的。
核心交换机之外,就是边界路由器了。至此服务器到数据中心边界的层次情况已经清除了。当然,在核心交换机上面往往会挂载一些安全设备,例如入侵检测,DDOS防护等等。这是整个数据中心的屏障,防止外来的攻击。
就此来看,这个给数据中心的服务网络如下:
其中最底层的AZ1、AZ2、AZ3等等都是可用区。显示,这是一个三层网络结构。这里的三层指的是接入层、汇聚层和核心层三层。这种模式非常有利于外部流量请求到内部应用。
NAT协议
这里我为什么又要讲NAT协议呢?是因为NAT协议在你主机和数据中心云服务器交互的过程中扮演了很重要的角色。
NAT协议:
NAT(Network Address Translation)是将IP数据报头中的IP地址转换为另一个IP地址的协议。在实际应用中,NAT主要用于实现私有网络访问公共网络的功能。这种通过使用少量的公网IP地址代表较多的私网IP地址的方式,将有助于减缓可用IP地址空间的枯竭。
一般来说,云服务器都是工作在数据中心的私网的,可以看一下博主的云服务器信息:
也就是,博主的云服务器所在的交换机的网段是172.17.x.x/x
,这个是三层网络中的私网的网络号段。而公网ip 42.192.129.38
呢,则是边界路由器的ip地址。
假如说,这个时候有一个网络包从我的主机发往我的云服务器。其中NAT地址转换流程如下:
假设我的主机私网ip :192.168.10.2
公网ip:49.2.5.64
那么首先我的主机发送的网络包从6000端口会到达交换机192.168.10.10
,交换机将这个网络包的ip地址拆开来看,发现是发给外网42.192.129.38:4000
的,就会将这个网络包发给边界路由器49.2.5.64
,这个时候边界路由器会根据NAT转换协议,在其NAT表中记录以下信息:
端口号 | 发送ip | 目的ip | 转换后ip |
---|---|---|---|
6000 | 192.168.10.2 | 42.192.129.38:4000 | 49.2.5.64:6000 |
经过转换之后,网络包的源地址就会从192.168.10.2:6000
变成49.2.5.64:6000
,而目的网络则是不变。同时路由器记录这一去一回的信息,当42.192.129.38:4000
有网络包过来的时候,我路由器就知道应该往192.168.10.2:6000
这个主机发送了。
注意:
这里有个问题没有被解决,就是假如说在公网42.192.129.38
下,有两个主机,它们是私网ip地址分别是172.17.0.2
和172.17.0.3
,它们两个访问公网公用ip42.192.129.38
。假如说,它们两个同时都开启本机的6000端口监听服务(它们提供不同的服务),那么它们是只有一个能映射到42.192.129.38:6000
还是两个都能呢?
目前来看答案有两种,一种是只能由一个映射,另一个服务器会报错。另一种则是都能映射,但是路由器会对其进行负载均衡。
目前来说,支持负载均衡说法的人会多一些。
当然,这只是第一次建立连接的时候会出现这种情况。一旦连接建立,就会在NAT去维护这一来一回的信息。
然后当这个网络包到达公网42.192.129.38
的时候,服务器肯定是开启了监听端口172.17.0.2:4000
,然后公网根据其下的NAT表中信息,将这个网络包转发至172.17.0.2:4000
。
公网端口 | 映射私网ip |
---|---|
6000 | 172.17.0.2:4000 |
… | … |
同时路由器也会记录一来一回的信息,表示从49.2.5.64:6000
来的信息都会往172.17.0.2:4000
发送,而172.17.0.2:4000
的信息都会往49.2.5.64:6000
发送。
至此,NAT协议彻底透彻。
开头问题的答案
所以说,开头问题的答案也就很简单了。
参考文献
[1] 刘超.趣谈网络协议.极客时间