frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
本文将以暴露内网 Web 服务为例,实践 frp 的安装部署。更多应用场景,可见 frp 示例。
安装
frp 主要由 客户端(frpc) 和 服务端(frps) 组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。
可以在 Github 的 Release 页面中下载到最新版本的客户端和服务端二进制文件。
本文公网、内网机器都是 Linux x86_64,所以选择了 frp_0.39.0_linux_amd64.tar.gz。解压:
1$ tar xzvf frp_0.39.0_linux_amd64.tar.gz 2frp_0.39.0_linux_amd64/ 3frp_0.39.0_linux_amd64/frps 4frp_0.39.0_linux_amd64/frps_full.ini 5frp_0.39.0_linux_amd64/systemd/ 6frp_0.39.0_linux_amd64/systemd/frpc@.service 7frp_0.39.0_linux_amd64/systemd/frps@.service 8frp_0.39.0_linux_amd64/systemd/frpc.service 9frp_0.39.0_linux_amd64/systemd/frps.service 10frp_0.39.0_linux_amd64/LICENSE 11frp_0.39.0_linux_amd64/frpc.ini 12frp_0.39.0_linux_amd64/frpc_full.ini 13frp_0.39.0_linux_amd64/frps.ini 14frp_0.39.0_linux_amd64/frpc
公网
拷贝 frps 文件进公网机器,假设其 IP 为 x.x.x.x:
1scp frps* ubuntu@x.x.x.x:
修改 frps.ini 文件,设置监听 HTTP 请求端口为 8080:
1cat <<-EOF > ~/frps.ini 2[common] 3bind_port = 7000 4vhost_http_port = 8080 5EOF
安装 supervisor 进行部署,后台长期运行:
1# 安装 supervisor 2sudo apt install supervisor -y 3 4# 添加配置 5sudo -i 6cat <<-EOF >> /etc/supervisor/supervisord.conf 7 8[program:frps] 9directory=/home/ubuntu 10command=/home/ubuntu/frps -c /home/ubuntu/frps.ini 11priority=999 12autostart=true 13autorestart=true 14startsecs=10 15startretries=3 16stdout_logfile=/var/log/frps_out.log 17stdout_logfile_maxbytes=1MB 18stdout_logfile_backups=10 19stdout_capture_maxbytes=1MB 20stderr_logfile=/var/log/frps_err.log 21stderr_logfile_maxbytes=1MB 22stderr_logfile_backups=10 23stderr_capture_maxbytes=1MB 24environment= 25nocleanup=false 26EOF 27exit 28 29# 更新服务 30sudo supervisorctl update all 31 32# 查看服务 33sudo supervisorctl status all
内网
拷贝 frpc 文件进内网机器,假设其 IP 为 192.168.1.100:
1scp frpc* ubuntu@192.168.1.100:
修改 frpc.ini 文件,假设 frps 所在的服务器的 IP 为 x.x.x.x,local_port 为本地机器上 Web 服务监听的端口, 绑定自定义域名为 custom_domains。
1cat <<-EOF > ~/frpc.ini 2[common] 3server_addr = x.x.x.x 4server_port = 7000 5 6[web] 7type = http 8local_port = 8000 9custom_domains = www.yourdomain.com 10EOF
将 www.yourdomain.com 的域名 A 记录解析到 IP x.x.x.x。
如果服务器已经有对应的域名,也可以将 CNAME 记录解析到服务器原先的域名。或者可以通过修改 HTTP 请求的 Host 字段来实现同样的效果。
简单运行服务,进行测试:
1# 运行 HTTP 服务 2python3 -m http.server 8000 3 4# 运行 frpc 服务 5./frpc -c ./frpc.ini 6 7# 访问测试 8curl http://www.yourdomain.com:8080/
以 systemd 进行部署,后台长期运行:
1# 拷贝文件 2sudo cp frpc /usr/bin/frpc 3sudo mkdir -p /etc/frp 4sudo cp frpc.ini /etc/frp/frpc.ini 5 6# 添加配置(frp 给的 systemd 配置) 7sudo -i 8cat <<-EOF > /etc/systemd/system/frpc.service 9[Unit] 10Description=Frp Client Service 11After=network.target 12 13[Service] 14Type=simple 15User=nobody 16Restart=on-failure 17RestartSec=5s 18ExecStart=/usr/bin/frpc -c /etc/frp/frpc.ini 19ExecReload=/usr/bin/frpc reload -c /etc/frp/frpc.ini 20LimitNOFILE=1048576 21 22[Install] 23WantedBy=multi-user.target 24EOF 25exit 26 27# 重载配置 28sudo systemctl daemon-reload 29 30# 开机启动 31sudo systemctl enable frpc.service 32 33# 启动服务 34sudo systemctl start frpc.service 35 36# 查看状态 37sudo systemctl status frpc.service
GoCoding 个人实践的经验分享,可关注公众号!
