【Linux】网络编程 —— NAT、内网穿透、代理服务
欢迎来到Linux专栏 ~~ 网络编程博客主页张小姐的猫~江湖背景所属专栏Linux ~ 不破不立作者水平很有限如果发现错误可在评论区指正感谢网络编程欢迎来到Linux专栏 ~~ 网络编程NAT 技术背景♻️NAT ~ IP转换过程NAPT❌️NAT技术的缺陷通信过程内网传统 vs 内网打洞内网打洞内网穿透代理服务器1️⃣正向代理2️⃣反向代理代理服务器和NAT写在最后NAT 技术背景之前我们讨论了IPv4协议中IP地址数量不充足的问题NAT技术当前解决IP地址不够用的主要手段是路由器的⼀个重要功能NAT能够将私有IP对外通信时转为全局IP。也就是就是⼀种将私有IP和全局IP相互转化的技术方法很多学校家庭公司内部采用每个终端设置私有IP而在路由器或必要的服务器上设置全局IP全局IP要求唯⼀但是私有IP不需要在不同的局域网中出现相同的私有IP是完全不影响的♻️NAT ~ IP转换过程私有IP内部转换的工作都会存在一旦进入了公网则不需要源IP地址替换了报文每经过一个路由器路由器就会自动把报文的SRC换成自己的WAN口IP其实1️⃣源IP、源端口也可能会被替换IP地址在内网和公网其实都是唯一的如何理解2️⃣是只在一个内网里是唯一的但是可能会和其他的内网中的IP地址会出现冲突NAPT那么问题来了如果局域网内有多个主机都访问同⼀个外网服务器那么对于服务器返回的数据中目的IP都是相同的。那么NAT路由器如何判定将这个数据包转发给局域网的哪个主机?这时候NAPT来解决这个问题了。使⽤IP port来建立这个关联关系如果三台电脑都要访问 Internet —— 如果只做简单NAT192.168.1.10→203.0.113.10192.168.1.11→203.0.113.10192.168.1.12→203.0.113.10外网服务器返回数据时就会产生问题都是发给203.0.113.10到底该转发给哪台内网主机于是NAPT使用端口号来区分不同连接。实际上就把源地址 端口号路由器的WAN口 新端口号192.168.1.10:50000→203.0.113.10:10001192.168.1.11:50000→203.0.113.10:10002这样即使转换后的src地址一样但同样可以根据端口号的不同来区分转发到不同的主机最终路由器会有一张转化表内网 外网------------------------------------------------192.168.1.10:50000←→203.0.113.10:10001192.168.1.11:50000←→203.0.113.10:10002192.168.1.12:60000←→203.0.113.10:10003这种关联关系也是由NAT路由器自动维护的。例如在TCP的情况下建立连接时就会生成这个表项在断开连接后就会删除这个表项那么两个内网主机有NAT隔离可以直接通信吗❌️因为在对应的路由器上还没有对应的转换条目没有NAT表【NAT】 A ─── Internet ─── NAT ─── B A 主动访问 B ↓ NAT 没有映射 ↓ 不知道交给哪个内网主机 ↓ 不能直接通信如果目标网络被NAT隔离且没有NAT映射那么外部无法主动找到具体的内网主机服务器不能直接给主机直接发送数据因为进入到路由器根本找不到映射 —— 不知道要转发给哪个主机❌️NAT技术的缺陷由于NAT依赖这个转换表所以有诸多限制无法从NAT外部向内部服务器建立连接转换表的生成和销毁都需要额外开销通信过程中⼀旦NAT设备异常即使存在热备所有的TCP连接也都会断开通信过程内网 A 访问公网 BA NAT 路由器 B192.168.1.10:50000公网IP1.1.1.18.8.8.8:443│ │ │ └──────────────────────────→│───────────────────────→│A 发出的数据源192.168.1.10:50000目的8.8.8.8:443过程先路由判断再做 SNAT① 数据包进入路由器 ↓ ② 查路由表 目的8.8.8.8→ 应该从 WAN 口出去 ↓ ③ 确定出口接口 ↓ ④ 做 SNAT —— 建立好映射192.168.1.10:50000↓1.1.1.1:30000↓ ⑤ 从 WAN 口发出所以对于内网访问公网可以简单记先路由确定出口再 SNAT修改源地址返回数据时B返回源8.8.8.8:443目的1.1.1.1:30000进入NAT路由器① 收到数据包 ↓ ② 查 NAT/连接跟踪表1.1.1.1:30000↓ 对应192.168.1.10:50000↓ ③ 做 DNAT 修改目的地址1.1.1.1:30000↓192.168.1.10:50000↓ ④ 查路由表 发现192.168.1.0/24从 LAN 口出去 ↓ ⑤ 发给 A先根据 NAT 状态还原目的地址再根据新的目的地址查路由DNAT 通常影响后续的路由选择SNAT 通常依赖前面的路由选择结果内网传统 vs 内网打洞内网打洞内网打洞 两个内网主机先主动向外发消息让NAT记录映射然后再利用这个映射互相通信以后两个路由器进行通信就不再需要经过路由器了把数据转发到对方的出口路由器就行 —— 因为出去和服务器进行通信时就已经产生了NAT表了说明是可以映射回来的云服务器收到的客户端IP本质是运营商出口路由器的WAN口IP内网穿透公司和云服务器使用了frpc把本地的22号端口映射到frps的8888端口也就是将来发送给8888的请求都会转发到22号端口 ——frps干的那么我们居家办公访问8888号端口 访问22号端口了内网穿透和内网打洞的区别核心原理都是利用路由器形成的NAT转化表把我们的内网服务暴露出去的特征内网穿透必须强依赖于一款服务器服务器一直要进行工作让用户访问8888的端口等同于访问内网主机内网打洞借鉴云服务器做出入口路由器地址的交换从而摒弃云服务器内网穿透是一直在用内网打洞则是用一会代理服务器1️⃣正向代理正向代理ForwardProxy是⼀种常见的网络代理方式它位于客户端和目标服务器之间代表客户端向目标服务器发送请求。正向代理服务器接收客户端的请求然后将请求转发给目标服务器最后将目标服务器的响应返回给客户端。通过这种方式正向代理可以实现多种功能如提高访问速度、隐藏客户端身份、实施访问控制等工作原理客户端将请求发送给正向代理服务器正向代理服务器接收请求并根据配置进行处理如缓存查找、内容过滤等正向代理服务器将处理后的请求转发给目标服务器目标服务器处理请求并将响应返回给正向代理服务器正向代理服务器将响应返回给客户端Nginx2️⃣反向代理反向代理服务器是⼀种网络架构模式其作为Web服务器的前置服务器接收来自客户端的请求并将这些请求转发给后端服务器然后将后端服务器的响应返回给客户端。这种架构模式可以提升网站性能、安全性和可维护性等基本原理反向代理服务器位于客⼾端和Web服务器之间当客户端发起请求时它首先会到达反向代理服务器。反向代理服务器会根据配置的规则将请求转发给后端的Web服务器并将Web服务器的响应返回给客户端。在这个过程中客户端并不知道实际与哪个Web服务器进行了交互它只知道与反向代理服务器进行了通信我们买的云服务器就是在图中右侧的任意一个反向代理服务器的公网IP会转给内部的某个机器 —— 给我们的错觉是有一个公网服务器的IP所以能理解无法绑定公网IP因为真正的IP并没有给到我们举例子代理服务器和NAT路由器往往都具备NAT设备的功能通过NAT设备进行中转完成子网设备和其他子网设备的通信过程。代理服务器看起来和NAT设备有⼀点像。客户端向代理服务器发送请求代理服务器将请求转发给真正要请求的服务器服务器返回结果后代理服务器又把结果回传给客户端代理服务器是最大的中间人对信息进行渲染 就是谷歌的页面了上面的代理客户端和jw服务器几百台部署代理 —— 机场都是有专门的人来做的对于jw服务器我的客户端怎么知道有几百台服务器呢机场会给我一下配置文件——代理服务器的地址代理商就会给你这个配置文件的下载链接我们的主机按这个链接进行配置后就会自动下载远程的服务器的密钥和登录信息 —— 后续就可以访问了对信息进行渲染 就是谷歌的页面了上面的代理客户端和jw服务器几百台部署代理 —— 机场都是有专门的人来做的对于jw服务器我的客户端怎么知道有几百台服务器呢机场会给我一下配置文件——代理服务器的地址代理商就会给你这个配置文件的下载链接我们的主机按这个链接进行配置后就会自动下载远程的服务器的密钥和登录信息 —— 后续就可以访问了写在最后接下来登场的是 IO 模型