内网没有公网IP,但是又有需要提供内网机器上部署的应用或者服务器给外网访问,这个动作就是内网穿透。ngrok、frp 等工具就是用来干这个的。 frp 支持tcp、udp、http、https等协议类型,并且支持web服务器根据域名进行路由转发。
配置前准备
PS: 下载包时,要考虑服务端(公网服务器)、客户端(本地计算机)的系统及芯片。 比如服务端为 centos7 64 位, 客户端为 MacOs 。 那么服务端下载的是 frp_xx.xx.xx_linux_xxxx.tar.gz
, 客户端下载的是 frp_xx.xx.xx_darwin_xxxxx.tar.gz
服务端配置
- 服务器系统为 Centos7 AMD 64位
- frp 存储目录为 /usr/local/etc/frp
安装
根据系统下载服务端文件 https://github.com/fatedier/frp/releases
1 2 3 4 5 6 7 8
| cd /usr/local/etc/
wget https://github.com/fatedier/frp/releases/download/v0.37.0/frp_0.37.0_linux_arm64.tar.gz
tar -zxvf frp_0.37.0_linux_arm64.tar.gz
mv frp_0.37.0_linux_arm64 frp
|
修改配置文件
1 2 3 4
| cd /usr/local/etc/frp
vi frps.ini
|
frps.ini 配置修改,更多高阶配置参考frp 文档
1 2 3 4 5 6 7
| [common]
bind_port = 7000
vhost_http_port = 6800
token = 123456
|
防火墙开放端口
1 2 3 4
| firewall-cmd --zone=public --add-port=7000/tcp --permanent
firewall-cmd --reload
|
启动
启动方式有 2 种,2 选 1 即可
配置到系统服务中
1 2 3 4
| cp /usr/local/etc/frp/systemd/frps.service /etc/systemd/system/frps.service
vi /etc/systemd/system/frps.service
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| [Unit] Description=Frp Server Service After=network.target
[Service] Type=simple
User=nobody Restart=on-failure RestartSec=5s
ExecStart=/usr/local/etc/frp/frps -c /usr/local/etc/frp/frps.ini
[Install] WantedBy=multi-user.target
|
1 2 3 4
| systemctl enable frps
systemctl start frps
|
控制台启动(不推荐)
不推荐控制台启动
- 显示启动,关闭 bash 就停止了
- 后台启动,不方便关闭。
- 命令复杂,不容易记忆
1 2 3 4
| ./frps -c ./frps.ini
nohup ./frps -c ./frps.ini &
|
Nginx 转发配置
我使用的 https ,配置如下
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
| server { listen 80; server_name frp.sample.com; rewrite ^(.*) https://$server_name$1 permanent; }
server { listen 443 ssl; server_name frp.sample.com;
underscores_in_headers on;
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_session_tickets off;
ssl_certificate /etc/letsencrypt/live/frp.sample.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/frp.sample.com/privkey.pem;
location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:6800; } }
|
客户端配置
- 本地计算机系统为 MacOS 11.4 Inter 64位
- frp 存储目录为 /User/alexliu/tools/frp
配置
根据系统下载服务端文件 https://github.com/fatedier/frp/releases
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| vi /User/alexliu/tools/frp/frpc.ini
[common] server_addr = xxx.xxx.xxx.xxx server_port = 7000
[ssh] type = tcp local_ip = xxx.xxx.xxx.xxx local_port = 22 remote_port = 6000
[web] type = http local_port = 8081 custom_domains = frp.sample.com
|
启动
1 2
| ./frpc -c ./frpc.ini nohup ./frpc -c ./frpc.ini &
|
其他配置
自定义二级域名
自定义二级域名,可以分发至多个 web服务
1 2 3 4 5 6
| [common] bind_port = 7000 vhost_http_port = 6800 token = 123456
subdomain_host = frp.sample.com
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| [common] server_addr = xxx.xxx.xxx server_port = 7000 token = 123456
[web] type = http local_port = 80
subdomain = a
[web1] type = http local_port = 8080
subdomain = b
|
这时候 访问a.frp.sample.com
访问 80 端口应用。 访问b.frp.sample.com
访问8080端口应用。 nginx 转发需要改为泛域名 *.frp.sample.com
,如果是 https 需要申请泛域名证书
Dashboard
Dashboard 是可以通过浏览器查看 frp 的状态以及代理统计信息。
1 2 3 4 5 6 7 8 9 10 11 12
| [common] bind_port = 7000 vhost_http_port = 6800 token = 123456
subdomain_host = frp.sample.com
dashboard_port = 7500
dashboard_user = admin dashboard_pwd = admin
|
然后开放服务端端口 7500 , 使用 IP:Port 即可访问。如果需要 nginx 转发,配置好后,转发 7500 即可