使用内网穿透给本地项目部署域名跟 https
内网穿透可以把一台非公网 IP 的机子暴露给外网,实现外网在任何地方都能访问到这台机子部署的 web。
一般用于开发期还没部署到服务器或者需要频繁修改,又想给客户测试时临时使用。
# 目标实现
在任意网络输入 https://dev.frp.xxx.com
来访问运行在本地 5000 端口的 web 项目。
# 所需工具
- 一台有公网 IP 的 VPS (Ubuntu)
- 域名一个
- SSL 证书 (opens new window)
- frp (opens new window)
- supervisor
- nginx
# 步骤(VPS 端)
# 安装 frp
查看系统内核版本,然后在 frp 仓库的releases (opens new window)下载对应的版本
uname -a
这里是 64 位,就下载 frp_0.29.0_linux_amd64.tar.gz
PS:如果权限不够,请自行加
sudo
# 把软件放在/opt 目录下
cd /opt/
wget https://github.com/fatedier/frp/releases/download/v0.29.0/frp_0.29.0_linux_amd64.tar.gz
# 解压
tar -zvxf frp_0.29.0_linux_amd64.tar.gz
# 重命名,方便找到
mv frp_0.29.0_linux_amd64 ./frp
2
3
4
5
6
7
8
9
修改配置文件 frps.ini
PS:没有
vim
的需要先安装apt-get install vim
在/opt/frp/目录下编辑 frps.ini
cd /opt/frp/
vim frps.ini
2
# frps.ini
[common]
server_addr = 127.0.0.1
server_port = 8000
vhost_http_port = 8080
subdomain_host = frp.xxx.com
2
3
4
5
6
7
subdomain_host
是你的域名,这里在域名加 frp 是为了避免污染你的二级域名,之后会申请 frp.xxx.com
的泛域名证书(因为一级域名似乎没法免费申请泛域名证书),方便在 PC 端可以直接配置多个 xxx.frp.xxx.com
这种三级域名的 https。
# 安装 supervisor
使用 supervisor 来让 frp 开机自启
apt-get install supervisor
创建 supervisor frps 配置文件 在 /etc/supervisor/conf.d 创建 frp.conf
# frp.conf
[program:frp]
command = /opt/frp/frps -c /opt/frp/frps.ini
autostart = true
2
3
4
5
重启 supervisor,查看状态
# 重启 supervisor
sudo systemctl restart supervisor
# 查看 supervisor 运行状态
sudo supervisorctl status
2
3
4
如果显示 frp RUNNING 就是正常运行了
# 安装 Nginx
apt-get install nginx
# 申请免费的 SSL 证书
- 到这网站申请泛域名证书freessl.cn (opens new window);
- 在输入框输入你刚刚配置的域名,比如:
*.frp.xxx.com
,选择 Let's Encrypt V2; - 按照提示流程申请,申请后需要校验域名的解析,才会核发,需要在域名供应商那里按提示添加
TXT
解析即可,同时也要将*.frp.xxx.com
泛解析到你的 vps 上; - 申请成功之后,在 KeyManager 软件工具那里导出 nginx 版本的证书。
将导出来的的证书放在 nginx 的目录下,分别是:
/etc/nginx/ssl/*.frp.xxx.com/*.frp.xxx.com_chain.crt
/etc/nginx/ssl/*.frp.xxx.com/*.frp.xxx.com_key.key
# 配置 Nginx
在/etc/nginx/conf.d 目录下添加 frp.conf 文件:
cd /etc/nginx/conf.d
vim frp.conf
2
# frp.conf
server {
listen 80;
server_name *.frp.xxx.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header X-Powered-By;
}
}
server {
listen 443;
server_name *.frp.xxx.com;
ssl on;
root html;
index index.html index.htm;
ssl_certificate ssl/*.frp.xxx.com/*.frp.xxx.com_chain.crt;
ssl_certificate_key ssl/*.frp.xxx.com/*.frp.xxx.com_key.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header X-Powered-By;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
保存后重启 nginx
nginx -s reload
如果没有报错,则配置是正确的
这个配置主要用于添加泛域名证书,顺便把 8080 端口反向代理 80。
不反向代理访问 web 会是这样的:https://xxx.frp.xxx.com:8080
而反向代理访问 web 会是这样的:https://xxx.frp.xxx.com
到此,vps 端就全部配置好了
# 本地 PC 端配置
本地也需要下载对应的 frp 客户端软件,在 release 下载 windows 版本的即可。
下载解压后,修改里面的 frpc.ini 的配置:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 8000
[web001]
type = http
local_ip = 127.0.0.1
local_port = 5000
subdomain = dev
[web002]
type = http
local_ip = 127.0.0.1
local_port = 5050
subdomain = test
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server_addr
是你的服务器 ipserver_port
是对应服务器端配置的端口subdomain
是三级域名,即dev.frp.xxx.com
type
虽然可以设置为https
,但是证书需要放在本地,通用性不强,换了其他电脑,还需要重新拷一份 ssl 证书。
保存后,启动 cmd 或者 PowerShell 在软件目录直接运行:
PS D:\Softwares\frp> .\frpc.exe
如果显示 start proxy success
,则表示连接成功,已经实现内网穿透了,可以通过外网输入 https://dev.frp.xxx.com
或者 https://test.frp.xxx.com
来访问运行在本地 5000 或者 5050 端口的 web。