告别本地开发环境!Java程序员使用FRP实现远程开发环境搭建

告别本地开发环境!Java程序员使用FRP实现远程开发环境搭建 写在文章开头个人闲置了一台6核16GB的笔记本结合内置的Linux子系统所以打算基于内网穿透技术打造一台高性能的个人服务器。本文将从网络通信的角度分析内外网通信的工作原理并基于一台2核2GB云服务器实现内网笔记本Linux子系统的网络连接构建一个高性价比的个人服务器解决方案。我是SharkChiliJava 开发者Java Guide开源项目维护者。欢迎关注我的公众号写代码的SharkChili也欢迎您了解我的开源项目 mini-redishttps://github.com/shark-ctrl/mini-redis。为方便与读者交流现已创建读者群。关注上方公众号获取我的联系方式添加时备注加群即可加入。内外网络转发原理nat的科普介绍学过计算机网络基础的同学应该都知道公网IPv4地址是非常稀缺的资源所以现在主流的互联网都采用NATNetwork Address Translation即网络地址转换技术。NAT的工作原理是通过一台路由器将内网私有IP地址转换为公网IP地址让内网机器和外网服务器进行通信。常见的NAT技术有两种静态NATNAPT技术我们先来说说静态NAT技术即固定配置好的一对一静态IP映射当内网IP需要和外网进行通信时将内网IP地址一般为192.168.x.x、10.x.x.x、172.16-31.x.x网段转换为公网IP将网络报文转发到公网目标主机上。如下图假设现在内网有一台172.20.54.50的主机需要访问外部101开头的网络其报文转发过程为指定源IP为内网172开头的地址目标IP为101开头的外网地址报文转发至路由器路由器通过静态NAT映射将报文源地址转换为路由器外网地址1.1.1.1将源地址转换后的报文通过外部网关转发到目标主机上同理目标主机收到报文回复后也会发送一个源地址为101开头的公网IP目标地址为1.1.1.1的报文由路由器根据映射配置将目标地址转换为内网172地址再转发给目标内网主机另一种是NAPTNetwork Address Port Translation即网络地址端口转换技术NAPT技术通过转换IP地址和端口号使多个内网主机共享一个公网IP地址。例如我们现在有两台内网机器其IP分别是172.10.1.1和172.10.1.2此时两台主机都需要和外部服务器进行通信路由器就会利用NAPT技术将源端口和源IP转换为公网的IP和端口与外部通信同时还会建立一张转换表项维护映射信息。例如现在内网的机器172.20.10.1要和外部1.1.1.1的服务器进行通信对应的执行过程为将172.20.10.1报文对应的源IP和端口转换为公网IP和端口1.1.1.1:5096路由器将这个映射关系存储到转换表中公网1.1.1.1服务器收到这个报文并回复公网路由器收到响应根据转换表将目标地址和端口转换为内网地址和端口内网主机收到回复报文内网穿透的工作机制NAT使得内网的机器可以通过地址映射转换的方式让内网机器和外网服务端建立通信但外网的机器如果想访问内部网络服务器要如何做到呢答案就是内网穿透技术。内网穿透技术有多种实现方式UDP打洞反向代理本文的FRP就是基于这种工作机制中继服务器STUN/TURN/ICE协议这里我们重点说一下反向代理该技术通过内网服务器主动和公网服务器建立连接构成一条通道确保公网请求能够通过公网代理服务器转发到内网机器上。以本文运用的FRP来说假设我们希望内网SSH协议22端口映射到公网的5022端口上其工作流程为客户端基于frpcFRP client配置客户端端口映射服务端基于frpsFRP server完成服务端配置并启动监听7000端口默认监听端口号为7000客户端主动和frps建立连接双方完成协定的端口映射公网服务器建立5022端口监听外部SSH请求收到SSH客户端连接请求frps将请求发送给frpcfrpc转发给内网SSH服务响应报文按照相反路径返回内网穿透服务架构说明有了上述网络基础知识的铺垫此时我们就可以基于一台云服务器即可让外部访问我们的内网机器在此之前请读者明确如下条件是否准备充分一台Windows笔记本且内置了Ubuntu系统如果用虚拟机桥接Linux系统也行一台云服务器笔者用2核2GB的服务器Linux子系统已配置SSH服务和MySQL服务MySQL可选本文也会做相应的配置演示内网穿透技术有很多种这里笔者选用的是一款叫FRP的工具它是采用Go语言编写的内网穿透工具支持TCP、UDP等常见网络通信协议部署也非常方便。本次案例利用FRP打通内网服务器和云服务器的隧道并将内网的SSH服务和MySQL通过5022和8306端口发布到公网进行访问个人服务器配置frp安装与配置基于上述的架构说明我们开始本次的配置首先访问frp的github地址下载安装包访问地址为https://github.com/fatedier/frp/releases以笔者的服务器为例对应的下载版本为0.64.0完成下载后将其上传至云服务器完成解压并重命名为frp方便后续操作# 解压程序包tar-zxvffrp_0.64.0_linux_amd64.tar.gz# 重命名文件夹mvfrp_0.64.0_linux_amd64 frp进入frp文件夹执行vim frps.toml编辑服务器配置文件,配置内容也比较简单绑定7000端口监听frp客户端的连接请求即可bindPort7000完成配置后我们可以通过前台启动方式查看是否正常启动若输出没有任何报错则执行下一步systemd配置./frps-c./frps.toml后台systemd启动因为frps是要长期运行的为避免关闭SSH会话后进程被杀死这里我们需要配置将其配置为systemd的方式启动并设置为开机自启在此之前请确认您的服务器是否已安装systemd若没有安装则执行如下指令# 使用 yum 安装 systemdCentOS/RHELyuminstallsystemd# 使用 apt 安装 systemdDebian/Ubuntuaptinstallsystemd执行sudo vim /etc/systemd/system/frps.service配置frps服务对应配置模板如下一般情况下读者只需要将ExecStart下的frps路径和toml配置文件路径即可[Unit]# 服务名称可自定义Descriptionfrp server Afternetwork.target syslog.target Wantsnetwork.target[Service]Typesimple# 启动frps的命令需修改为您的frps的安装路径ExecStart/path/to/frps-c/path/to/frps.toml[Install]WantedBymulti-user.target完成后我们就可以通过以下指令管理frps:# 启动frpsudosystemctl start frps# 停止frpsudosystemctl stop frps# 重启frpsudosystemctl restart frps# 查看frp状态sudosystemctl status frps最后我们配置一下开机自启即可sudosystemctlenablefrps开放监听端口因为我们frps服务端是通过监听7000端口和frpc客户端建立连接默认情况下云服务器是没有开放该端口的所以在进行客户端配置前我们需要到控制台修改网络安全组入方向的配置开放一下7000端口内网笔记本安装与配置端口映射配置因为笔者需要将Windows内部的Linux子系统Ubuntu开放所以一切配置工作都会在Ubuntu中进行首先还是下载FRP程序包步骤和服务端配置类似这里就不多赘述了这里着重说明一下客户端文件frpc.toml的配置serverAddr设置为云服务器的ipserverPort也就是我们上文设置的监听端口每个[[proxies]]配置代表配置一条端口对应对应笔者的配置分别代表将ssh服务即22端口映射到云服务器的5022对应mysql的3306端口映射到8306端口serverAddr x.x.x.xserverPort7000[[proxies]]namesshtypetcplocalIP127.0.0.1localPort22remotePort5022[[proxies]]namemysqltypetcplocalIP127.0.0.1localPort3306remotePort8306开放端口与连通性测试完成客户端配置后读者需要再次回到云服务器将5022和8306端口开放以方便验证连通性同时为了方便建议读者可直接将Windows主机的防火墙关闭或者开放22和3306端口让frps服务端可以和映射端口建立连接。在完成上述的配置步骤后通过下面这段脚本将frpc客户端启动此时就可以测试ssh和mysql的连通性了./frpc-cfrpc.tomlsystemd启动完成这些配置后也可以参考服务端配置方式将其设置为systemd启动通过sudo vim /etc/systemd/system/frpc.service编辑配置文件将启动frpc命令改为启动客户端的命令即可[Unit]# 服务名称可自定义Descriptionfrp client Afternetwork.target syslog.target Wantsnetwork.target[Service]Typesimple# 启动frpc的命令需修改为您的frpc的安装路径ExecStart/home/sharkchili/frp/frpc-c/home/sharkchili/frp/frpc.toml[Install]WantedBymulti-user.target完成后我们执行如下指令完成frpc启动和开机自启sudosystemctl start frpcsudosystemctlenablefrpcWindows盒盖不关机配置到此我们的笔者本已经可以作为服务器使用了为了让其长期运行我们需要将其设置为盒盖不关机的关于windows的电源设置读者可以参考这篇文章:https://zhuanlan.zhihu.com/p/613581298关闭win10自动更新同理windows还有一个自动更新的小毛病读者也可以参考这篇文章关闭自动更新让服务器稳定长期运行https://zhuanlan.zhihu.com/p/391195241小结本文深入介绍了内外网主机的通信原理和内网穿透技术同时也详细演示了如何基于FRP让内网机器主动和公网服务器建立一条安全通道让外部机器可以通过公网服务器访问内网服务。需要补充的是通过这种方式就会使得我们的内网服务器在公网暴露所以读者们一定要谨慎设置好SSH和MySQL的密码并配置FRP的安全认证机制避免安全问题。我是SharkChiliJava 开发者Java Guide开源项目维护者。欢迎关注我的公众号写代码的SharkChili也欢迎您了解我的开源项目 mini-redishttps://github.com/shark-ctrl/mini-redis。为方便与读者交流现已创建读者群。关注上方公众号获取我的联系方式添加时备注加群即可加入。参考WIN10系统如何彻底永久关闭自动更新?建议收藏!:https://zhuanlan.zhihu.com/p/391195241内网穿透打破网络限制的利器内外网概念、穿透原理、实际操作方法步骤:https://jishuzhan.net/article/1948556687765450753frp内网穿透原理及配置记录:https://blog.engine.wang/posts/frp-notes/十分钟教你配置frp实现内网穿透:https://blog.csdn.net/u013144287/article/details/78589643内网穿透原理总结与工具推荐:https://juejin.cn/post/6844904169497690120