Appearance
使用 frp 搭建内网穿透服务
TIP
你需要准备的东西:
- 一台有公网 IP 的服务器
- 一台本地电脑
- 一个备案的域名
注意:本文章的环境在 mac 下编写,仅保证在 mac 下的运行效果
搭建 frp 服务端
第 1 步,下载最新的 frp 二进制文件,上传到服务器
第 2 步,解压 frp 文件到/usr/local/bin 目录下
shell
sudo tar -C /usr/local/bin -xzf frp_0.61.0_linux_amd64.tar.gz --strip-components=1 frp_0.61.0_linux_amd64/frps
第 3 步,创建一个 frp 目录来存放配置文件
shell
sudo mkdir -p /etc/frp
第 4 步,创建 frps.toml 配置文件
shell
sudo vi /etc/frp/frps.toml
填入配置文件内容
shell
bindPort = 7000
vhostHTTPSPort = 7443
第 5 步,安装 systemd 服务管理器
shell
yum install systemd
第 6 步,创建 frps.service 文件
shell
sudo vi /etc/systemd/system/frps.service
填入配置文件内容
shell
[Unit]
Description=frp server
After=network.target
[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.toml
[Install]
WantedBy=multi-user.target
第 7 步,启动 frp 服务
shell
sudo systemctl start frps
第 8 步,设置开机自启
shell
sudo systemctl enable frps
搭建 frp 客户端
第 1 步,把前面我们下载的 frp 二进制文件解压,解压后,得到的目录结构如下:
这个目录下面有一个二进制文件 frpc 这个文件是客户端文件,frps 这个文件是服务端文件,服务端的文件是要放到远程服务器上跑起来的,客户端的这个 frpc 文件是本地电脑上跑起来的。用 fprc 去链接远程 frps 服务端
第 2 步,创建一个 frp 目录来存放配置文件,我的是 mac 电脑,我把这个目录创建到我的 home 目录下:/Users/key/frp
第 3 步,把 fpr 解压后的二进制文件 frpc 复制到这个目录下,然后创建一个 frpc.toml 配置文件,并且在这个配置文件里面填入以下内容:
serverAddr = "xxx.xxx.2xx.xx8"
serverPort = 7000
# 鉴权方式为token
auth.method = "token"
# TOKEN 客户端需要设置和服务端一样才能鉴权通过
auth.token = "xxxx"
# 公众号调试代理
[[proxies]]
name = "mp-weixin-debug"
type = "http"
localPort = 3000
customDomains = ["test.itniuma.com"]
[[proxies]]
name = "mp-weixin"
type = "https"
customDomains = ["test.itniuma.com"]
[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:3000"
# HTTPS 证书相关的配置
crtPath = "/Users/key/frp/server.crt"
keyPath = "/Users/key/frp/server.key"
hostHeaderRewrite = "127.0.0.1"
requestHeaders.set.x-from-where = "frp"
第 4 步,去申请一个 ssl 证书,把证书放到/Users/key/frp 目录下,这里需要注意,证书绑定的域名是 test.itniuma.com,所以,在申请证书的时候,需要把 test.itniuma.com 这个域名添加到证书里面,否则,在访问的时候,会提示证书不匹配。
配置完成后,frp 目录下有 4 个文件,其中,server.crt 和 server.key 是 ssl 证书,这个名字是我申请完证书后重命名的,frpc.toml 是客户端配置文件,frpc 是客户端二进制文件
第 5 步,启动 frp 客户端
shell
./frpc -c ./frpc.toml
执行结果如下,表示连接成功
在上面配置文件中,有这样一条配置:
shell
localAddr = "127.0.0.1:3000"
意味着,我本地电脑上的后端项目是跑在这个 3000 端口上的,例如:我启动了一个 go 项目
我们想要把这个本地的 go 服务暴露到公网上,就可以通过 frp 来实现了,还差最后一步
第 6 步,把 test.itniuma.com 这个域名解析到远程服务器的公网 IP 上,这个公网 ip 就是我们 frps 服务器的 ip, 这个 ip 我们已经配置在了本地 frpc.toml 文件中了
shell
serverAddr = "xxx.xxx.2xx.xx8" # 这里你需要改成你自己的服务器ip
serverPort = 7000
由于我们在服务端配置文件中配置的 https 端口是 7443
shell
bindPort = 7000
vhostHTTPSPort = 7443
我们在访问的时候,需要加上端口号,例如:https://test.itniuma.com:7443,这样就可以访问到我们本地的 go 服务了
总结
通过以上步骤,我们就可以把本地的服务暴露到公网上,并且通过 https 来访问,这样就可以实现内网穿透了。架构图如下:
TIP
访问流程总结:
1.域名解析到 frps 服务器的公网 ip
2.frps 和 frpc 建立通信
3.访问https://test.itniuma.com:7443,frps转发请求到frpc,frpc转发请求到本地的go服务