使用内网穿透给本地项目部署域名跟 https

2019/9/4 LinuxFrp

内网穿透可以把一台非公网 IP 的机子暴露给外网,实现外网在任何地方都能访问到这台机子部署的 web。

一般用于开发期还没部署到服务器或者需要频繁修改,又想给客户测试时临时使用。

# 目标实现

在任意网络输入 https://dev.frp.xxx.com 来访问运行在本地 5000 端口的 web 项目。

# 所需工具

# 步骤(VPS 端)

# 安装 frp

查看系统内核版本,然后在 frp 仓库的releases (opens new window)下载对应的版本

uname -a
1

这里是 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
1
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
1
2
# frps.ini

[common]
server_addr = 127.0.0.1
server_port = 8000
vhost_http_port = 8080
subdomain_host = frp.xxx.com
1
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
1

创建 supervisor frps 配置文件 在 /etc/supervisor/conf.d 创建 frp.conf

# frp.conf

[program:frp]
command = /opt/frp/frps -c /opt/frp/frps.ini
autostart = true
1
2
3
4
5

重启 supervisor,查看状态

# 重启 supervisor
sudo systemctl restart supervisor
# 查看 supervisor 运行状态
sudo supervisorctl status
1
2
3
4

如果显示 frp RUNNING 就是正常运行了

# 安装 Nginx

apt-get install nginx
1

# 申请免费的 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
1
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;
  }
}
1
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
1

如果没有报错,则配置是正确的

这个配置主要用于添加泛域名证书,顺便把 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  • server_addr 是你的服务器 ip
  • server_port 是对应服务器端配置的端口
  • subdomain 是三级域名,即 dev.frp.xxx.com
  • type 虽然可以设置为 https,但是证书需要放在本地,通用性不强,换了其他电脑,还需要重新拷一份 ssl 证书。

保存后,启动 cmd 或者 PowerShell 在软件目录直接运行:

PS D:\Softwares\frp> .\frpc.exe
1

如果显示 start proxy success,则表示连接成功,已经实现内网穿透了,可以通过外网输入 https://dev.frp.xxx.com 或者 https://test.frp.xxx.com 来访问运行在本地 5000 或者 5050 端口的 web。

最后更新: 2022/8/5 09:49:24