网络背景
公司局域网环境没有固定公网IP,有云服务器,且有固定公网IP
临时需求
外部技术人员需要远程到公司内部某台服务器安装某个应用做测试销售同事需在客户现场访问公司局域网内的a产品演示,需支持http,https大家思考一下,有没有什么比较好的解决方案??
解决思路:
如何利用云上的公网地址+端口映射到局域网内的私有地址+端口,这里给大家分享一下内网穿透工具frp来实现我们上面提到的需求
frp 是什么?
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网
frp工作原理
frp 分为客户端和服务端,客户端根据配置信息与服务端通信(默认7000端口),服务端根据客户端上报上来的信息来开放客户端配置的端口,这个端口就是用来做为访问真实端口的代理端口
安装
安装包下载地址,根据需要下载相应的安装包,包含了服务端和客户端的应用程序,windows等基本上所有系统都支持
frp服务端相关配置
服务端启动核心命令:./frps -c ./frps.ini
直接使用上面命令启动后,服务只能运行在前台,终端退出后,服务终止
解决办法:
使用nohup 命令启动,服务放入后台运行: nohup ./frps -c ./frps.ini &推荐使用systemd 工具来管理服务的状态将frps 服务制作成systemd 服务来管理
相关命令如下:
[root@localhost frp_0.48.0_linux_amd64]# cat > /etc/systemd/system/frps.service << EOF > [Unit] > # 服务名称,可自定义 > Description = frp server > After = network.target syslog.target > Wants = network.target > > [Service] > Type = simple > # 启动frps的命令,需修改为您的frps的安装路径 > ExecStart = /usr/local/frps/frp_0.48.0_linux_amd64/frps -c /usr/local/frps/frp_0.48.0_linux_amd64/frps.ini > > [Install] > WantedBy = multi-user.target > EOFFrps 服务端配置文件修改
完整配置如下:
vim frps.ini [common] ;客户端与服务端通信的端口 bind_port = 7000 ;服务监听的地址,0.0.0.0 表示监听所有ip地址 bind_addr = 0.0.0.0 ;管理界面服务监听地址及端口 dashboard_addr = 0.0.0.0 dashboard_port = 7500 ;管理界面服务登录账号及密码 dashboard_user = admin dashboard_pwd = admin@123456 ;这个token 客户端需要用到 token = admin@12345678启动服务
相关启动命令如下:
#加入开机启动,并启动服务 [root@localhost frp_0.48.0_linux_amd64]# systemctl enable frps –now Created symlink from /etc/systemd/system/multi-user.target.wants/frps.service to /etc/systemd/system/frps.service. #查看服务状态,服务已正常启动 [root@localhost frp_0.48.0_linux_amd64]# systemctl status frps ● frps.service – frp server Loaded: loaded (/etc/systemd/system/frps.service; enabled; vendor preset: disabled) Active: active (running) since Fri 2023-03-17 06:33:05 CST; 3s ago Main PID: 19830 (frps) Tasks: 7 Memory: 17.8M CGroup: /system.slice/frps.service └─19830 /usr/local/frps/frp_0.48.0_linux_amd64/frps -c /usr/local/frps/frp_0.48.0_linux_amd64/frps.ini Mar 17 06:33:05 tele-hearing systemd[1]: Started frp server. Mar 17 06:33:05 tele-hearing frps[19830]: 2023/03/17 06:33:05 [I] [root.go:206] frps uses config file: /usr/l...s.ini Mar 17 06:33:05 tele-hearing frps[19830]: 2023/03/17 06:33:05 [I] [service.go:200] frps tcp listen on 0.0.0.0:7000 Mar 17 06:33:05 tele-hearing frps[19830]: 2023/03/17 06:33:05 [I] [service.go:261] http service listen on 0.0.0.0:80 Mar 17 06:33:05 tele-hearing frps[19830]: 2023/03/17 06:33:05 [I] [service.go:276] https service listen on 0….:8443 Mar 17 06:33:05 tele-hearing frps[19830]: 2023/03/17 06:33:05 [I] [service.go:317] Dashboard listen on 0.0.0.0:7500 Mar 17 06:33:05 tele-hearing frps[19830]: 2023/03/17 06:33:05 [I] [root.go:215] frps started successfully Hint: Some lines were ellipsized, use -l to show in full.登录dashboard 管理台,输入配置文件中配置的账号密码:admin/admin@123456
Frps 服务管理
# 启动frp systemctl start frps # 停止frp systemctl stop frps # 重启frp systemctl restart frps # 查看frp状态 systemctl status frps #服务加入开机自启 systemctl enable frpsFrpc 客户端服务启动
客户端启动核心命令:./frpc -c ./frpc.ini
服务启动方式可参考服务端
Frpc 客户端配置文件
通过 SSH 访问内网机器
编辑我们的客户端配置文件: vim frpc.ini
[common] ;填写frps服务端的公网地址 server_addr = x.x.x.x ;frps服务端与客户端通信地址 server_port = 7000 [ssh] ;制定协议,这里ssh服务,所以指定tcp,如果是http服务,则type为http type = tcp ;通过外网ssh目标主机ip local_ip = 192.168.1.6 ;ssh目标端口 local_port = 22 ;frps服务器开放的端口,与这里的22端口形成映射关系 remote_port = 6000通过 SSH 访问内网机器,假设用户名为 test:
ssh -oPort=6000 test@x.x.x.x
frps 会将请求 x.x.x.x:6000 的流量转发到内网机器192.168.1.6 的 22 端口
基于篇幅内容较多,有关如何通过frp自定义域名访问内网的 Web 服务,为本地 HTTP 服务启用 HTTPS,后面也会分享出来