最近公司把整个研发网完全隔离了新同事入职后光是把开发环境拉起来就折腾了大半个星期。问得最多的就是一套组合拳内网里怎么用MobaXterm连跳板机、再跳开发机以及VSCode到底怎么才能远程写代码。这些实操我基本都趟过一遍趁热整理出来。如果你也刚进公司级纯内网环境或者正准备给团队搭这么一套开发链路这篇可以直接照着抄。先说结论这套场景没多高深核心就三件事——SSH密钥怎么配、跳板机转发怎么做、VSCode Remote-SSH在内网里怎么把服务端组件喂进去。后面这两件最容易翻车尤其是第三件99%的人第一次都会卡在“Setting up SSH Host”那个转圈上。1. 为什么公司要搞“纯内网 跳板机”这套链路到底长什么样1.1 跳板机不是“中转”那么简单很多同学第一次接触跳板机以为它就是个转发流量的跳板。实际上公司级跳板机也叫堡垒机、Jump Server承担的是安全边界和审计入口的职责。你所有对开发机的访问都必须先落到跳板机由它记录谁在什么时间执行了什么操作然后才允许你进一步访问内网资源。说白了它是整个内网开发环境的“安检口”不是随便一个能省掉的中间节点。我对纯内网的感受是不是“不能上外网”这么简单。公司级纯内网通常把办公网和研发网物理或逻辑隔离开发机没有外网IP只暴露内网地址常见就是172.16.x.x、10.x.x.x这类段。即便某台开发机恰好配了出网策略也会受到白名单、DNS、代理策略的多重限制别指望在上面直接curl下载依赖。理解了这一点后续所有安装包、插件、服务端组件都必须“提前备好拿进去”的工作方式就顺理成章了。1.2 一条完整链路本地电脑 → 跳板机 → 开发机内网开发的完整链路其实非常简单本地WindowsMobaXterm / VSCode │ │ SSH 22 ▼ 跳板机堡垒机统一入口记录审计日志 │ │ SSH 22内网路由可达 ▼ 开发机Linux服务器实际编译、跑服务为什么不能直接从本地连开发机公司层面出于资产登记和安全审计的考虑不允许研发网以外的流量直接触达开发机。也就是说即便你知道开发机的IP和账号直连也会被防火墙或路由策略拦掉。跳板机就是那个“前台”你到前台登记再由前台带你进办公区。这个场景里还有个经常被混淆的概念跳板机是“代传”不是“内网穿透”。之前有同事问我为什么不直接搭个frp、ngrok之类的隧道省得天天跳来跳去。这里多说一句在正规公司环境里私自搭隧道属于破坏网络边界的行为安全审计一查一个准。跳板机的价值恰恰在于“所有操作留下痕迹”这跟穿透工具的出发点完全相反。合规的做法就是老老实实走跳板机通道。1.3 这套环境要解决的核心问题用表格说清楚我们实际要解决哪些事、用什么工具承接需求工具说明终端登录跳板机和开发机MobaXterm会话保存、密钥管理、X11转发都方便在开发机上直接改代码VSCode Remote-SSH本地编辑远程文件比纯命令行效率高上传/下载文件MobaXterm自带SFTP左侧面板拖拽即可不用再单独开FileZilla访问开发机的内部服务端口MobaXterm隧道 / VSCode转发比如把开发机的8080映射到本地访问离线安装VSCode插件VSIX文件内网无法访问扩展市场必须提前备好把这张表里的每一行都打通你就能在内网里像在本地一样干活这也是这篇的核心目标。2. 工具选型MobaXterm和VSCode在内网里的角色分工2.1 为什么内网终端大家都选MobaXtermWindows下可用的SSH客户端很多Xshell、PuTTY、Windows Terminal都行但内网场景下我推荐MobaXterm有四个理由。第一它自带SFTP文件管理。左边一个面板就能拖拽上传下载开发机上缺个包、改个配置不用再敲一长串scp命令。第二内置了X Server跳板机和开发机上有些图形化工具比如一些厂商的调测程序能直接弹窗显示这个在调试场景很救命。第三一个窗口可以保存几十个会话跳板机、各台开发机分组管理换电脑以后导出配置文件就能恢复。第四隧道功能傻瓜化本地端口转发、远程端口转发都在会话配置里点选不用记复杂的ssh -L/-R参数。有个小细节要提MobaXterm第一次启动会问你要不要设主密码Master Password。很多人以为是必填直接设了一个结果每次保存会话密码都要输主密码嫌烦。其实那个弹窗是可以选“No”跳过的保存的密码会以明文形式放在配置里适合纯内网个人办公机如果是公用电脑建议还是开启主密码别图方便。顺便说一句网上很多人搜“MobaXterm ubuntu版本”这里得纠正一下MobaXterm只有Windows版。Linux桌面环境下直接用系统自带的终端ssh就挺好或者装个Remmina之类的图形终端。没必要非得在Linux上找一个MobaXterm的替代品老实用命令行反而更顺畅。2.2 VSCode远程开发在内网怎么运转VSCode的Remote-SSH插件原理可以这么理解本地VSCode是一个“瘦客户端”它通过SSH连上开发机后会在开发机的用户目录下部署一套vscode-server服务端组件然后本地编辑器跟你输入的每一个字符、每一次保存都是通过这条SSH通道和远端server通信的。换句话说你在VSCode里打开的文件并不是下载到本地而是远程开发机上的真实文件你看到的目录树也是远端目录树。终端面板直接就是开发机的shell跑编译、看日志、调试都在里面完成体验很接近本地开发。但在纯内网环境里Remote-SSH有个致命前提vscode-server是需要从微软的更新服务器下载的。开发机没有外网插件第一次连接时就会卡在下载阶段报“XHR failed”或者一直转圈。这也是这篇文章第4章重点解决的问题——离线部署vscode-server。VSCode的插件生态在内网里同样受限。Remote-SSH、C/C、Python、中文语言包这类最常用的扩展都需要提前准备VSIX文件离线安装。别等到连上开发机发现插件装不了才想起来那会儿上不了外网是真着急。2.3 内网安装包到底从哪来纯内网装软件总的思路只有一个把安装包在外网准备好再想办法送进去。具体有三条路按优先级排列。第一条路公司内部软件共享盘或软件分发平台。稍微正规一点的公司通常都会维护一个内部软件库VSCode安装包、插件VSIX、常用工具都在里面。先问IT或老同事要这个入口比自己去折腾省事得多。第二条路在一台有外网权限的办公电脑注意不是开发机上下载好安装包通过公司内网邮件、共享目录或U盘拷进内网。第三条路找已经在内网环境配好工具的同事直接拷贝他的安装包和配置能少走很多弯路。这里有个小提示网上找VSCode、MobaXterm安装包时认准官方下载入口不要下那种打包了乱七八糟东西的“绿色版”。内网环境出问题排查起来本来就麻烦再往里面引入不明来源的文件坑的是自己。3. 实操用MobaXterm把跳板机和开发机一次打通3.1 先配好SSH密钥别再用密码登录进入跳板机时很多公司的安全策略已经强制禁用密码登录只允许公钥认证。就算不禁我也建议主动切换到密钥登录省得每次敲密码而且跳板机上的操作记录也更干净。生成密钥推荐用MobaXterm自带的Tools → MobaKeyGen或者在Windows的cmd里用系统自带的ssh-keygen也行。算法建议用Ed25519兼容性在主流Linux发行版上没有问题如果公司的跳板机比较旧退一步用RSA 2048/4096。我个人的习惯是跳板机和开发机分开用两把不同的密钥避免一把密钥多处使用万一某台开发机被审计发现问题不至于连坐跳板机。生成之后需要把公钥分别放到跳板机和开发机的用户目录下。跳板机公钥追加到目标账号的~/.ssh/authorized_keys开发机同理。内网环境一般没法用ssh-copy-id经常根本没装这个命令手动操作是这样的mkdir -p ~/.ssh chmod 700 ~/.ssh echo ssh-ed25519 AAAA...你的公钥内容 ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys这三个命令的顺序和权限值不是随手敲的。sshd对家目录和authorized_keys的权限非常敏感如果权限过松比如组和其他用户可写SSH服务会直接拒绝使用这个公钥文件报错类似“Bad owner or permissions on /home/user/.ssh/authorized_keys”。先mkdir再chmod 700再追加内容最后chmod 600这套顺序我建议直接记住能避免大量连不上的问题。3.2 新建MobaXterm会话连接跳板机打开MobaXterm点左上角Session → SSH填写跳板机IP、端口默认22、用户名。在Advanced SSH settings里勾选“Use private key”选择你的私钥文件。这里有个细节MobaXterm对私钥格式的兼容性还算好OpenSSH格式的私钥可以直接用PuTTY格式的也能识别。如果之前用Xshell或PuTTY生成的密钥也可以直接在MobaXterm里导入。保存会话后双击连接正常情况下直接进去不会再问密码。如果公司跳板机还启用了OTP动态口令SSH过程中会额外提示输入验证码MobaXterm会正常显示交互提示输入动态码即可进入。3.3 从跳板机到开发机三种方式各有取舍方式一MobaXterm内置网关跳转这是我最推荐的方式。新建会话连开发机时在SSH会话设置的Network Settings标签下勾选“Connect through SSH gateway (jump host)”然后填上跳板机的IP、用户名、私钥。这样MobaXterm只开一个会话后台自动先连跳板机再跳开发机视觉上和直连开发机没有区别。方式二先连跳板机再在终端里手动ssh开发机。适合临时查看某台设备不想保存一堆会话的情况。缺点是每次要敲ssh命令、输入跳板机到开发机这段链路的认证稍微啰嗦。方式三本地端口转发。在MobaXterm里建立隧道把本地某个端口通过跳板机映射到开发机的某个端口。比如开发机上有个管理页面跑在8080你可以设置本地8080转发到开发机的8080然后浏览器直接访问http://127.0.0.1:8080。这种玩法尤其实用于调试接口、查看开发机上的服务面板以及后面VSCode Remote-SSH做辅助连接。三种方式没有绝对优劣日常主力建议用方式一灵活机动用方式三方式二作为备胎理解原理用。3.4 VSCode Remote-SSH连接的配置实战VSCode Remote-SSH和MobaXterm的跳板机思路是相通的都是在本地SSH配置里告诉客户端“你要通过跳板机才能到开发机”。VSCode的Remote-SSH读取的是本地SSH config文件Windows下路径在C:\Users\你的用户名\.ssh\config没有就新建注意不要被编辑器存成config.txt。一个典型配置是这样Host jmp HostName 172.16.10.8 User jason Port 22 IdentityFile C:\Users\jason\.ssh\id_ed25519_jmp Host dev-01 HostName 172.16.20.15 User dev Port 22 ProxyJump jmp IdentityFile C:\Users\jason\.ssh\id_ed25519_dev说明几个关键点。ProxyJump就是“经过跳板机跳转”的意思它要求本地OpenSSH版本在7.3以上Windows 10/11自带的OpenSSH客户端一般都满足。IdentityFile指定连接不同主机时用不同私钥避免SSH默认去试id_rsa找不到而卡住。Host后面的名字是给自己看的自定义别名VSCode连接时选择这个别名就行。配置完成后在VSCode里按F1输入“Remote-SSH: Connect to Host”选择dev-01它会自动走跳板机通道登录开发机。首次连接会触发vscode-server部署这里先预告一下如果卡住或报错直接跳到下一章看离线部署方案。4. 最容易卡住的坑VSCode Server内网离线部署4.1 为什么Remote-SSH在内网会卡在初始化VSCode Remote-SSH的完整启动过程是这样的本地VSCode通过SSH连上开发机后会检查开发机用户目录下的~/.vscode-server/bin/commit目录有没有对应的server程序。如果不存在就会尝试从微软更新服务器下载一份vscode-server-linux-x64.tar.gz解压到那个commit目录里再启动server。纯内网开发机没有外网下载必然失败。表现就是VSCode一直显示“Setting up SSH Host”或者“Downloading VS Code Server”过一会儿报“XHR failed”。本质原因不是你的SSH配错了而是server组件根本进不来。这里要处理好一个逻辑SSH连接本身是通的问题出在“进去之后要下载东西但没网”。所以排查思路不要一上来就去翻SSH配置先确认是不是卡在下载这一步。看远端有没有生成半截文件就知道。4.2 手动部署vscode-server的完整流程既然开发机自己下不了那我们就手动把vscode-server送进去。全过程分四步按顺序操作就行。第一步确认本地VSCode的Commit号。打开VSCode → Help → About会看到类似Commit:e170252f762678dec6ca2b69c2c8ef2d8c4c5f4d这样的字段。这个commit号很关键它决定了你要下载哪个版本的server错一个字符都不行。第二步在一台能访问外网的机器上下载对应版本的server包。下载链接格式是https://update.code.visualstudio.com/commit:commit号/server-linux-x64/stable把commit号替换成第一步看到的Commit值。下载下来是一个tar.gz压缩包。如果你开发机的CPU是ARM架构比如国产化环境把链接里的server-linux-x64换成server-linux-arm64。不确定架构就在开发机上执行uname -m确认。第三步把压缩包传到开发机。可以用MobaXterm的SFTP面板直接拖拽也可以scp。传到/tmp/目录下文件名保持原来的即可。第四步解压到正确位置。注意解压的目标目录不是随便放的必须和本地VSCode的commit号一致而且要先创建目录再解压不能用默认的包内结构mkdir -p ~/.vscode-server/bin/e170252f762678dec6ca2b69c2c8ef2d8c4c5f4d tar -xzf /tmp/vscode-server-linux-x64.tar.gz \ -C ~/.vscode-server/bin/e170252f762678dec6ca2b69c2c8ef2d8c4c5f4d \ --strip-components1这里面的--strip-components1意思是去掉压缩包内的第一层目录。因为tar包解压出来会有一个顶层文件夹不加这个参数就会多套一层目录导致server程序找不到。部署完成后在VSCode里关掉远程窗口重新连接。正常的话会直接进入开发机目录不再有下载卡顿。4.3 版本不对、目录结构不对的排查方法很多人手动部署完还是连不上最常见的两个问题。一个是commit号对不上。本地VSCode升级过或者你下载时手滑复制了旧版本的commit就会导致server一直失败。VSCode启动时会自动寻找和本地版本匹配的commit目录找不到就尝试下载所以只要发现还是报XHR failed第一时间检查你部署的目录名是不是和About里的Commit完全一致。另一个是残留的半成品目录干扰。之前自动下载失败过一次的话~/.vscode-server/bin/下可能留了一个不完整的目录VSCode会优先去它那里找结果初始化失败。处理办法是把这个目录整个删掉重新放置正确的压缩包目录。rm -rf ~/.vscode-server/bin/e170252f762678dec6ca2b69c2c8ef2d8c4c5f4d mkdir -p ~/.vscode-server/bin/e170252f762678dec6ca2b69c2c8ef2d8c4c5f4d tar -xzf /tmp/vscode-server-linux-x64.tar.gz -C ~/.vscode-server/bin/e170252f762678dec6ca2b69c2c8ef2d8c4c5f4d --strip-components1还有个小坑是磁盘空间。开发机如果是共享的用户目录配额可能很小tar包加解压后的文件占几百MB磁盘满了会解压失败但报错不明显。解压前可以用df -h ~看一眼剩余空间。5. 高频问题与避坑实录5.1 连接类问题速查表把这段实操里见过的高频问题列个表方便大家对照排查现象可能原因处理方式MobaXterm连跳板机报Connection refused端口不对 / IP不可达检查ping和端口确认走的是公司内网网段密钥登录报Permission denied公钥没正确追加 / authorized_keys权限不对重新追加公钥执行chmod 700/600跳板机能连开发机连不上ProxyJump配置没生效确认本地OpenSSH版本支持ProxyJump / 检查config语法VSCode卡在Setting up SSH Hostvscode-server未部署按4.2节手动部署serverVSCode报XHR failed同上或commit号不匹配检查commit目录名删除残留半成品目录Remote窗口打开后一片空白远端家目录空间不足df -h查看磁盘清理无用文件每次登录都要输密码SSH密钥没有配置回到3.1节部署公钥5.2 乱码、权限、端口那些事中文乱码在内网Linux终端里很常见原因是终端编码和系统locale不一致。MobaXterm的默认编码在部分版本里不是UTF-8需要手动设置Settings → Configuration → Terminal → 把字符集改成UTF-8顺便把Default charset也设置成UTF-8。跳板机和开发机如果是中文环境改完乱码基本能解决。再啰嗦一遍权限问题。SSH密钥体系的权限要求不是“建议”而是“强制”~/.ssh目录700authorized_keys文件600私钥文件600或400。Windows下用MobaXterm连接时一般不会校验本地私钥权限但远端开发机上的家目录权限、.ssh权限必须严格符合要求否则就是连不上还查不出原因。遇到诡异连接失败优先检查这一步。端口转发这块我强烈建议每个做内网开发的人都掌握。除了VSCode远程开发日常连数据库可视化工具、调试Web服务、看开发机上某个管理面板都靠它。MobaXterm里设置很简单会话右键 → Tunnel新建一个Local端口转发规则本地端口填一个没被占用的端口目标填开发机的IP和端口。以后访问本地端口就是访问开发机上的服务。5.3 几个亲自试过的小技巧MobaXterm设置中文界面有些同事喜欢Settings → Configuration → General → Language下拉框里选中文重启就生效。但我个人的习惯是保持英文界面因为报错信息、操作项的名字和网上搜到的教程对得上排查问题省得来回切换。VSCode的插件离线安装也提一下。内网里Remote-SSH连上以后会发现C/C、Python这些扩展都没有。先在一台有外网的电脑上访问VSCode扩展市场搜索插件下载VSIX文件然后通过MobaXterm传到本地电脑在VSCode扩展面板右上角三个点 → “从VSIX安装”选择文件即可。公司如果有统一要求优先用内部插件源。VSCode里清理远程分支有个小操作连上开发机后在源代码管理面板展开分支右键选择删除远端分支或者在终端面板直接执行git push origin --delete 分支名。这个和本地Git操作没区别很多人不知道顺手提一句。内网Git服务通常有权限管控可能会提示没有删除权限那是正常的找仓库管理员操作即可。最后还想分享一个我的体会内网开发环境里大多数“疑难杂症”不是网络配置多难而是大家默认开发机可以联网。纯内网环境下所有东西都要提前准备好再送进去这个思路一旦建立很多问题就迎刃而解。我自己在权限和版本两个问题上栽过不止一次跟头每次都是老老实实把家目录权限重设、把vscode-server目录删掉重新部署一遍才恢复。建议你也把这两个位置记下来排查顺序排在靠前能省下大量时间。合规方面多提醒一句所有远程操作都走公司规定的跳板机和审计通道不要在办公网络与开发网络之间私搭隧道安全审计不是摆设。希望这篇能帮你在内网里少走几趟弯路。
阅读完成 · 觉得有帮助?