这篇文章距离上次更新正好400天,希望本次重新开始能维持一段时间的热情。我更新博客大多是不想干活了才来更新。
注意: 绕过跳板机直连服务器在任何情况下都是极度危险的行为!尤其不要把内网端口暴露在外网,否则可能会让你吃上免费饭!本实验实际上并没有绕过跳板机,内网服务器与外网还需要VPN+proxy两次认证。
动机
去年的保研卷卷大赛中我有幸卷到了计算所某大佬名下的直博,然后就进组开始打工了。实验室提供了一个Anyconnect的VPN接入跳板机,然后跳板机可以访问内网服务器。
但是我其实不太理解,为什么我用了VPN之后,还是不能直接访问服务器呢?之前给字节打工的时候,连上Seal
之后Google
都能打开。我的推测是担心ip路由撞了或者什么别的问题(比如强制要求),当然具体如何我也不太关心了——我只知道非要先连VPN,再RDP到跳板机,最后再用Putty连服务器 ===
工作效率为0。
疫情一来我还不好出校,那我可怎么完成任务啊!(内心OS:)
跳板机调整
首先,我们默认你没有跳板机管理员权限。如果你有,请不要浪费时间在这里,看点别的不香吗。
在这个条件下,我们能做的事就非常有限了:
- 一般跳板机的系统是精简过的,缺失一些你想要的基础库,你还安不上去。
- 跳板机的配置不会太高,如果好几个人一起远程桌面上去,都开IDE会直接卡到飞起。(比如我们组的是
E5620
,32G RAM
) 懒得给IT管理员提需求,能技术解决为什么要找人
根据以上的限制,策略就非常明确了:把内网服务器暴露给本地的设备直接访问,而不是在跳板机上连。之后就VS Code Remote
直接远程开发,以及SSH port forward
随便转发你需要的端口,以及SFTP
直接处理文件(或者远程挂载FS)。
V1版本
我在北邮这边有一个有公网v6的服务器,于是我想的是搭建反向ssh隧道:
jump
->local-server
withssh -R
client
->local-server
->remote-server
但是在实行的时候还发现跳板机的防火墙阻止SSH出站,于是我就用了一下代理软件(Trojan
,其实只要不是明文代理都行)绕过这个限制,明显这里有违规了x 最后拓扑就是这个样子:
jump
->local-server
withTrojan
jump
===>local-server
withssh -R
client
->local-server
->remote-server
至于jump
连接local-server
暴露端口肯定用不了原生命令,直接用了MobaXterm
的隧道工具,还带了自动重连就很不错。然后代理软件的客户端也选了Clash for windows
,原因是这两个软件都提供 User Standalone 版本,可以直接运行。
然后在CFW
设置本地代理端口的时候,注意选择高位端口。因为没有管理员权限是不能在低端口上监听的。
优点
Client
上什么都不需要额外运行,直接写好ssh_config
和proxy_jump
就可以正常工作
缺点
如果要连接新的机器,需要在Jump Server
上手动配置添加。
V2 方案
这个方案也是今天才实验好的,因为那个v6服务器因为不可抗拒的原因下线了,我这边又有很多实验要跑,就临时赶出来了。去掉了local-server
的依赖。拓扑逻辑大概如下:
Jump-server
runproxy-server
withauth
Client
->Jump-server
inVPN
Client
===>Server
withsocks5/http
利用了Clash
自带的Allow lan
和socks/http auth
功能,跑了一个小的代理服务器。这样Client
连上VPN之后就可以直接通过这个代理访问了。
优点
如果要连接新的机器,不需要手动配置添加
缺点
Client
需要额外运行OpenConnect/AnyConnect
客户端配置
其实主要是ssh_config
的配置
V1版本
直接跳板机连接
Host JumpServer
HostName 10.3.*.*
PreferredAuthentications publickey
IdentityFile "/c/Users/userName/.ssh/id_ecdsa"
User makiras
ForwardAgent yes
IdentityAgent SSH_AUTH_SOCK
Host RemoteServer
HostName 127.0.0.1
Port 50022 # mapped port
RemoteForward 1080 127.0.0.1:1080
PreferredAuthentications publickey
IdentityFile "/c/Users/userName/.ssh/id_ecdsa"
User makiras
ProxyJump JumpServer
V2版本
SSH配置文件
Host ict-revp-xxx
HostName 10.16.xxx.xxx
RemoteForward 1080 127.0.0.1:1080
PreferredAuthentications publickey
IdentityFile "/c/Users/userName/.ssh/id_ecdsa"
User makiras
ForwardAgent yes
IdentityAgent SSH_AUTH_SOCK
ProxyCommand sh ~/.ssh/proxy-ict.sh %h %p
注意:
ProxyCommand
使用sh
是因为默认情况下,windows git不会将bash
加入到PATH
中。- 使用脚本是为了不用手动输入
connect
为代理提供的密码。
脚本
$1 $2
就是传入参数的%h %p
#!/bin/bash
export HTTP_PROXY_PASSWORD="this-is-auth-token!"
connect -H makiras@jump-server-ip:port -a none $1 $2
成果
OpenConnect
一开,就能VS Code Remote
辣。