内网穿透原理和部署教程

前言:本文介绍了内网穿透技术原理及frp工具的部署方法。由于NAT映射表是临时且单向的,外网无法直接访问内网服务。通过部署公网服务器作为中转,frp实现了内网服务的穿透访问。具体步骤包括:下载frp软件包,详细说明了配置文件修改要点和端口开放注意事项,并提供了SSH和Nginx两个实际应用案例,希望能帮助您快速掌握内网穿透的实现方法。

文章目录

内网穿透原理

我们都知道公网无法直接访问内网主机,因为缺乏预先建立的 NAT 映射关系,导致外网请求无法路由到指定内网设备。

1.NAT的工作原理

  • 内网 → 外网(可通)
    当内网主机访问公网服务器时:路由器会记录一条 NAT 映射表,回来时路由器再通过映射表将响应转发给内网主机。
  • 外网 → 内网(默认不通)
    如果公网设备直接尝试访问内网,路由器没有对应的 NAT 映射表(因为内网未主动发起过连接)。路由器不知道应将数据包转发给哪个内网主机,直接丢弃请求(防火墙策略)。

2.关键限制

  • NAT 映射是临时且单向的。
  • 映射表通常在连接关闭后过期(如 TCP 超时后删除)。
  • 外网无法主动创建映射表条目。

那么如果一个服务部署在内网中,我们想要访问呢?比如公司做的私有服务,只有内部员工才能访问,部署在公司内网中。而作为一个公司的员工在家里要完成工作任务需要访问公司内网服务该怎么办?

例如主机A要访问主机C部署的服务:

为了解决这个问题我们需要用到内网穿透技术,原理很简单在中间加一个公网服务器。

让主机C访问公网服务器,这样就有了NAT映射表,只需要在公网服务器上部署一个服务,将公网IP:端口映射到内网主机IP:端口 。主机A访问 公网IP:外部端口 时,路由器自动转发到内网主机。

所以接下来我们要解决的是在公网上部署一个什么样的服务完成该工作呢?这里给大家介绍的是frp。

frp软件下载

frp下载链接

本文讲解的是在linux系统下部署,下载以下版本:

接下来准备xshell连接远程服务器和虚拟机两个终端,并把本地下载的frp_0.58.1_linux_amd64.tar.gz压缩包上传到两个终端,可以直接拖拽、使用指令rz或指令scp

scp指令的使用:

bash 复制代码
scp 压缩包地址 虚拟机登录用户名@虚拟机IP: 要拷贝到的目录

对压缩包解压:

bash 复制代码
tar zxf frp_0.58.1_linux_amd64.tar.gz

打开文件:

  • frps*是服务器,frps.toml是服务器的配置文件。
  • frpc*是客户端,frpc.toml是客户端的配置文件。
  • LICENSE是一个权限许可相关的文件,这里不做关心。

内网穿透部署

以xshell远程连接作为客户去访问内网虚拟机为例。那么我们需要在xshell中启动frps服务器,在虚拟机中启动frpc客户端。

服务器启动:

在此之前需要了解并修改一下配置文件,xshell用vim打开frps.toml配置文件,如下:

bash 复制代码
vim frps.toml

内容如下:

bash 复制代码
bindPort = 7000

这个表示frps服务的端口号,假设这里我们更改为7777

  • 注意1:客户端配置文件里要填充相同的端口才能访问到该服务。
  • 注意2:要保证云服务器的7777端口对外开放。

启动服务:

bash 复制代码
./frps -c frps.toml
  • 注意这里加了-c frps.toml选项,表示按配置文件的配置启动

客户端启动:

同样的在此之前先了解并修改一下配置文件,使用虚拟机打开frpc.toml配置文件,如下:

bash 复制代码
vim frpc.toml

内容如下:

bash 复制代码
serverAddr = "127.0.0.1"
serverPort = 7000

[[proxies]]
name = "test-tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000

serverAddr服务器的IP这个修改成我们的公网服务器,比如我的120.46.0.237servereAddr服务器端口,这里修改成上文我们填写的服务器端口7777

name字段随意填,type是传输层协议类型,localIP是本地服务器IP,如果是在自己主机上部署的服务就不用修改,localport是本地访问的端口号,这里就使用默认的服务端口22,即ssh服务,remotePort是需要映射到公网的端口号,这里我们改为8022

启动客户端:

bash 复制代码
./frpc -c frpc.toml
  • 注意公网服务器需要开放serverPort和remotePort对应的端口。

远程连接xshell

接下来我们打开一个xshell,访问公网120.46.0.237:8022,就能访问到内网虚拟机的ssh服务了。

远程访问nginx

接下来再测试一个服务,在虚拟机上安装一个nginx服务并启动。

下载安装nginx:

bash 复制代码
sudo apt install -y nginx

启动nginx:

bash 复制代码
sudo nginx

查看它所对应的端口:

bash 复制代码
netstat -nltp

结果如下:

此时我们只需要在虚拟机客户端的配置文件再添加一条映射关系:

如下:

bash 复制代码
serverAddr = "120.46.0.237"
serverPort = 7777

[[proxies]]
name = "ssh-service"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 8022

[[proxies]]
name = "http-nginx"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
remotePort = 8080          

测试:物理机打开浏览器访问120.46.0.237:8080,效果如下:

非常感谢您能耐心读完这篇文章。倘若您从中有所收获,还望多多支持呀!