谢夏戈 @ xiexiage.com

「内网穿透」- FRP(Fast Reverse Proxy)

Dec 31, 2023

前面使用了 ssh 的方式进行内网穿透,但是每次都需要输入密码,效率不高。

frp 类似ssh的方法,但是更加高效,性能好,优雅一点的,同样需要一台服务器来做中转。

  1. frps(服务端):部署在具有公网 IP 的服务器上。
  2. frpc(客户端):部署在需要进行内网穿透的本地计算机上。

步骤 1:安装 FRP

Github:fatdeier/frp 中文文档
Github:fatdeier/frp 下载地址

nat-frp-nat-frp-frp

nat-frp-nat-frp-frp2

  • 选择与服务器操作系统相匹配的版本下载,例如:
    • 我的服务器系统是Linux,那么frps的就是 frp_x.xx.x_linux_amd64.tar.gz
    • 而我Mac mini M2版的就是 frp_x.xx.x_darwin_arm64.tar.gz

通过 SSH 登录到你的服务器,上传并解压 FRP 文件。(你也可以在下载到本地解压后把文件上传到服务器)
记住:

  1. 服务器用frps
  2. 本地用frpc

接下来我们假设我们的域名是:xxx.com , 我们要用的子域名为 abc.xxx.com , 那么我们需要配置如下:

步骤 2:服务器配置 frps

nat-frp-nat-frp-frps

编辑 frps.toml 文件进行配置。

[common]
bindPort = 7000 #frps 监听的端口。
vhostHTTPPort = 8080 #可选
subdomainHost = "xxx.com" #可选 服务器域名

开端:开启端口

  1. 去服务器商的控制面板开启放行端口
  2. 服务器上开启放行端口
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 frpcps 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 来管理服务。 这两个后面再介绍。

谢夏戈 @ xiexiage.com
2023-PRESENT © 谢夏戈