FRP 内网穿透、反向代理

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.xlocal_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 个人实践的经验分享,可关注公众号!

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

搭建个人内网穿透服务

内网穿透本地电脑上的服务无法通过互联网让其他人访问到,通过内网穿透技术可以为自己本地的服务提供互联网入口,无需将本地服务部署在服务器上,便可以让其他人可以访问前提准备本地web服务,访问8086端口阿里云服务器Ubuntu20.04疑问问:既然在使用frp内网穿透服务时,需要服务器,才能使本地服务互联网化,为什么不直接部署在服务器上?答:使用

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )