前面使用了 ssh 的方式进行内网穿透,但是每次都需要输入密码,效率不高。
frp 类似ssh的方法,但是更加高效,性能好,优雅一点的,同样需要一台服务器来做中转。
- frps(服务端):部署在具有公网 IP 的服务器上。
- frpc(客户端):部署在需要进行内网穿透的本地计算机上。
步骤 1:安装 FRP #
Github:fatdeier/frp 中文文档
Github:fatdeier/frp 下载地址
- 选择与服务器操作系统相匹配的版本下载,例如:
- 我的服务器系统是Linux,那么frps的就是
frp_x.xx.x_linux_amd64.tar.gz
- 而我Mac mini M2版的就是
frp_x.xx.x_darwin_arm64.tar.gz
- 我的服务器系统是Linux,那么frps的就是
通过 SSH 登录到你的服务器,上传并解压 FRP 文件。(你也可以在下载到本地解压后把文件上传到服务器)
记住:
- 服务器用frps
- 本地用frpc
接下来我们假设我们的域名是:xxx.com , 我们要用的子域名为 abc.xxx.com , 那么我们需要配置如下:
步骤 2:服务器配置 frps #
编辑 frps.toml
文件进行配置。
[common]
bindPort = 7000 #frps 监听的端口。
vhostHTTPPort = 8080 #可选
subdomainHost = "xxx.com" #可选 服务器域名
开端:开启端口 #
- 去服务器商的控制面板开启放行端口
- 服务器上开启放行端口
CentOS 开启放行端口 👇 #
# 开启 firewalld 服务(如果没有开启的话)
sudo systemctl start firewalld
sudo systemctl enable firewalld
#开放 7000 8080 端口
sudo firewall-cmd --zone=public --add-port=7000/tcp --permanent
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
#重载firewalld以应用更改
sudo firewall-cmd --reload
这里,--zone=public
指定了公共区域,这是大多数情况下默认的区域。--add-port=25600/tcp
添加了对 25600 端口的 TCP 流量的支持。--permanent
使这个规则永久生效,即在防火墙重启后仍然有效。
Ubuntu 开启放行端口 👇 #
sudo ufw allow 7000
sudo ufw allow 8080
步骤 3:在本地计算机上配置 frpc: #
frpc.toml
serverAddr = "xxx.xxx.xxx.xxx" #服务器公网IP
serverPort = 7000 #服务器对应的放行端口
[[proxies]] #本地服务1
name = "your-name" #自定义名称
type = "http" #协议类型
localIP = "127.0.0.1" #本地IP
localPort = 80 #本地端口
[[proxies]] #本地服务2
name = "your-name2" #自定义名称
type = "http"
localIP = "127.0.0.1"
localPort = 1234 #本地端口
subdomain = "abc" #子域名,可以用 abc.xxx.com 访问
记得这里很重要的一步:如果使用了subdomain,那么就需要去解析对应的子域名,或解析通配符。
比如你的域名是 xxx.com
,那么就要解析 abc.xxx.com
或 *.xxx.com
。
步骤 3:启动 FRP #
在服务器上启动 frps: #
./frps -c ./frps.toml
##在后台启动(nohup 不需要安装)
nohup ./frps -c ./frps.toml &
在本地计算机上启动 frpc: #
./frpc -c ./frpc.toml
## 后台启动
sudo nohup ./frpc -c ./frpc.toml &
检查运行服务:
ps aux | grep frpc
和ps aux | grep frps
杀掉对应 id 的后台服务(先查再杀):kill 27805
检查运行日志:cat nohup.out
配置 Nginx #
配置以下你就可以用 http://abc.xxx.com
访问你的内网服务了。
server {
listen 80;
server_name abc.xxx.com;
location / {
proxy_pass http://127.0.0.1:8080/;
proxy_redirect off;
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_set_header X-Forwarded-Proto $scheme;
}
}
步骤 4:验证和使用 #
http://[你的对应域名]:[端口]
http://xxx.com:80
如果是80端口就不用写出来端口号。
http://xxx.com
http://abc.xxx.com
优化 #
这个服务一直在线的,比如Mac mini是一直开着机的,我们的服务器和这个服务也是一直开启着的,所以用nohup管理可能没那么好。
在MacOS上可以用 Launch Agent
来管理服务,比如开机自启,持久化这个服务。
在Linux上可以用 systemd
来管理服务。 这两个后面再介绍。