目录
[1.3 NAT的缺陷](#1.3 NAT的缺陷)
[2.2 反向代理](#2.2 反向代理)
[2.3 NAT和代理服务器](#2.3 NAT和代理服务器)
[3.DNS(Domain Name System)仅了解](#3.DNS(Domain Name System)仅了解)
1.NAT
NAT技术当前解决IP地址不够用的主要手段,是路由器的一个重要功能;
NAT能够将私有IP对外通信时转为全局IP.也就是就是一种将私有IP和全局IP相互转化的技术方法:
很多学校,家庭,公司内部采用每个终端设置私有IP,而在路由器或必要的服务器上设置全局IP;
全局IP要求唯一,但是私有IP不需要;在不同的局域网中出现相同的私有IP是完全不影响的;
1.1转换过程
NAT路由器将源地址从10.0.0.10(私网ip)替换成全局的IP 202.244.174.37(nat路由器对外的wan口公网ip);
NAT路由器收到外部的数据时,又会把目标IP从202.244.174.37替换回10.0.0.10;
在NAT路由器内部,有一张自动生成的,用于地址转换的表:
当10.0.0.10第一次向163.221.120.9(假设某个公网iP)发送数据时就会生成表中的映射关系;
1.2NAPT
那么问题来了,如果局域网内,有多个主机都访问同一个外网服务器,那么对于服务器返回的数据中,目的IP都是相同的.那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候NAPT来解决这个问题了。使用IP+port来建立这个关联关系
NAT地址转换表。私网ip+port在子网内是唯一的,而公网ip+port在整个网络世界里也是唯一的,因此,将2个具有唯一性的键值进行关联(互为键值),就能做到私-公&&公-私的转换了。
这种关联关系也是由NAT路由器自动维护的.例如在TCP的情况下,建立连接时,就会生成这个表项;在断开连接后,就会删除这个表项
1.3 NAT的缺陷
由于NAT依赖这个转换表,所以有诸多限制:
无法从NAT外部向内部服务器建立连接;(必须先由内网向外网发送一次请求,建立了表项之后,才能建立连接)
转换表的生成和销毁都需要额外开销;
通信过程中一旦NAT设备异常,即使存在热备,所有的TCP连接也都会断开;
2.代理服务器
2.1正向代理
2.1.1概念
正向代理(ForwardProxy)是一种常见的网络代理方式,它位于客户端和目标服务器之间,代表客户端向目标服务器发送请求。正向代理服务器接收客户端的请求,然后将请求转发给目标服务器,最后将目标服务器的响应返回给客户端。通过这种方式,正向代理可以实现多种功能,如提高访问速度、隐藏客户端身份、实施访问控制等。
2.1.2工作原理
客户端将请求发送给正向代理服务器。
正向代理服务器接收请求,并根据配置进行处理,如缓存查找、内容过滤等。
正向代理服务器将处理后的请求转发给目标服务器。
目标服务器处理请求,并将响应返回给正向代理服务器。
正向代理服务器将响应返回给客户端。
也用到了Nginx
2.1.3功能特点
缓存功能 :正向代理服务器可以缓存经常访问的资源,当客户端再次请求这些资源时,可以直接从缓存中获取,提高访问速度。
内容过滤 :正向代理可以根据预设的规则对请求或响应进行过滤,如屏蔽广告、阻止恶意网站等。
访问控制 :通过正向代理,可以实现对特定网站的访问控制,如限制员工在工作时间访问娱乐网站。
隐藏客户端身份 :正向代理可以隐藏客户端的真实IP地址,保护客户端的隐私。
负载均衡:在多个目标服务器之间分配客户端请求,提高系统的可扩展性和可靠性。
2.1.4应用场景
企业网络管理 :企业可以通过正向代理实现对员工网络访问的管理和控制,确保员工在工作时间内专注于工作,避免访问不良网站或泄露公司机密。
公共网络环境 :在公共场所如图书馆、学校等提供的网络环境中,通过正向代理可以实现对网络资源的合理分配和管理,确保网络使用的公平性和安全性。
内容过滤与保护 :家长可以通过设置正向代理来过滤不良内容,保护孩子免受网络上的不良信息影响。
提高访问速度 :对于经常访问的网站或资源,正向代理可以通过缓存机制提高访问速度,减少网络延迟。
跨境电商与海外访问:对于跨境电商或需要访问海外资源的企业和个人,正向代理可以帮助他们突破网络限制,顺畅地访问海外网站和资源。
2.2 反向代理
2.2.1概述
反向代理服务器是一种网络架构模式,其作为Web服务器的前置服务器,接收来自客户端的请求,并将这些请求转发给后端服务器,然后将后端服务器的响应返回给客户端。这种架构模式可以提升网站性能、安全性和可维护性等
2.2.2基本原理
反向代理服务器位于客户端和Web服务器之间,当客户端发起请求时,它首先会到达反向代理服务器。反向代理服务器会根据配置的规则将请求转发给后端的Web服务器,并将Web服务器的响应返回给客户端。在这个过程中,客户端并不知道实际与哪个Web服务器进行了交互,它只知道与反向代理服务器进行了通信。
2.2.3应用场景
负载均衡 :反向代理服务器可以根据配置的负载均衡策略,将客户端的请求分发到多个后端服务器上,以实现负载均衡。这有助于提升网站的整体性能和响应速度,特别是在高并发场景下。
安全保护 :反向代理服务器可以隐藏后端Web服务器的真实IP地址,降低其被直接攻击的风险。同时,它还可以配置防火墙、访问控制列表(ACL)等安全策略,对客户端的请求进行过滤和限制,以保护后端服务器的安全。
缓存加速 :反向代理服务器可以缓存后端Web服务器的响应内容,对于重复的请求,它可以直接从缓存中返回响应,而无需再次向后端服务器发起请求。这可以大大减少后端服务器的负载,提升网站的响应速度。
内容过滤和重写 :反向代理服务器可以根据配置的规则对客户端的请求进行过滤和重写,例如添加或删除请求头、修改请求路径等。这有助于实现一些特定的业务需求,如URL重写、用户认证等。
动静分离 :在大型网站中,通常需要将静态资源和动态资源分开处理。通过将静态资源部署在反向代理服务器上,可以直接从反向代理服务器返回静态资源的响应,而无需再次向后端服务器发起请求。这可以大大提升静态资源的访问速度。CDN(ContentDeliveryNetwork,内容分发网络)就是采用了反向代理的原理
2.3 NAT和代理服务器
路由器往往都具备NAT设备的功能,通过NAT设备进行中转,完成子网设备和其他子网设备的通信过程
代理服务器看起来和NAT设备有一点像。客户端向代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器;服务器返回结果后,代理服务器又把结果回传给客户端。
区别在于:从应用上讲,NAT设备是网络基础设备之一,解决的是IP不足的问题;代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙,另外像迅游这样的加速器,也是使用代理服务器。
从底层实现上讲,NAT是工作在网络层,直接对IP地址进行替换,代理服务器往往工作在应用层。
从使用范围上讲,NAT一般在局域网的出口部署,代理服务器可以在局域网做,也可以在广域网做,也可以跨网
从部署位置上看,NAT一般集成在防火墙,路由器等硬件设备上,代理服务器则是一个软件程序,需要部署在服务器上
正向代理用于请求的转发(例如借助代理绕过反爬虫)
反向代理往往作为一个缓存
代理服务器的典型应用:
翻墙:广域网中的代理
负载均衡:局域网中的代理
3.DNS(Domain Name System)仅了解
DNS是一整套从域名映射到IP的系统
3.1背景
TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序.但是IP地址不方便记忆
于是人们发明了一种叫主机名的东西,是一个字符串,并且使用hosts文件来描述主机名和IP地址的关系。
最初,通过互连网信息中心(SRI-NIC)来管理这个hosts文件的。
如果一个新计算机要接入网络,或者某个计算机IP变更,都需要到信息中心申请变更hosts文件
其他计算机也需要定期下载更新新版本的hosts文件才能正确上网
这样就太麻烦了,于是产生了DNS系统。
一个组织的系统管理机构,维护系统内的每个主机的IP和主机名的对应关系
如果新计算机接入网络,将这个信息注册到数据库中;
用户输入域名的时候,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址。
至今,我们的计算机上仍然保留了hosts文件。在域名解析的过程中仍然会优先查找hosts文件的内容
3.2域名介绍
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称(比如www.baidu.com)
域名之间用.连接
com :一级域名.表示这是一个企业域名,同级的还有"net"(网络提供商),"org"(非盈利组织)等
baidu :二级域名,公司名.
www:只是一种习惯用法,之前人们在使用域名时,往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式,来表示主机支持的协议。
3.3域名解析过程(仅了解)
图里的权威服务器,也可以理解为二级域名。
baidu.com服务器是个baidu的DNS服务器,通过查询,可以获得baidu注册的域名对应的ip地址。
上面的过程用的是udp协议,因为不需要建立连接,内容也比较少。
如上图所示,域名结构是树状结构,树的最顶端代表根服务器,根的下一层就是由我们所熟知的.com、.net等通用域和.cn、.uk等国家域组成,称为顶级域。网上注册的域名基本都是二级域名,比如http://baidu.com、http://taobao.com等等二级域名,它们基本上是归企业和运维人员管理。之后就是三级或者四级域名,这里就不说了。
3.4dig分析dns过程
安装:
bashcentos: yum install bind-utlis Ubuntu: apt install dnsutils第一行是dig指令的版本号。
第二行到下一个空行前是服务器返回的详情,重要的是status参数,NOERROR表示查询成功
QUESTIONSECTION表示要查询的域名是什么
ANSWERSECTION表示查询结果是什么。这个结果先将www.baidu.com查询成了
www.a.shifen.com,再将www.a.shifen.com查询成了两个ip地址。
最下面是一些结果统计,包含查询时间和DNS服务器的地址等
更多用法参考:
掌握 DNS 查询技巧,dig 命令基本用法 - 系统极客
关于DNS缓存:在Windows系统中,可以使用ipconfig /displaydns 命令来查看系统级别的DNS缓存
浏览器的缓存
关于在浏览器里输入url会经历的一切:在浏览器上输入一个URL后发生了什么?_浏览器输入url后发生了什么-CSDN博客
4.ICMP仅了解
ICMP协议是一个网络层协议,即互联网 控制 消息 协议Internet Control Message Protocol
一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输。如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。
4.1ICMP功能
ICMP正是提供这种功能的协议;ICMP主要功能包括:
确认IP包是否成功到达目标地址.
通知在发送过程中IP包被丢弃的原因
ICMP也是基于IP协议工作的.但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议;ICMP和IP的在报文上的关系,可以参考ARP和mac帧的。
ICMP只能搭配IPv4使用.如果是IPv6的情况下,需要使用ICMPv6;
4.2ICMP的报文格式
下图为AI生成:
ICMP大概分为两类报文:
一类是通知出错原因
一类是用于诊断查询
类型(十进制数) 内容(ICMP 报文类型) 0 回送应答(Echo Reply) 3 目标不可达(Destination Unreachable) 4 原点抑制(Source Quench) 5 重定向或改变路由(Redirect) 8 回送请求(Echo Request) 9 路由器公告(Router Advertisement) 10 路由器请求(Router Solicitation) 11 超时(Time Exceeded) 17 地址子网请求(Address Mask Request) 18 地址子网应答(Address Mask Reply)
4.3ping命令
注意,此处 ping的是域名,而不是url,一个域名可以通过DNS解析成IP地址.
ping命令不光能验证网络的连通性。同时也会统计响应时间和TTL(IP包中的Time To Live,生存周期)。
ping命令会先发送一个ICMP Echo Request给对端;
对端接收到之后,会返回一个ICMP Echo Reply;
telnet是23端口,ssh是22端口,那么ping是什么端口?答案就是ping命令基于ICMP,是在网络层。而端口号,是传输层的内容。在ICMP中根本就不关注端口号这样的信息.
注意,可以看到是一个10.54.165.214发送的超时信息,也就是说,10.54.165.214是事故发生节点路径上距离事故发生节点最近的主机(可能是路由器)。
4.4traceroute命令
也是基于ICMP协议实现,能够打印出可执行程序主机,一直到目标主机之前经历多少路由器
5.内网穿透
其实就是说怎么让2个身处不同内网的主机进行通信。原理就是,依靠一台有公网ip的服务器做代理中转。假设让A和B连接,靠C中转,此时B先和C建立TCP连接(UDP也可以,本质上是IP),B内网的路由器就有相应NAPT,然后让A和C也建立TCP连接。此时,只要配置要规则,比如,A想要访问B,就只需要把请求发给C的固定端口服务中,然后C把请求按照配置好的规则,转发给B的某个固定端口服务中,然后B将响应发给C的某个固定端口中,然后C把响应转发给A的某个固定端口中即可。
6.内网打洞
内网打洞是穿透的特殊情况。前面我们说了,穿透是让一台有公网ip的服务器做中转代理,那可不可以绕开这个服务器,直接访问对方吗?可以。
此时仍然需要一台有公网ip的服务器,A、B都先跟C建立tcp连接(UDP也可以),相应的网络NAT地址转换表,都建立好映射。此时只要让C把B的公网IP+port(即B的内网一直nat转化最后的出口路由器的wan口公网ip以及port)发给A,同理把A的发给B。之后,A访问B,只需要直接访问B的公网ip+port就能跟B进行通信,同理,B也能访问A。这样做可以降低延迟(少了中转),但是缺点在于,运营商不一定支持,很可能会拦截打洞。
7.手动部署并测试内网穿透
首先我们去Release v0.58.1 · fatedier/frp
下载一个frp(选linux amd版本)。(github上的内容,连不上就开加速器,Watt Toolkit免费连github)
将frp传到一台云服务器里。
如图所示:
这个是成品,s是server,c是client
我们把frps.toml里的内容改成如下:默认的7000也行,看你自己。
启动的时候,
-c是指定配置文件,否则就是默认的7000端口,我云服务器的8888端口安全规则开了,我懒得改7000了。
在我们自己的本地电脑上开一台linux虚拟机。
同样将frp导入并解压。
改frpc.toml
bashserverAddr = "120.55.114.44" 这个是云服务器ip serverPort = 8888 是刚刚云服务器frps.toml里bind的端口号,这个端口号是云服务器和本地linux客户端进行建立连接用的。 [[proxies]] name = "ssh-tcp" 名称,方便区分 type = "tcp" 指定代理类型,就是说服务用的协议 localIP = "127.0.0.1" 本地IP localPort = 22 内网服务监听的端口,比如我们这里测试的是ssh登录,所以是22 remotePort = 8887 其他人未来可以通过这个端口访问我们的本地的22,也就是说8887端口会映射到22号端口,即外网访问云服务器的8887端口,其请求会传给本地这个linux客户端的22端口,响应也是类似。就是说,frpc客户端利用8888端口跟frps服务端建立tcp连接,同时告诉服务端,让服务端再建立一个监听8887端口的tcp连接,之后只要有访问服务端的8887端口,都会被转发给frpc客户端的22端口,而且客户端可以多个,服务端相应的建立多个tcp连接。
最后用xshell连接,其实用什么无所谓,你windows的cmd也可以。
注意,ssh连接是要输入用户名、密码的。
如图,我们用云服务器的8887端口进行了ssh登录,登录的主机是我本地的linux虚拟机。
接下来,我们测试nginx服务先让云服务器和linux虚拟机都结束frp服务
虚拟机安装nginx
bashsudo apt install -y nginx安装完之后默认就启动了,如果没启动就执行
bashsudo systemctl status nginx 这个是检查nginx状态的,active表示启动了 sudo nginx 就是启动nginx默认,启动之后,我们在虚拟机里进行如下操作:
nginx首页默认apt安装之后,首页是:/var/www/html/xxx(index.nginx-debian.html)
甚至,我们自己的本地电脑浏览器也可以访问
修改虚拟机的frpc.toml文件,保留ssh,新增http
然后启动服务端和客户端
此时,我们直接用本地的电脑访问云服务器的8886端口,就可以看到这个nginx的默认web首页了。
为了测试真正的外网,我用手机流量进行进行了访问。
注意,客户端和服务端都可以这样后台运行。nohup ./frpc -c ./frpc.toml &> /dev/null &
nohup ./frps -c ./frps.toml &> /dev/null &
&>/dev/null :这是重定向操作,用于将命令的标准输出(stdout)和标准错误(stderr)都
重定向到/dev/null。/dev/null是一个特殊的设备文件,向它写入的内容都会被丢弃,读
取它则会立即返回文件结束。因此,这个操作的作用是忽略命令的所有输出信息。


最初,通过互连网信息中心(SRI-NIC)来管理这个hosts文件的。









注意,可以看到是一个10.54.165.214发送的超时信息,也就是说,10.54.165.214是事故发生节点路径上距离事故发生节点最近的主机(可能是路由器)。
















