nginx+frp实现内网穿透详细步骤
在当今数字化时代,远程访问内网资源的需求日益增长,无论是个人开发者测试本地服务,还是企业团队协作部署内部应用,内网穿透技术都成为不可或缺的工具。Nginx 作为高性能的 Web 服务器和反向代理服务器,结合 Frp这一轻量级的内网穿透解决方案,能够高效、安全地将本地服务暴露到公网,实现跨网络的访问与管理。通过 Nginx 的负载均衡和反向代理能力,配合 Frp 的灵活端口映射与隧道建立,可以构建一
文章目录
前言
在当今数字化时代,远程访问内网资源的需求日益增长,无论是个人开发者测试本地服务,还是企业团队协作部署内部应用,内网穿透技术都成为不可或缺的工具。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块,里面需要认真,感兴趣的话可以去研究研究
更多推荐



所有评论(0)