【LINUX网络】NAT _ 代理_ 内网穿透
【LINUX网络】IP——网络层-CSDN博客
在IP层的学习中,我们阐述了NAT技术是如何把如何从入口路由器把报文转回来?
这就必须用到NAT(Network Address Translation,网络地址转换)技术,这是一种将私有(内部)网络地址转换为公有(外部)IP地址的技术。NAT主要用于解决IPv4地址短缺问题
1.NAT NAPT
之前,在网络层通信中,我们已经了解到(如上图):每当一个数据报从一个局域网向上传递一次,就会把自己的源IP地址替换成新的、位于当前局域网的IP。这本身就是NAT技术的体现,但是当时遗留了一个问题,返回的时候,只知道当时的出口路由器的IP地址,如何在进入内网之后再转发到指定的主机呢?
此时,就需要一个映射表,在出口路由器中记录“来时路”,然后当 发送时的目标IP作为源IP向当前的入口路由器发送报文时 就通过这张映射表,找到来时路,这样就能知道,是哪个名不见经传的、不具备公网IP的”边缘“机器需要接受这条返回的报文
这样的一张表,我们称为NAT表
每当一个报文经过一个路由器,这个路由器都会记录下报文的源IP与即将被转换的IP——如上图的黄色框。其实,每一个信息都是一个四元组,里面包含:源IP地址+端口+目的IP+端口。而路由器需要存的另外一个四元组是:路由器的WAN口IP+端口+目的IP+端口(其中目的ip+端口是不变化的),两个四元组需要互为键值,才能相互映射(其实直接两个vector就行)
而进行这一步“映射”的时机就是在某一台局域网内主机第一次对外发送数据(例如需要建立TCP连接时,第一次握手的时候)。
有了这个映射关系,当目标主机再向IP地址和端口为
202.244.174.37:1025
的主机发送数据时,路由器收到这个数据会根据这个映射关系表将数据转发给源主机,即10.0.0.10:1025
并且,如果10.0.0.10又向163.221.120.9发消息,还可以直接利用刚刚的映射关系,无需重新映射。
通常,NAT设备会设置一个超时时间(timeout),如果在超时时间内没有收到任何与该条目相关的数据包,该条目就会被删除。
NAPT
现在有一个新的问题,10.0.0.10:80和202.244.174.37:80建立了映射,那10.0.0.11:80该和谁建立呢?10.0.0.10:81该和谁建立连接呢?
NAT转换只替代、记录源IP;NAPT同时替换、记录IP和port。
NATP作为NAT技术的衍生,解决了:
所以,一旦端口发生了冲突,就可以直接改变映射之后的端口的值(没有人要求映射表左右两边的端口值必须是一样的! ),只要保证四元映射正确即可。
由此我们可以进一步理解我们在腾讯、阿里购买的云服务器与之前所写的通讯DEMO
其实,当我们在TCP通信或者HTTP通信的时候,如果打印对方的IP,会发现:
从来都是公网IP——因为我们的数据从云服务器上的机器发出,一步一步路由到阿里或者腾讯公司的出口服务器,把自己的源IP早就改成了新的路由器WAN口IP,每一次改动都会都会把映射存到当下的路由器中去。
并且,在echo中,如果服务器把服务器收到的IP信息发回给客户端,客户端就能查看客户端自己局域网的出入口路由器信息
2. 代理服务器
代理服务器(Proxy Server)分为两种:正向代理服务器和反向代理服务器
正向代理:
正向代理是一种常见的网络代理方式,它位于客户端和目标服务器之间(更偏向于客户端),代表客户端向目标服务器发送请求。正向代理服务器接收客户端的请求,然后将请求转发给目标服务器,最后将目标服务器的响应返回给客户端。通过这种方式,正向代理可以实现多种功能,如提高访问速度、隐藏客户端身份、实施访问控制(比如图书馆的代理服务器可以控制你的请求,拒绝你访问steam或者4399;或者公司的代理服务器拥有可以直接翻墙的能力,也可以直接让员工翻墙)等。示意图如下:
客户端将请求发送给正向代理服务器,正向代理服务器接收请求后,根据配置进行处理,例如缓存查找或内容过滤等。接着,正向代理服务器将处理后的请求转发给目标服务器,目标服务器处理请求后,将响应返回给正向代理服务器,最后正向代理服务器将响应返回给客户端。
有大致如下作用:
1. 正向代理服务器可以缓存client经常访问的资源,当client再次访问这个资源时可以直接返回。
2.隐藏客户隐私,隐藏客户的IP,提高客户的安全性
3.过滤、控制客户端的请求,控制经过代理服务器的响应和请求。比如企业可以通过正向代理实现对员工网络访问的管理和控制,确保员工 在工作时间内专注于工作,避免访问不良网站或泄露公司机密。
梯子也是一种经典的正向代理服务器。。。。拥有一台可以登录“世界公网”的机器(机器可以是在HK、霓虹国、漂亮国),然后用户端下载一个客户端,客户端会篡改路由表——先对客户端对于外网的请求进行加密(目的是不被运营商发现),再把用户所有的请求都截取,路由到可以登录“世界公网”的机器,这样就可以出去了。
反向代理:
反向代理服务器是一种网络架构模式,其作为Wb服务器的前置服务器(更偏向于服务器),接收来自客户端的请求,并将这些请求转发给后端服务器,然后将后端服务器的响应返回给客户端。这种架构模式可以提升网站性能、安全性和可维护性等
基本原理为:反向代理服务器位于客户端和Wb服务器之间,当客户端发起请求时,它首先会到达反向代理服务器。反向代理服务器会根据配置的规则将请求转发给后端的Wb服务器,并将Wb服务器的响应返回给客户端。在这个过程中,客户端并不知道实际与哪个Wb服务器进行了交互,它只知道与反向代理服务器进行了通信
我们购买的云服务器不过就是集群服务器中的一台,看到的公网IP很可能就是这台反向代理服务器的。
同样的代理服务器也有很多作用:
负载均衡:反向代理服务器可以根据配置的负载均衡策略,将客户端的请求分发到多个后端服务器上。
安全保护:反向代理服务器可以隐藏后端Web服务器的真实IP地址,降低其被直接攻击的风险。
缓存加速:反向代理服务器可以缓存后端Web服务器的响应内容,对于重复的请求,它可以直接从缓存中返回响应,而无需再次向后端服务器发起请求。
内容过滤和重写:反向代理服务器可以根据配置的规则对客户端的请求进行过滤和重写,例如添加或删除请求头、修改请求路径等。
动静分离:在大型网站中,通常需要将静态资源和动态资源分开处理。通过将静态资源部署在反向代理服务器上,可以直接从反向代理服务器返回静态资源的响应,而无需再次向后端服务器发起请求。这可以大大提升静态资源的访问速度
CDN(Content Delivery Network,内容分发网络):CDN就是采用了反向代理的原理——cdn旨在通过将内容缓存到多个地理位置的服务器上(如网页、图片、视频、CSS文件、JavaScript文件等前端静态资源),从而提高内容的传输速度和可用性(因为减少了传播距离!)。CDN的主要目标是减少内容传输的延迟,同时减轻源服务器的负载。反向代理最出名的服务就是Nginx
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全-CSDN博客
代理服务器和NAT技术
从功能上看:路由器(大部分路由器兼具NAT功能)转换数据报的IP,对子网设备起到中转的作用;代理服务器把请求转发给真正要请求的服务器;服务器返回结果后,代理服务器又把结果回传给客户端。
但是,代理服务器偏向于应用层,NAT则是在网络层工作;NAT一般继承与路由器这种硬件设备上而代理服务器是软件程序,部署在服务器上;NAT一般在出入口路由器中进行,而代理服务器既可以在局域网中做,也可以在广域网中做。
整体来说,理解他们为分层的,都为了用户体验提速的设备即可。
3.内网穿透与内网打洞
由于防火墙、路由器的限制,外部的设备通常无法直接连接到内网服务,内网穿透技术就是为了解决这个问题。
建立连接:内网设备(如个人电脑或服务器)启动时,会主动连接到公网上的中转服务器,并向其注册自己的信息和提供的服务(中转服务器成为内网服务器的反向代理)。
请求转发:当外网设备想要访问内网设备时,它会向中转服务器发送请求。中转服务器根据之前注册的信息,将请求转发到对应的内网设备。
响应返回:内网设备处理完请求后,通过同一条隧道将数据返回给中转服务器,再由中转服务器转发给外网设备
内网穿透和服务器转发的原理几乎是一样的。
部署内网穿透(实践中再次观察原理):
这样的穿透工具,最出名的之一就是frp和frps(frp server),需要三台机器(本地,云服务器 远端目标服务器)
1.直接去官网下载编译好的版本,解压之后直接是可执行文件
2.win和ubuntu上互相ping
3.scp指令互相拷贝frp程序
4.配置
frpc相当于是一个本地ubuntu的代理服务器,所以拿到报文之后还需要在本机内进行转发,比如发送到ssh协议上
remoteport 6000是云服务器的端口,22是linux机器上的端口,6000和22建立映射,有一点不太对劲。。。。。
其中的remoteport是很好玩的一件事
我们刚刚在云服务器的frps上配置的端口其实是8888(serverport),现在怎么又冒出来一个6000?
其实,8888是让fpc用来建立连接的,建立好连接只会会把6000推送到云服务器上,让云服务器再绑一次,生成一个Listen socket,来监听win端发出的请求。win端发出的请求也是直接到达6000,之后再直接到达ubuntu的22号端口(假设今天访问的是ubuntu上的ssh服务)
登陆上了ssh,就可以直接操作了:
除此之外,如果在ubuntu上安装了nginx,还可以在win端直接访问——这次又有一个新的remotePort(为了便于观察,把ssh的改成了8081,现在的nginx的代理改成了8082),这次相当于又给8082绑定一个套接字,win访问8082就直接映射到nginx的端口(80)上。
内网打洞:
想操控的机器在右边,我们自己使用的在左边。
比如今天我们想进行一场直播,就需要先访问云服务器,访问云服务器的时候就已经建立好了出口路由器和云服务器的NAT表
同样看直播的人也和服务器构建好了相关的表
云服务器可以把对方的出口公网IP发给对方,就能实现点对点、P2P的通信了。
发出来的报文经过运营商的服务器直接转到主机
TCP UDP都可以进行打洞,但是主要是通过UDP打洞技术来实现P2P连接,减少对中转服务器的依赖,从而降低带宽压力和提高传输效率。
快播的P2P就是经典的内网穿透例子,当然这也带来了很多容易犯法的东西。
其他经典的内网穿透的运用场景:
远程办公与访问:企业员工通过内网穿透访问总部管理系统或数据库
家庭设备管理:远程查看家庭监控摄像头
联机游戏:内网主机通过穿透工具实现多人联机。