前言

在当今数字化时代,远程访问内网资源的需求日益增长,无论是个人开发者测试本地服务,还是企业团队协作部署内部应用,内网穿透技术都成为不可或缺的工具。Nginx 作为高性能的 Web 服务器和反向代理服务器,结合 Frp这一轻量级的内网穿透解决方案,能够高效、安全地将本地服务暴露到公网,实现跨网络的访问与管理。

通过 Nginx 的负载均衡和反向代理能力,配合 Frp 的灵活端口映射与隧道建立,可以构建一套稳定、可扩展的内网穿透方案。本方案适用于需要远程调试、访问私有服务或搭建临时公网测试环境的场景,同时兼顾安全性与易用性。

本文将详细解析 Nginx 与 Frp 的配置流程,帮助读者快速实现内网穿透,并优化访问效率与安全性。

背景:nginx在frps的环境上面,frps为linux环境(centos7.9)

以下内容都会对windows和linux部署frps和frpc,至于nginx只讲部署linux上面

一、frp安装部署(关于linux都是关闭防火墙的哈,以下不再赘述)

先说明一下,frp分为frpc和frps端;
frpc:运行在被穿透的内网设备上,负责与 frps 建立连接,并将内网服务暴露到公网。
frps:运行在具有公网 IP 的服务器上,负责接收 frpc 的连接请求,并将外部请求转发到 frpc。

说明2:下面linux都是以centos7.9为例,Ubuntu或其他版本的centos或其他,配置都一样,区别就是下载包的命令(根据不同系统的下载命令就可以)

1.frps

1.linux上面安装配置frps

下载安装包地址https://github.com/fatedier/frp/releases
选择合适版本的的包(一般选择最新就可以)

或者执行下面命令直接安装
wget -c https://github.com/fatedier/frp/releases/download/v0.64.0/frp_0.64.0_linux_amd64.tar.gz
然后解压到 /usr/local/frps 下(可以根据你自己的需求放到其他位置)
tar -zxvf frp_0.64.0_linux_amd64.tar.gz   #解压文件
mv frp_0.64.0_linux_amd64 /usr/local   #将frp目录移动到/usr/local下
mv /usr/local/frp_0.64.0_linux_amd64 /usr/local/frps   #将frp目录改名成frps

接下来配置;我们进到frps.toml

cd frps
vim frps.toml

#添加以下配置
bindAddr = '0.0.0.0'	#FRP服务端监听的IP地址
bindPort = 7000   #服务端监听端口


vhostHTTPPort = 8080	#HTTP类型的虚拟主机服务端口为8080
vhostHTTPSPort = 8443	#HTTPS类型的虚拟主机服务端口为8443


auth.method = "token"  	#启用Token认证方式,客户端连接服务端时需提供有效Token
auth.token = "xxxxx"	#token密钥,尽量设置复杂一些(frpc也需要用到)


subDomainHost = "xxxx.com"	#这个设置子域名(如你有一个域名为aaa.com,子域名为xxx.aaa.com用于外网直接访问xxx.aaa.com)后面会有示例

webServer.addr = "0.0.0.0"	#FRP内置仪表板的监听地址为0.0.0.0,允许从任意IP访问管理界面。
webServer.port = 8002	#仪表板的Web服务端口为8002,通过浏览器访问此端口可查看FRP运行状态。
webServer.user = "xxx"	#设置仪表板的登录用户名为xxx。
webServer.password  = "xxx"	#设置仪表板的登录密码为xxx。

log.to = "/var/log/frp/frp.log"	#日志输出路径,需确保目录存在且有写入权限。
log.level = "debug"	#日志级别设为debug

:wq保存退出

启动命令:在该目录下执行 frps -c frps.toml

设置开机自启

新建一个frps的系统服务
vim /etc/systemd/system/frps.service
里面复制以下内容(主要下面路径一定是和你安装路径为一致的)
[Unit]
Description=frps
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
ExecStart=/usr/local/frps/frps -c /usr/local/frps/frps.toml   #填写frps的安装目录
Restart=always

[Install]
WantedBy=multi-user.target

:wq 
保存退出

查看各种状态
systemctl enable frps   #开启开机自启动frps服务
systemctl disable frps   #关闭开机自启动frps服务
systemctl start frps   #启动frps服务
systemctl stop frps   #停止frps服务
systemctl status frps   #查看frps服务状态

1.windows上面安装配置frps(配合nssm做成服务)

下载安装包地址https://github.com/fatedier/frp/releases
0.64.0没有windows的,那么我们就选择0.63,根据自己的电脑选择windows arm/amd版本
在这里插入图片描述
下载解压就不多说了,直接修改frps.toml的配置文件
内容的话还是和linux里面基本一致

#添加以下配置
bindAddr = '0.0.0.0'	#FRP服务端监听的IP地址
bindPort = 7000   #服务端监听端口


vhostHTTPPort = 8080	#HTTP类型的虚拟主机服务端口为8080
vhostHTTPSPort = 8443	#HTTPS类型的虚拟主机服务端口为8443


auth.method = "token"  	#启用Token认证方式,客户端连接服务端时需提供有效Token
auth.token = "xxxxx"	#token密钥,尽量设置复杂一些(frpc也需要用到)


subDomainHost = "xxxx.com"	#这个设置子域名(如你有一个域名为aaa.com,子域名为xxx.aaa.com用于外网直接访问xxx.aaa.com)

webServer.addr = "0.0.0.0"	#FRP内置仪表板的监听地址为0.0.0.0,允许从任意IP访问管理界面。
webServer.port = 8002	#仪表板的Web服务端口为8002,通过浏览器访问此端口可查看FRP运行状态。
webServer.user = "xxx"	#设置仪表板的登录用户名为xxx。
webServer.password  = "xxx"	#设置仪表板的登录密码为xxx。

安装nssm
下载地址https://www.nssm.cc/download
解压,在win64目录打开cmd输入命令 nssm install
在这里插入图片描述

就是这个
点击install server在这里插入图片描述
然后在任务管理器,打开 服务 标签找到frps右击启动就可以了
之后若改动的话,修改完frps.toml,去 服务 找到 frps服务 右击重启即可

2.frpc

1.linux上面安装配置frpc
安装步骤和frps一样
或者执行下面命令直接安装
wget -c https://github.com/fatedier/frp/releases/download/v0.64.0/frp_0.64.0_linux_amd64.tar.gz
然后解压到 /usr/local/frpc 下(可以根据你自己的需求放到其他位置)
tar -zxvf frp_0.64.0_linux_amd64.tar.gz   #解压文件
mv frp_0.64.0_linux_amd64 /usr/local   #将frp目录移动到/usr/local下
mv /usr/local/frp_0.64.0_linux_amd64 /usr/local/frpc   #将frp目录改名成frpc
serverAddr = "xxx"	#配置FRP客户端连接的服务器地址
serverPort = 7000	#指定FRP客户端与服务端建立连接的控制端口

auth.method = "token"
auth.token = "xxx" 	#和frps的token一定要一致

#下面是两个个实例,一个tcp,一个http
#先解释以下这个,使用tcp传输也就是其他人能够远程连接,图片在下面,tcp设置不需要在取nginx设置
[[proxies]]
name = "ssh"    #名称(在frp的后台所能看到的名称)
type = "tcp"	#传输协议tcp
localPort = 22	#本机端口号端口号
remotePort = 60002	#代理到frps的端口号

#下面这个是http(写法有好多种,下面是我的写法)另外http还需要nginx做协助,下面会一步一步讲解
[[proxies]]
name = "gitlab" #名称(在frp的后台所能看到的名称)
type = "http"	#传输协议http
localIP = "127.0.0.1"
localPort = 8081	#该服务的端口号
subdomain = "gitlab"	#子域名(这一步有很多种写法,大家可以自己查阅看一下)
=============================================
subdomain = "gitlab"这一步在页面访问为gitlab.xxxx.com:端口
也就是在frps当中写的subDomainHost = "xxxx.com"
即subdomain+subDomainHost+端口
端口的话在下面nginx的server当中会有说明

下面两个图片,第二个gitlab访问页面就为gitlab+subDomainHost+8005(nginx配置的端口)

这是tcp协议
在这里插入图片描述

这是http的在这里插入图片描述

1.windows上面安装配置frpc(配合nssm做成服务)

这个安装步骤和frps都是一样的哈
下载安装包地址https://github.com/fatedier/frp/releases
0.64.0没有windows的,那么我们就选择0.63,根据自己的电脑选择windows arm/amd版本
在这里插入图片描述
下载解压就不多说了,直接修改frpc.toml的配置文件(linux和windows的配置文件一致,所以直接复制linux的配置文件了)

serverAddr = "xxx"	#配置FRP客户端连接的服务器地址
serverPort = 7000	#指定FRP客户端与服务端建立连接的控制端口

auth.method = "token"
auth.token = "xxx" 	#和frps的token一定要一致
#======================注意一下,上面是必须要写的,下面是根据不同需要穿透的内容配置=========
#下面是几个实例
#先解释以下这个,使用tcp传输也就是其他人能够远程连接,图片在下面,tcp设置不需要在取nginx设置
[[proxies]]
name = "ssh"    #名称(在frp的后台所能看到的名称)
type = "tcp"	#传输协议
localPort = 22	#本机端口号端口号
remotePort = 60002	#代理到frps的端口号

#下面这个是http(写法有好多种,下面是我的写法)另外http还需要nginx做协助,下面会一步一步讲解
[[proxies]]
name = "gitlab" #名称(在frp的后台所能看到的名称)
type = "http"	#协议类型
localIP = "127.0.0.1"	#本机ip
localPort = 8081	#该服务的端口号
subdomain = "gitlab"	#子域名(这一步有很多种写法,大家可以自己查阅看一下)
=============================================

安装nssm
下载地址https://www.nssm.cc/download
解压,在win64目录打开cmd输入命令 nssm install
在这里插入图片描述

就是这个

点击install server在这里插入图片描述
然后在任务管理器,打开 服务 标签找到frpc右击启动就可以了
之后若改动的话,修改完frps.toml,去 服务 找到 frpc服务 右击重启即可

3.frp后台

后台地址为你的ip+8002端口

也就是在frps设置的这一条

webServer.port = 8002
仪表板的Web服务端口为8002,通过浏览器访问此端口可查看FRP运行状态。(8002可以改成其他的)

大家看到name列就是在frpc上面的name名称,在这里都能看到;绿色的online代表注册成功正在使用
在这里插入图片描述

二、Nginx安装部署以及配置

1.nginx的安装部署

下面直接开始安装

安装依赖(为编译 Nginx 和启用 SSL 做准备)
sudo yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

下载并编译 Nginx
创建目录
mkdir -p /usr/local/nginx
cd /usr/local/src

下载 Nginx 源码
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0

编译配置(指定安装路径、开启 SSL)
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module

编译并安装
make && make install

好的,此刻nginx已经安装好了

2.nginx自启

设置system服务
vim /etc/systemd/system/nginx.service
[Unit]
Description=nginx-ssl service
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PIDFile=/usr/local/nginx/logs/nginx.pid
Restart=on-failure

[Install]
WantedBy=multi-user.target

:wq保存退出


重新加载服务配置
systemctl daemon-reload


启动并设置自启
systemctl start nginx
systemctl enable nginx

查看状态
systemctl status nginx

重启
systemctl restart nginx-ssl

保存重新生成配置
nginx -s reload

3.nginx配置文件

对应默认的就不多叙述
我们简单说一些nginx.conf文件的server块

在frp里面看到gitlab.xxxxx.com:8005
这归功于nginx的配置
以下为server块
        server {

          listen       8005;	#Nginx 监听 8005 端口
          server_name  gitlab.xxxxx.com;	#匹配域名的xxx的请求

          client_max_body_size 1024m;		#允许客户端最大上传1024m大小文件

          location /testip {
            return 200 "client ip: $remote_addr\n"; 	#直接返回客户端 IP 地址
          }
          location / {
           proxy_pass http://127.0.0.1:8080;   # frps 监听端口
           proxy_set_header Host gitlab.xxxxxxx.com;  # 固定 Host 头
           #proxy_set_header Host $host;
           #设置代理相关头部
           proxy_set_header X-Real-IP $remote_addr;		#传递客户端真实 IP。
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;	#传递客户端真实 IP。
           proxy_set_header X-Forwarded-Proto $scheme;	#传递原始请求协议(HTTP/HTTPS)。
           proxy_set_header X-Forwarded-Port 8005;	#固定为 8005(Nginx 监听端口)。

			#启用 WebSocket 支持:
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
           proxy_read_timeout 86400;
          }
          proxy_redirect ~^http://([^/:]+)(/.*)$ http://$1:8005$2;#代理重定向
       }
    最大特点为复用,配置其他的server块时,直接拿来用就可以,只需要修改server_name和proxy_set_header Host 就可以
    特殊内容需要在修改其他地方
  我们可以看到listen后面写的端口为8005,server_name为gitlab.xxxx.com
  所以我们要访问时需要访问的为gitlab.xxxx.com:8005访问
在这个server块当中,可以设置很多,如重定向,如取消端口,都根据不同内容设置

**有朋友会问为什么端口不写80,写80的话,访问就不需要在加端口了,这个问题在下一条一起讨论**

三、关于使用nginx出现的小问题,若有兄弟了解也可以一起分享一下

http的默认端口为80是在页面
https默认443
那么在server块当中设置
listen       80;
xxxxxx
那么外网就无法访问,只有除80/443之外的端口,外网能正常访问,这也是我配置当中用8005的原因;
如果有知道的朋友可以解答一下,或者互相讨论讨论原因

总结

内网穿透在实际应用当中是一个非常实用的内容,市面上有很多软件,当然也有免费的,但是免费的有一些限制,如带宽大小,隧道数量,流量限制等,想要更多的需求就需要花money开会员。为此frp完全开源免费,高性能,支持多协议,支持自定义配置,跨平台等优点,当然对应的配置也繁琐一些,胜在完全免费,需求有自己说了算。特别在nginx里面的server块,里面需要认真,感兴趣的话可以去研究研究

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐