FRP 内网穿透、反向代理

frp[1] 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议 。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网 。
本文将以暴露内网 Web 服务为例,实践 frp 的安装部署 。更多应用场景,可见 frp 示例[2] 。
安装frp 主要由 客户端(frpc) 和 服务端(frps) 组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上 。
可以在 Github 的 Release[3] 页面中下载到最新版本的客户端和服务端二进制文件 。
本文公网、内网机器都是 linux x86_64,所以选择了 frp_0.39.0_linux_amd64.tar.gz 。解压:
$ tar xzvf frp_0.39.0_linux_amd64.tar.gzfrp_0.39.0_linux_amd64/frp_0.39.0_linux_amd64/frpsfrp_0.39.0_linux_amd64/frps_full.inifrp_0.39.0_linux_amd64/systemd/frp_0.39.0_linux_amd64/systemd/frpc@.servicefrp_0.39.0_linux_amd64/systemd/frps@.servicefrp_0.39.0_linux_amd64/systemd/frpc.servicefrp_0.39.0_linux_amd64/systemd/frps.servicefrp_0.39.0_linux_amd64/LICENSEfrp_0.39.0_linux_amd64/frpc.inifrp_0.39.0_linux_amd64/frpc_full.inifrp_0.39.0_linux_amd64/frps.inifrp_0.39.0_linux_amd64/frpc公网拷贝 frps 文件进公网机器,假设其 IP 为 x.x.x.x:
scp frps* ubuntu@x.x.x.x:修改 frps.ini 文件,设置监听 HTTP 请求端口为 8080:
cat <<-EOF > ~/frps.ini[common]bind_port = 7000vhost_http_port = 8080EOF安装 supervisor 进行部署,后台长期运行:
# 安装 supervisorsudo apt install supervisor -y# 添加配置sudo -icat <<-EOF >> /etc/supervisor/supervisord.conf[program:frps]directory=/home/ubuntucommand=/home/ubuntu/frps -c /home/ubuntu/frps.inipriority=999autostart=trueautorestart=truestartsecs=10startretries=3stdout_logfile=/var/log/frps_out.logstdout_logfile_maxbytes=1MBstdout_logfile_backups=10stdout_capture_maxbytes=1MBstderr_logfile=/var/log/frps_err.logstderr_logfile_maxbytes=1MBstderr_logfile_backups=10stderr_capture_maxbytes=1MBenvironment=nocleanup=falseEOFexit# 更新服务sudo supervisorctl update all# 查看服务sudo supervisorctl status all内网拷贝 frpc 文件进内网机器,假设其 IP 为 192.168.1.100:
scp frpc* ubuntu@192.168.1.100:修改 frpc.ini 文件,假设 frps 所在的服务器的 IP 为 x.x.x.x,local_port 为本地机器上 Web 服务监听的端口, 绑定自定义域名为 custom_domains 。
【FRP 内网穿透、反向代理】cat <<-EOF > ~/frpc.ini[common]server_addr = x.x.x.xserver_port = 7000[web]type = httplocal_port = 8000custom_domains = www.yourdomain.comEOF将 www.yourdomain.com 的域名 A 记录解析到 IP x.x.x.x 。

如果服务器已经有对应的域名,也可以将 CNAME 记录解析到服务器原先的域名 。或者可以通过修改 HTTP 请求的 Host 字段来实现同样的效果 。
简单运行服务,进行测试:
# 运行 HTTP 服务Python3 -m http.server 8000# 运行 frpc 服务./frpc -c ./frpc.ini# 访问测试curl http://www.yourdomain.com:8080/以 systemd 进行部署,后台长期运行:
# 拷贝文件sudo cp frpc /usr/bin/frpcsudo mkdir -p /etc/frpsudo cp frpc.ini /etc/frp/frpc.ini# 添加配置(frp 给的 systemd 配置)sudo -icat <<-EOF > /etc/systemd/system/frpc.service[Unit]Description=Frp Client ServiceAfter=network.target[Service]Type=simpleUser=nobodyRestart=on-failureRestartSec=5sExecStart=/usr/bin/frpc -c /etc/frp/frpc.iniExecReload=/usr/bin/frpc reload -c /etc/frp/frpc.iniLimitNOFILE=1048576[Install]WantedBy=multi-user.targetEOFexit# 重载配置sudo systemctl daemon-reload# 开机启动sudo systemctl enable frpc.service# 启动服务sudo systemctl start frpc.service# 查看状态sudo systemctl status frpc.service
GoCoding 个人实践的经验分享,可关注公众号!
脚注[1] frp: 


    推荐阅读