【Linux网络编程】NAT、代理服务、内网穿透
目录
NAT
内网穿透
内网打洞
代理服务器
正向代理服务器
反向代理服务器
NAT和代理服务器
NAT
我们之前还遗留了一个问题,当我们的主机通过运营商的出入口路由器,再通过广域网给一台主机发送消息,然后这台主机发送回应答,是肯定可以通过广域网到达运营商的出入口路由器的,因为有IP地址,那经过了NAT后,怎么将报文从运营商的出入口路由器再发送回我们的主机呢?
路由器在进行替换时,还会形成一张映射表,将替换之前的数值与替换之后的数值进行映射,这张映射表称为NAPT。
我们先单独看客户端A的报文。源IP、源端口号、目标IP、目标端口号称为一个四元组。在这张映射表中,建立了互为键值的映射关系!未来应答到达路由器时,就可以查表,替换掉应答中的目标IP地址和目标端口号。即可完成内网转发了。
如果在我们的内网中,不止一台主机,访问目标服务器呢?如果在我们内网中,一台机器上,多个客户端,访问目标服务器呢?
我们需要知道:在我们进行NAT转换时,不仅仅只能替换源IP,也可能会替换源端口号。现在看客户端A和客户端B都向服务器发送消息的情况,客户端A先发送报文,客户端B后发送报文。此时客户端B就不能再使用1025端口了,因为路由器的1025端口已经被上一个报文使用过了,所以,此时对于客户端B发送的报文,既要替换IP地址,又要替换端口号。所以,IP+端口的映射本质是内网进程和公网进程的映射关系。因为内网IP不能出现在公网或其他内网中。所以,对于上面这种情况,只需要选择不同的端口号即可。
客户端于服务器在三次握手时,这个映射条目就会建立,太久的时间没有使用的映射是会被清理的。整个NAT对于通信双方是透明的。
内网穿透
我想在学校,远程登录上我家的Linux服务器。在学校是一种内网环境,家里也是一种内网环境。此时一种思路是,在家里的Linux机器上,启动一个客户端,让其连接云服务器,这样从家里的Linux机器到运营商的出入口路由器之间的所有路由器都会建立好NAT映射关系。在云服务器上启动一个服务,这个服务可以接收来自家里的机器的连接,这样两者能够建立连接,然后就可以通信了。假设现在在家里的Linux机器上部署了一个远程登录的服务,端口号是22,学校的机器想登录,此时学校的机器只需要登录云服务器,发送登录远程服务的请求,云服务器将报文做一个中转,交给家里的Linux机器。此时就是先由一台主机连上服务器,打通内外网,让另一台主机以登录云服务器的形式,变相地登录上了另一台主机。未来学校的机器发送的所有消息,只需要使用云服务器的IP地址和22号端口,即可经由云服务器转发给家里的机器。这种技术称为内网穿透。
已经有开源的项目能给我们提供内网穿透的功能,这个开源项目称为frp。frp既有客户端frpc,也有服务端frps,frpc在本地跑,frps以守护进程的方式部署在云服务器上。未来一台机器使用云服务器的IP地址和端口号访问云服务器,所有的请求云服务器不受理,frps建立了一个通信的信道,这些请求通过这个信道转发给另一台机器。
应用场景:
- 远程桌面控制。在一方要控制另一方时,双方都要下一个客户端,双方就会经由服务端中转。
- 在家办公。一般一些大公司都是有自己的内网的,想进公司的内网一般需要在公司的特定区域内。当我们想在家办公时,公司就可以搭建一台云服务器,在开发一个认证客户端,并将一些服务打通内外网,未来在家时,就可以利用这个认证客户端连接云服务器,就可以实现内网穿透了。
内网打洞
在学校的老师想给学生们上网课,此时老师和学生都使用同一个客户端,服务端位于云服务器上,老师使用客户端给服务器发送了一个上课的请求,学生使用客户端给服务器发送了一个听课的请求,这样两者就可以通过云服务器的中转而上课了。但是这样每次都需要经由云服务器中转是比较麻烦的。
此时可以在两个客户端都给服务器发送请求之后,服务器是可以拿到双方的出入口路由器的IP地址和端口号的,且双方的内外网都打通了,此时云服务器可以将出入口路由器的IP地址和端口号给对方,这样,双方未来都不给云服务器发消息了,而是直接给对方发消息。这就相对于在通信双方的路由器处打了一个洞,允许外部通过这个洞直接进来,这叫做内网打洞。
一般直播需要形成录播,此时就会将消息给所有的学生发送,还会再给服务器发送一份,只是这次服务器不再进行转发,而是形成录播。当然,不是所有直播都是这样的,因为必须运营商的出入口路由器允许打洞。当我们要从某一款视频播放软件上下载视频时,假设现在有两个用户,A用户和B用户都正在使用这款软件,A用户已经下载了这个视频,B用户要下载正常应该从服务器上下载,现在可以利用内网打洞,让B用户从A用户哪里下载视频,并且这款软件可以判断离B用户最近的用户是谁,从而提高下载速度,这样,云服务器的压力也得到了减轻。
代理服务器
正向代理服务器
正向代理是一种常见的网络代理方式,它位于客户端和目标服务器之间,代表客户端向目标服务器发送请求。正向代理服务器接收客户端的请求,然后将请求转发给目标服务器,最后将目标服务器的响应返回给客户端。通过这种方式,正向代理可以实现多种功能,如提高访问速度、隐藏客户端身份、实施访问控制等。当然,这个代理服务器可以转发请求,就一定可以对请求不做转发,甚至拦截。就是上面的实施访问控制。
在大学中,都会有校园网,通过账号和密码登录后就可以上网了。也就是说,要连接校园网之前,要先进行认证,所以学校会搭建一个服务器,在上面部署上认证的服务。认证通过之后,就会分配IP地址,就可以上网了。一旦连接上代理服务器,可以与之建立TCP连接,未来我们发送请求时,先发送给代理服务器,由代理服务器代替我们进行请求,得到应答后代理服务器再将应答发送回来。这种服务器称为正向服务器。在整个学校中,能访问外网的只有这台代理服务器,其他主机想要访问外网都必须经由这台代理服务器。有些学校会为学生搭建一个视频播放网站,假设学生A想看一部电影,代理服务器就会通过外网获取到这部电影,并将其缓存在代理服务器中,未来学生B也想看,此时就是纯内网级别的,提高了效率。
功能特点
- 缓存功能:正向代理服务器可以缓存经常访问的资源,当客户端再次请求这些资源时,可以直接从缓存中获取,提高访问速度。
- 内容过滤:正向代理可以根据预设的规则对请求或响应进行过滤,如屏蔽广告、阻止恶意网站等。
- 访问控制:通过正向代理,可以实现对特定网站的访问控制,如限制员工在工作时间访问娱乐网站。
- 隐藏客户端身份:正向代理可以隐藏客户端的真实IP地址,保护客户端的隐私。
- 负载均衡:在多个目标服务器之间分配客户端请求,提高系统的可扩展性和可靠性。
应用场景
- 企业网络管理:企业可以通过正向代理实现对员工网络访问的管理和控制,确保员工在工作时间内专注于工作,避免访问不良网站或泄露公司机密。
- 公共网络环境:在公共场所如图书馆、学校等提供的网络环境中,通过正向代理可以实现对网络资源的合理分配和管理,确保网络使用的公平性和安全性。
- 内容过滤与保护:家长可以通过设置正向代理来过滤不良内容,保护孩子免受网络上的不良信息影响。
- 提高访问速度:对于经常访问的网站或资源,正向代理可以通过缓存机制提高访问速度,减少网络延迟。
- 跨境电商与海外访问:对于跨境电商或需要访问海外资源的企业和个人,正向代理可以帮助他们突破网络限制,顺畅地访问海外网站和资源。
反向代理服务器
反向代理服务器是一种网络架构模式,其作为Web 服务器的前置服务器,接收来自客户端的请求,并将这些请求转发给后端服务器,然后将后端服务器的响应返回给客户端。这种架构模式可以提升网站性能、安全性和可维护性等。
基本原理
反向代理服务器位于客户端和Web服务器之间,当客户端发起请求时,它首先会到达反向代理服务器。反向代理服务器会根据配置的规则将请求转发给后端的Web服务器,并将Web 服务器的响应返回给客户端。在这个过程中,客户端并不知道实际与哪个Web服务器进行了交互,它只知道与反向代理服务器进行了通信。
一家公司需要对外提供很多的服务。客户端访问某个服务器时,这台服务器不对请求做处理,而是在内网当中随机选择一台服务器,将请求转发给选择的服务器。应答构建完成之后,可以直接发送给客户端,也可以将应答发送给代理服务器,由代理服务器发送给客户端。这样,客户端在请求时统一请求代理服务器即可。
我们购买了云服务器后,会得到一个公网IP地址,这个公网IP地址是云服务器厂商向运营商申请的,这个公网IP最终一定能被路由到运营商的代理服务器处,因为我们购买了一个云服务器,所以这个公网IP地址一定能够映射一个内网IP,拿着这个内网IP就能够进行请求了。所以内网服务器并没有配备公网IP的,而是通过映射关系建立联系的。这种代理服务器称为反向代理服务器。反向代理是更靠近服务端的。反向代理服务器在互联网的右侧,正向代理服务器在互联网的左侧。
应用场景
- 负载均衡:反向代理服务器可以根据配置的负载均衡策略,将客户端的请求分发到多个后端服务器上,以实现负载均衡。这有助于提升网站的整体性能和响应速度特别是在高并发场景下。在反向代理服务器收到请求时,可以采用某种方式,如随机或轮询,选择一台服务器提供服务,从而提高整个站点的响应速度
- 安全保护:反向代理服务器可以隐藏后端Web 服务器的真实IP地址,降低其被直接攻击的风险。同时,它还可以配置防火墙、访问控制列表(ACL)等安全策略,对客户端的请求进行过滤和限制,以保护后端服务器的安全。反向代理服务器可以隐藏后端Web服务器的内网IP地址
- 缓存加速:反向代理服务器可以缓存后端Web 服务器的响应内容,对于重复的请求,它可以直接从缓存中返回响应,而无需再次向后端服务器发起请求。这可以大大减少后端服务器的负载,提升网站的响应速度。当我们要进行登录或注册时,需要访问数据库,这样效率就低了。所以我们可以在代理服务器上缓存一些内网,如网站的首页,这样给代理服务器发送请求时,可以直接响应,可以将一些高频访问的网页缓存在代理服务器上。
- 内容过滤和重写:反向代理服务器可以根据配置的规则对客户端的请求进行过滤和重写,例如添加或删除请求头、修改请求路径等。这有助于实现一些特定的业务需求,如URL重写、用户认证等。
- 动静分离:在大型网站中,通常需要将静态资源和动态资源分开处理。通过将静态资源部署在反向代理服务器上,可以直接从反向代理服务器返回静态资源的响应,而无需再次向后端服务器发起请求。这可以大大提升静态资源的访问速度。像一些图片、视频、音频等,都是静态资源,因为就是普通的文件。像登录、注册、在线OJ等,需要让服务器进行编译、连接、运行、查看结果的叫做动态资源。一些大型网站可能会将静态资源都放在代理服务器处,要动态处理的内容交给内网服务器。代理服务器接收到请求后,会识别是静态资源还是动态资源,若是静态资源直接返回,动态资源则交给后端,这就是动静分离。
- CDN(Content DeliveryNetwork,内容分发网络)就是采用了反向代理的原理
NAT和代理服务器
路由器往往都具备NAT设备的功能,通过NAT设备进行中转,完成子网设备和其他子网设备的通信过程。代理服务器看起来和NAT设备有一点像。客户端像代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器;服务器返回结果后,代理服务器又把结果回传给客户端。
那么NAT和代理服务器的区别有哪些呢?
- 从应用上讲,NAT设备是网络基础设备之一,解决的是IP 不足的问题。代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙,另外像迅游这样的加速器,也是使用代理服务器
- 从底层实现上讲,NAT是工作在网络层,直接对IP地址进行替换。代理服务器往往工作在应用层。
- 从使用范围上讲,NAT一般在局域网的出口部署,代理服务器可以在局域网做,也可以在广域网做,也可以跨网。
- 从部署位置上看,NAT一般集成在防火墙,路由器等硬件设备上,代理服务器则是一个软件程序,需要部署在服务器上。