目录
🐼内网穿透
✅为什么要有内网穿透?
公网是无法直接访问内网主机的!因为首次访问NAT表是单向的,缺乏预先建立的映射关系,导致外网请求无法路由到指定内网设备,当路由器收到报文的时候,由于不知道将数据包转发给哪个内网主机?路由器说:"你好像也没告诉我要转发给谁啊?我这里没有记录",于是,直接将该报文丢弃了,这就是防火墙策略。所以,如果想让别人直接通过公网来访问内网主机,这里介绍一种策略,内网穿透
✅什么是内网穿透?先说原理:
利用一台具有公网IP的服务器作为"桥梁"或"中继站",通过由内网设备主动发起的、持续的连接,在公网与内网之间建立一条虚拟的数据隧道,从而绕过NAT/防火墙的限制。如图所示,我们需要在具有公网的云服务器上启动一个frps,并在我们内网的主机上启动frpc,通过frps和frpc的配合就将公网IP:端口映射到内网IP:端口,之后我们所有对公网的请求,frps都会帮我们转到内网了。举个例子:假设我们现在内网主机有一个22号端口的ssh服务,我们将它和frps的公网(云服务器)8888端口建立映射,往后如果我们就可以直接拿着公网ip:8888就可以直接访问内网的22号端口服务了。这就好比我们内网的主机就告诉云服务器了:"云服务器啊,你听着,往后所有发给你8888的请求,你都转发给我内网22号端口的进程啊,我已经跟你建立好了NAT映射关系"

✅如何部署/做?
🔸首先我们需要有frp,我们可以从这个连接上下载:
接来下,我们需要准备一个具有公网性质的云服务器和内网主机(这里以虚拟机Ubuntu22.04演示)
我们需要再云服务器上启动frps并配置frps.toml,在虚拟机上启动frpc并配置frpc.toml
🔸先配置云服务器上frps.toml:
首先云服务器上需要获取压缩包,通过rz-E或者scp命令。我们将tar -xzvf 进行解包后,然后修改frps.toml,frps.toml仅有一行配置文件,就是我们内网frpc需要访问frps的端口号,也就是frpc->frps首先需要建立一个关系,frpc和frps本身也是客户端服务器程序,frpc当然需要知道自已请求哪个服务,这里就给frps绑定8888端口号了
当我们**./frps -c frps.toml就能成功将frps.toml的配置文件加载进来并启动**。如果想认识更多frps命令,可以frps -h来参考
🔸接下里我们配置虚拟机的frpc.toml
首先需要把本地的压缩包发给虚拟机,如何做?这里当然可以虚拟机和本地建立共享文件夹,这里以scp命令为例:
bash
scp 压缩包路径 远程主机名@远程放置的路径
scp命令可以很好的帮我们借助网络传输进行文件的传输,具体有很多选项,小伙伴们可以自行查阅。
打开frpc.toml文件
内容如下:
cpp
serverAddr = "你的云服务器的公网IP"
serverPort = 8888 # frps的端口号,本身是网络服务,我们刚刚配置的是8888,也需要保证能够被frpc访问到!保证是公网属性的端口
# 每一个内网的服务,要代理的服务
[[proxies]]
name = "你内网要代理服务的名称"
type = "tcp"
localIP = "127.0.0.1"
localPort = #你内网要代理的端口号
remotePort = # 这个字段就是需要映射到公网的端口号
假设我们现在内网需要两个服务,一个是22号的ssh服务,一个是80号的nginix服务,就可以这样填写:
cpp
serverAddr = "47.108.113.111"
serverPort = 8888 # frps的端口号,(必须公网可达)
# 每一个私有IP的服务,要代理的服务
[[proxies]]
name = "test_ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22 # ssh的
remotePort = 8080 # 这个端口要保证你的公网能够被访问!
[[proxies]]
name = "nginx_server"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80 # 你的内网的服务:nginx的端口
remotePort = 8081 # 这个要端口要保证在公网可以被访问呢
以上述为例:凡是发给公网 47.108.113.111:8080的请求,都会直接发给内网的22号端口的ssh进程!凡是发给公网 47.108.113.111:8081的请求,都会直接发给内网的8081号端口的nginx进程!
frps就好像一个代理服务器一样!
nginx 首页默认 apt 安装之后, 首页是: /var/www/html/XXX(index.nginx-debian.html)
配置好,以./frpc -c frpc.toml 加载配置文件并启动
我们可以看到frps上会启动三个端口号:
如果我们内网修改frpc.toml文件,增加更多的服务,映射到云服务器上不同的端口,就会在云服务器开放一个端口来帮助我们建立公网->内网的端口映射!
如果我们想让会话进行保持,将frpc和frps都作为守护进程在后台运行:
&> /dev/null: 这是重定向操作, 用于将命令的标准输出(stdout) 和标准错误(stderr) 都重定向到/dev/null。 /dev/null 是一个特殊的设备文件, 向它写入的内容都会被丢弃, 读取它则会立即返回文件结束。 因此, 这个操作的作用是忽略命令的所有输出信息
cpp
./frpc -c ./frpc.toml &> /dev/null &
./frps -c ./frps.toml &> /dev/null &
下面,我们可以让远程的小伙伴进行测试,通过在云服务器上新建会话访问47.108.113.111:8080就能操作你的虚拟机,执行命令行!这样就达到了在远程操控你局域网内的主机的效果!我们能拿xhell来操作你内网中的虚拟机了
如图:
通过在网页访问8081就能看到你内网的nginx服务器的前端!
最后,如何验证你的云服务器上的端口是否是可达的,可以被公网访问的,我们可以在cmd使用telnet,如果没有telnet,可以在powershell执行
bash
Test-NetConnection 云服务器IP(公网) -Port 端口号
如果发现链接失败,那么就得去云服务器对应的厂商将开通了,将这个端口暴漏给公网!
比如运行命令是这样:
cpp
PS C:\Users\lenovo> Test-NetConnection 47.108.113.176 -Port 8082
警警告告: TCP connect to (47.108.113.176 : 8082) failed
ComputerName : 47.108.113.176
RemoteAddress : 47.108.113.176
RemotePort : 8082
InterfaceAlias : WLAN
SourceAddress : 172.26.82.138
PingSucceeded : True
PingReplyDetails (RTT) : 32 ms
TcpTestSucceeded : False
🐼内网打洞
我们上面内网穿透的方案是需要借助云服务器公网的,而有没有一种方式,不借助中间的frp,直接让两个内网的主机进行通信呢?有的,有的!借助内网打洞技术。
✅什么是内网打洞?
是一种让两个都在 NAT(内网)后的设备直接建立 P2P 连接的技术,无需通过公网服务器中转数据
✅核心原理:借助NAT进行的特性来记录映射关系!在内网出去的时候建立了NAT映射关系
总体过程如图:

- 首先各自向公网服务器完成本地的单向NAT表连接,完成内网和公网之间的映射关系。
bash
以这个例子:设备B(内网) → NAT路由器 → 公网
IP: 10.0.0.200 IP: 183.12.34.56
端口: 5678 端口: 8765设备A(内网) → NAT路由器 → 公网
IP: 192.168.1.100 IP: 202.96.128.86
端口: 1234 端口: 54321
这个过程就好像内网主机对路由器说:"之后凡是发给你IP:183.12.34.56:8765的消息,你都会帮忙转发给我10.0.0.200:5678"
- 然后由公网服务器转发,获取对端的IP信息,进行交换信息。这样两边的内网都能知道自已要访问的对方是谁了。由于对方不能直接访问自已(外网->内网),但是我可以主动访问对方啊(内网->外网)
接着一方使用对方的IP+port,主动在自已的NAT表建立了映射关系(也就是提前拿着对方的信息在自已的路由器打了个洞),后面对方就能直接访问自已了,把数据"灌进来",另一方同理!
在双方都进去确认之后,之后的通信就无需再借助公网服务器了,而是直接点对点式的进行通信了!
所以内网打洞,"就好像在自已家的洞口打了一个让别人能够灌进来的洞口~"
举个例子:
好的,以下是纯文字叙述:
内网打洞的过程可以用邻居通信的比喻来理解。假设A和B住在不同的小区(内网),每个小区都有大门(NAT路由器)和保安(防火墙)。
A住在小区A(192.168.1.x),门牌号1234(端口1234)。B住在小区B(10.0.0.x),门牌号5678(端口5678)。小区A的大门地址是202.96.128.86,保安亭在54321端口。小区B的大门地址是183.12.34.56,保安亭在8765端口。
第一步是登记。A对自己小区的保安说:"如果有人来找我(1234号),就让他到54321号保安亭找我。"B也做了类似的登记。保安在登记簿上记录:A业主在1234号,对应保安亭54321,目前只允许物业中心(54.32.10.5:3478)访问。
第二步是信息交换。物业中心(公网服务器)告诉A:"B业主在8765号保安亭。"同时告诉B:"A业主在54321号保安亭。"现在双方都知道对方的具体位置了。
第三步是关键的打洞操作。A跑到自己小区门口,对保安说:"我要去B小区(183.12.34.56)的8765号保安亭,麻烦你记住这个地址。"保安更新登记簿,在A的可访客名单中新增"B小区保安亭(183.12.34.56:8765)"。这就是打洞------现在B小区的人可以来找A了。
第四步是双向确认。B也跑到自己小区门口,对保安说:"我要去A小区(202.96.128.86)的54321号保安亭。"B的保安同样更新登记簿,在B的可访客名单中新增"A小区保安亭(202.96.128.86:54321)"。
第五步是直接通信。现在B可以直接去找A:B到A小区保安处说"我找54321号保安亭的A",保安查登记簿发现8765号保安亭的B在允许名单里,于是放行。同样,A也可以直接找B。此后双方就可以直接串门,无需再通过物业中心转达。
整个过程的核心是:通过主动告知自己的保安"我要去对方那里",从而让保安记住对方的地址,允许对方未来回访。这就是内网打洞的本质------不是强行破墙,而是主动开门。
🐼kexue上网
在我们平时上网的时候,一些非法的操作,比如访问www.goole.com都是不行的,这是为啥?
是因为我们内网的主机想要访问公网,都必须经过运营商,因为我们的网络是运营商搭建的,只有运营商的WAN口才能访问公网!这个我们之前已经说过了。
而当运营商经过域名解析,发现你要访问的IP是非法的,直接将你的报文丢弃了。
那么如果kexue上网呢?本质是p过运营商,这里不细谈了,fq是违法的!!!