虚拟机nps内网穿透搭建
我的虚拟笔记本放在公司内网机房里,人却坐在家里。内网为了能随时连回去改代码,穿透我在那台机器上装了个nps客户端——一个轻量级内网穿透工具。搭建整个过程比我想象中简单,虚拟但也踩了几个坑。内网写下来,穿透给同样需要远程访问内网设备的搭建人做个参考。
先说说环境。虚拟内网那台机器是内网Ubuntu 20.04,跑着几个Docker容器,穿透需要暴露的搭建端口有22(SSH)、8080(某个管理后台)、虚拟还有3306(MySQL,内网虽然不太安全但临时用)。穿透公网服务器是一台1核1G的小水管,装了CentOS 7,带宽只有1Mbps。nps的架构很直白:公网服务器跑服务端,内网机器跑客户端,客户端主动连服务端,建立隧道。
第一步,下载服务端。到nps的GitHub release页面,找linux_amd64的压缩包。解压后目录里有nps和npcs两个可执行文件——前者是服务端,后者是客户端。在公网服务器上运行./nps install,它会装成系统服务。然后改conf/nps.conf,重点改三个地方:web_port(管理界面的端口,我改成8081)、bridge_port(客户端连接的端口,默认8024,我改成8024没动)、还有auth_key——这个key是客户端注册时用的,默认是随机字符串,我换成了一串自己记的复杂密码。
启动服务端后,打开http://公网IP:8081,默认账号admin/123。进去第一件事改密码。然后创建一个客户端,填上刚才的auth_key,会生成一个唯一的vkey,这个vkey就是内网机器要用的身份凭证。
第二步,搞内网客户端。把那台Ubuntu上的nps客户端下载下来,运行./npcs install,然后编辑conf/npc.conf。这里有个容易搞混的点:客户端配置文件里要填的是server_addr(公网IP和bridge_port),还有vkey。填对了,客户端就能连上服务端,在管理界面看到它上线。
但光上线没用,得配置隧道。我直接在管理界面操作的:进入“客户端”菜单,找到那台机器的ID,点“隧道”按钮。添加隧道时选TCP模式,服务端端口填一个公网没被占用的端口,比如2222,目标地址填127.0.0.1:22——因为npc就在那台内网机器上跑,所以直接回环地址就行。同理,再加一条隧道,服务端端口8082映射到127.0.0.1:8080,MySQL那条我映射到33060端口。
保存后几秒钟,隧道状态变绿。我试了下ssh -p 2222 user@公网IP,直接连上了内网机器的SSH。延迟大概30ms,打字没感觉卡。
有几个细节值得提。第一,公网服务器的防火墙必须放行bridge_port和所有映射出去的端口,否则客户端连不上,隧道也白搭。第二,nps默认支持域名解析,但纯IP访问时别开host_cloud——我一开始开了,导致访问管理后台时跳转到localhost,折腾了半天才发现是这个开关惹的祸。第三,如果内网机器重启了,npc服务不会自动启动——需要systemctl enable npcs,这个我一开始漏了,后来远程断过一次才补上。
现在这套穿透已经稳定跑了三周。周末在家连回去改了个紧急bug,用手机热点也能连,只是画质差点。唯一不爽的是,公网那台1M带宽的小水管成了瓶颈,传输大文件时速度感人。但就一个轻量管理需求来说,nps比frp配置直观,比zerotier这种P2P方案更可控——毕竟所有流量都经过自己的服务器,安全性上心里有底。
最后提醒一句:MySQL暴露到公网真的风险不小。我加了个iptables规则,只允许自己家宽带的IP段访问33060端口。如果哪天要长期开放,还是上跳板机加密钥认证比较靠谱。穿透工具是方便,但别把门开得太大。
(责任编辑:知识)
