frp内网穿透与Nginx和平共处共用80/443端口的手把手教程

内网穿透系列文章目录

关于内网穿透的系列文章导航:
篇1:zerotier内网穿透功能简要介绍及简明设置方法
篇2:搭建zerotier moon中转服务器实现虚拟局域网稳定快速互访
篇3:frp内网穿透与Nginx和平共处共用80/443端口的手把手教程(本文)



0.前言

实际上网上(包括本博客)已经有了很多frp的搭建教程,但若把1台具备公网的服务器只拿来作为frp服务器也未免太奢侈了,服务器的主业(比如网站搭建等)不能因噎废食吧。可是网站搭建(不管是Apache还是Nginx)和frp都要占用服务器的80/443端口,如果按常规方法搭建会因端口占用冲突而失败。那么有没有办法让两者共存、一起发挥作用呢?经过一番的搜索和学习(感谢frp的开发大神和stilleshan大佬),终于找到了解决方案,在此对自己在云服务器上同时安装Nginx(lnmp环境)和frp的过程作下记录并期望能够帮助有此需求的网友。

1.准备工作

——1台具备公网的主机或云服务器
——1个或多个已备案的域名(本文以urdomain为例)
——1台需要内网穿透的网络设备(比如OpenWrt路由器、Nas……)

2.Nginx网络环境搭设详细步骤

本文以lnmp.org提供的一键安装包在腾讯云的轻量云服务器中搭建为例进行介绍,大家也可以参照笔者之前写过的一篇博文《利用lnmp一键安装包配置自动更新的免费SSL证书》

2.1.生成一键自动安装命令行

lnmp一键安装包无人值守命令生成工具页面选择你的环境配置参数(包括root账户密码、管理员邮箱等敏感信息)后点击【生成】按钮,将生成无人值守全自动安装命令行。
在这里插入图片描述
点击【生成】按钮后生成的命令类似下面的样子(或者直接复制后修改有关参数即可):
wget http://soft.vpser.net/lnmp/lnmp1.8.tar.gz -cO lnmp1.8.tar.gz && tar zxf lnmp1.8.tar.gz && cd lnmp1.8 && LNMP_Auto=“y” DBSelect=“8” DB_Root_Password=“lnmp.org” InstallInnodb=“y” PHPSelect=“7” SelectMalloc=“1” ServerAdmin=“admin@urdomain.com” ./install.sh lnmp
表示要安装lnmp1.8,数据库是MariaDB 10.1、root密码lnmp.org、PHP版本7.1

2.2.在云服务器中安装lnmp

小技巧:为了避免安装过程中网络掉线或不小心关闭ssh客户端造成lnmp安装中断,强烈建议在云服务器中事先安装并运行screen命令(详细操作如下:)
——apt-get install screen(ubuntu系统,若是centos系统用yum install screen)
——screen -S lnmp(创建screen会话,再运行lnmp安装脚本)
——ssh到云服务器,复制粘贴上一步生成的无人值守安装命令即可自动部署lnmp网站环境(如果中途ssh客户端网络掉线,可以重新连接SSH,再执行 screen -r lnmp 就会看到你的lnmp安装进程。),此时在浏览器中输入云服务器ip即可展示其导航页(如下图所示:)
在这里插入图片描述

2.3.在云服务器中为你的域名申请自动续期的ssl免费证书

提示tips:
要在国内服务器上开启域名访问,必须要对域名进行备案。为此我也在腾讯云上购买了1个域名(实际上是在dnspod.cn中进行管理)并进行了备案,所以下面的教程以国内版dnspod解析、并以域名DNS服务商API方式申请SSL证书为例。

2.3.1.获取API密钥

进入dnspod域名管理界面,右上角【我的账号】→【API密钥】→【DNSPod Token】→【创建密钥】,务必记住【ID】及其对应的【Token】值(明文只出现一次提示,找个地方妥善保存好,后续要用到)
在这里插入图片描述
在这里插入图片描述

2.3.2.导出前述api信息:

本文以国内dnspod为例,其它域名解析商的用法可参照acme开发者说明文档修改。
ssh进入云服务器
export DP_Id=“234567”【上图中的"ID"信息】
export DP_Key=“s7b66456***46589”【上图中的"Token"信息】

2.3.3.为你的主域名创建ssl证书并生成网站

lnmp dnsssl dp
按提示输入信息即可(忘了截图,借用我另一篇博文的截图,将图中xya.in修改为你的域名比如urdomain.com即可——特别要注意的是:如果要生成通配符/泛域名SSL证书,输入其他域名时务必输入==*.urdomain.com==,不要输入www.urdomain.com 的域名,否则将生成失败!!!)
在这里插入图片描述
按上图注释输入域名、添加更多域名(多个域名空格隔开,如 *.lnmp.org *.test.lnmp.org)、网站目录、是否添加伪静态、是否启用日志等选项后,提示"Let’s Encrypt SSL Certificate create successfully."即表示操作成功,此时在浏览器中输入“https://urdomain.com”即可显示绿色的小绿锁了。
——为你的域名生成的ssl证书保存在/usr/local/nginx/conf/ssl/urdomain.com/目录中。
——你的域名对应的网站目录为/home/wwwroot/urdomain.com,在此目录中添加网页文件即可创建你的网站了。

3.安装并配置frps服务

3.1.安装frps服务

为了简化操作,为最终选择了stilleshan大佬编写的一键脚本,该脚本自动识别服务器的cpu类型和操作系统类型,从而自动下载相应的frps安装包,并定期更新,以保持与frp开发大神fatedier的更新脚步。且安装完毕后,会将frps自动设置系统服务随机启动,免去小白手工添加的烦恼。
ssh进入云服务器,粘贴如下命令却即可:
wget https://raw.githubusercontent.com/stilleshan/frps/master/frps_linux_install.sh && chmod +x frps_linux_install.sh && ./frps_linux_install.sh
如果是国内服务器,用如下脚本:
wget https://gitee.com/stilleshan/frps/raw/master/frps_linux_install.sh && chmod +x frps_linux_install.sh && ./frps_linux_install.sh(最新的已修改如下:)
wget https://github.ioiox.com/stilleshan/frps/raw/branch/master/frps_linux_install.sh && chmod +x frps_linux_install.sh && ./frps_linux_install.sh

3.2.配置frps服务

只需要修改frps配置文件frps.ini即可。按前述一键脚本安装后,缺省的frps安装目录为/usr/local/frp,ssh进入该目录,按需修改即可(常规配置只需修改相应的开放端口、管理账号密码、授权token即可,但牵涉到要与Nginx共存,在下一节中详述)

3.3.frps常用管理命令

按前述一键脚本安装完毕后,可以用如下命令进行frps服务的相关操作(若以root身份实施登录,则省去sudo):
sudo systemctl start frps #启动服务
sudo systemctl enable frps #开机自启
sudo systemctl status frps #状态查询
sudo systemctl restart frps #重启服务
sudo systemctl stop frps #停止服务

4.配置frps与Nginx共存

按前述操作后,frps是无法正确工作的,原因很简单,frps和Nginx都要同时使用端口80/443,会产生冲突而导致frps不能正常使用的,因为Nginx已提前接管80/443端口,所以是可以正常访问的!
所以,我们的解决思路是利用Nginx反向代理的特点,将frps服务端口修改为非80/443端口,在Nginx配置中单独增加一个frps的配置文件,满足条件的就交由fprs服务接管,从而你实现转发的功能。

4.1.首先了解一下Nginx的配置文件结构

按第2步骤安装好lnmp环境后,Nginx的配置文件为:/usr/local/nginx/conf/nginx.conf文件,打开它翻页到最后,可以看这样的结构:
在这里插入图片描述
不难看出:该配置文件仅对该云服务器的默认网站(比如通过ip访问的网站)进行了配置,其他网站通过include vhost/*.conf这一语句即可将/usr/local/nginx/conf/vhost/目录下的所有.conf配置文件(这些配置文件可通过lnmp vhost add命令自动生成)囊括。lnmp vhost add命令添加网站时可以添加urdomain.com之外的其它域名(前提是要解析到本云服务器上),也可以添加urdomain.com的子域名。

4.2.实现途径

——假设我要实现的目标为(以只绑定1个域名urdomain为例):通过lnmp添加的网站及其指定的对应子域名(比如urdomain.com、www.urdomain.com、blog.urdomain.com……等等)指向云服务器的对应网站,而其它未指定在云服务器中建站的子域名(比如访问群晖的qunhui.urdomain.com、访问UnRaid的unraid.urdomain.com……也就是除云服务器主网站域名、以lnmp vhost add方式增加网站绑定的域名之外的*.urdomain.com域名)均由frps接管

4.2.1.修改frps.ini文件

与常规设置不同的是要修改vhost_http_port和vhost_https_port为非80和443端口,比如修改为780和7443(如下图所示:)
在这里插入图片描述

4.2.2.添加frps.conf配置文件

在frps安装目录/usr/local/frp/目录下新建一个frps.conf配置文件,参照如下例子(也是来自stilleshan大佬的有关教程)修改成你需要的配置(urdomain.com改为你自己的域名,端口780改为上一步设置的vhost_http_port端口置):

server {
 listen 80;
 server_name *.urdomain.com;
 location / {
 proxy_pass http://127.0.0.1:780;
 proxy_redirect http://$host/ http://$http_host/;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header Host $host;
 }
}
server {
 listen 443 ssl http2;
 server_name *.urdomain.com;
 ssl_certificate /usr/local/nginx/conf/ssl/urdomain.com/fullchain.cer;
 ssl_certificate_key /usr/local/nginx/conf/ssl/urdomain.com/urdomain.com.key;
 client_max_body_size 50m; 
 client_body_buffer_size 256k;
 client_header_timeout 3m;
 client_body_timeout 3m;
 send_timeout 3m;
 proxy_connect_timeout 300s; 
 proxy_read_timeout 300s; 
 proxy_send_timeout 300s;
 proxy_buffer_size 64k; 
 proxy_buffers 4 32k; 
 proxy_busy_buffers_size 64k;
 proxy_temp_file_write_size 64k; 
 proxy_ignore_client_abort on; 
 location / {
 proxy_pass http://127.0.0.1:780;
 proxy_redirect https://$host/ https://$http_host/;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_ssl_server_name on;
 proxy_set_header Host $host;
 }
}

或者可以写成如下样子(这样就只接受https加密方式访问):

server {
 listen 80;
 server_name *.yourdomain.com;
 return 301 https://$host$request_uri;
}
server {
 listen 443 ssl http2;
 server_name *.urdomain.com;
 ssl_certificate /usr/local/nginx/conf/ssl/urdomain.com/fullchain.cer;
 ssl_certificate_key /usr/local/nginx/conf/ssl/urdomain.com/urdomain.com.key;
 client_max_body_size 50m; 
 client_body_buffer_size 256k;
 client_header_timeout 3m;
 client_body_timeout 3m;
 send_timeout 3m;
 proxy_connect_timeout 300s; 
 proxy_read_timeout 300s; 
 proxy_send_timeout 300s;
 proxy_buffer_size 64k; 
 proxy_buffers 4 32k; 
 proxy_busy_buffers_size 64k;
 proxy_temp_file_write_size 64k; 
 proxy_ignore_client_abort on; 
 location / {
 proxy_pass http://127.0.0.1:780;
 proxy_redirect off;
 proxy_set_header Host $host:80;
 proxy_ssl_server_name on;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forwarded-Proto $scheme;
 }
}

4.2.3.修改Nginx.conf配置文件

即将前面新建的frps.conf配置文件加入Nginx.conf配置文件(参照下图设置:)
在这里插入图片描述
Tips:将frps.conf写在*.conf后面的好处在于,如果后续还想在云服务器中添加另外的网站(对应新的子域名),只需要再次运行lnmp vhost add即可。

4.2.4.修改主域名.conf配置文件

还记得在【为主域名创建ssl证书并生成网站】这一步骤中,我吗为了生成泛域名证书,在填写更多域名时选择了填写*.urdomain.com的方式,其同时创建了urdomain.com网站,并在网站配置文件urdomain.com.conf中将域名也加入了*.urdomain.com字样(如下图:)
在这里插入图片描述
这样子设置相当于把所有的urdomain均绑定于urdomain.com主网站,如果不作别的站或frp穿透是没有问题的,但我们的frps.conf也将域名添加了*.urdomain.com,所以在Nginx服务启动的时候是会报错的!所以我们把urdomain.conf中的域名改一下,让其只绑定urdomain.com根域名和www.urdomain.com(如下图所示:注意80端口和443端口都需要修改
在这里插入图片描述

5.在云服务器中放行相关端口

根据前述可知,与frps服务有关的端口为780、7443、7000、7001、7500等(如果你的设置不一样,对照调整即可),需要在服务器的防火墙中放行才能正常穿透。我的腾讯云轻量云服务器的设置示意如下:【轻量云服务器】→【服务器】→【更多】→【管理】→【防火墙】→【添加规则】
在这里插入图片描述

在这里插入图片描述

6.内网frpc设置

假设你的UnRaid的局域网ip为192.168.1.11,则按如下设置frpc.ini(token等信息需要与frps.ini中的设置一致)后,即可以unraid.urdomain访问到你的UnRaid登录界面
[common]
server_addr = urdomain.com
server_port = 7000
token=12345678

[unraid]
type = http
local_ip = 192.168.1.11
local_port = 80
sundomain=unraid

7.Have fun!

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

engineerlzk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值