个人主页:Lei宝啊
愿所有美好如期而遇
前面我们说过,NAT技术解决了IP地址不足的问题,它能够将私有IP对外通信时转换为全局IP。
在私有IP向外通信时,源IP会一直被替换,直到被替换为全局IP,也就是说,192.168.1.201:8080最终也就被替换成了122.77.241.4/24这个全局IP,发送给服务器主机。
那么问题来了,服务器返回数据时向谁返回?由于私有IP被替换成了全局IP,所以至少,数据能够返回到他的出口路由器中,接下来呢?
也就有了NAPT,使用IP+Port解决问题。
在报文路由时,路由器会维护这样一种映射关系:
他们互为键值,互相映射,那么你可能说了,假如两台主机的端口号相同呢? 是不是就无法区分了?不是的,这种情况,路由器会更改端口号以作区分,假如说两个都是8080,那么替换后,有一个端口号也许就被替换成了8081。
我们首先要知道,在我们家庭网络和个人移动数据中通常不会内置正向代理服务器,像学校和公司,他们的网络中就可能内置正向代理服务器,只要我们连接了他们的网络,那么我们向互联网中发送的所有请求都会先发送到这个正向代理服务器中,由他进行转发和应答,但是如果你访问的某些咳咳网站,可能会被校园网拦截,也就是这个原因,换成个人移动数据就行了。
也就是这个样子。
正向代理服务器有这么几个特点:
代理服务器可以用来翻墙,比如说,我们内网中的主机去访问外网,通常是访问不了的,这个请求会被运营商拦截,那么我们就可以在公网上部署一个我们自己的服务器,然后向这个服务器发送请求时对请求加密,到服务器上时解密,由服务器代为访问,获取到的内容再加密发回,我们的客户端再进行解密,这样也就实现了翻墙,我们这里只说原理。
比如说,我们想访问一台主机上的资源,但是由于他处于内网中,我们没有办法直接访问,所以此时我们这样做:
首先在云服务器上部署配置frps的服务端,在主机2上部署配置frps的客户端,然后将主机2上的Linux机器上的ssh的22号端口映射到云服务器上frps的某个端口例如8080上。
我们使主机2与云服务器建立Tcp连接,此时,路由器也就建立好了NAT映射,那么,当主机1访问云服务器的8080端口时,也就相当于访问主机2的Linux机器上的22号端口。
简单来说,就是在云服务器上我们自己也可以写一个服务,然后给主机2一个客户端,主机2向我们的服务建立连接,然后在服务中,我们写的是,主机2的端口号和我们服务的一个端口号建立映射,当其他主机访问服务的这个端口时,我们就把这个访问资源的请求发给主机2,然后主机2将资源给到云服务器,再由云服务器转发回来。(云服务器充当反向代理,左右云服务器上的服务都是工具人,用来转发,真正想访问的不还是主机2上的资源)
像一些直播软件,qq,微信等,是采用了内网打洞技术的,什么是内网打洞?
通常,不处于一个局域网的两台主机是没有办法直接通信的,但是可以这样:
主机1访问服务器,路由器中建立了NAT映射,主机2也是如此,那么这两台路由器的IP地址,服务器就知道了,于是,服务器将这两台路由器的IP地址分别发给主机2和主机1,于是,主机1上的客户端就可以不通过服务器,直接向主机2进行通信,因为他们知道了彼此出口路由器的IP地址,同时,这台路由器也建立了NAT映射。
这就是内网打洞技术。