Problem
前几天师兄发了台实验室的服务器给我了,让我去搭一搭fabric的环境。
fabric的环境可以搭,但是搭完我还得回家。我回去了咋办?
实验室的服务器又是直接接在校园网内网的,那感觉意味着可以不用做了?(快进到摸鱼
实际上回家的话还是可以连得上的,下面是操作流程:
Prerequisite
一开始的准备是需要你有两台服务器:
- A:实验室的服务器(在内网,没有公网IP)
- B:有公网IP的服务器(在外网,一般可以是各大云的ECS弹性云服务器)
使用到的软件是frp
,我们通过在两个服务器都部署frp
来进行ssh内网穿透。
Configuration on Server A
首先把frp
下载下来
1 | wget https://github.com/fatedier/frp/releases/download/v0.37.0/frp_0.37.0_linux_amd64.tar.gz |
把frpc
有关的都删除了,然后保持默认的7000端口不用更改,用screen开一个frp的后台
1 | rm -rf frpc* |
最后运行
1 | ./frps -c ./frps.ini & |
这个时候会跳出来一些信息,这表示左边已经正常连接了。
Configuration on Server B
当然也把frp
下载下来,不过这时跟frps
有关的就可以都删除了。这里就不贴命令了。
然后需要按照IP信息配置一下frpc.ini
:
1 | [common] |
A的内网IP并不是127.0.0.1
,特别是在校园网环境下更是不可能,直接填在校园网上可以ssh连通的那个IP。
配置的意思是A通过打开6000端口可以接入本地的22端口,22端口也就是默认进shell的端口。
A跟B的7000端口通信,此时B访问自己的6000端口就可以接入A。
当然别忘记运行:
1 | screen -dmS frp |
此时只要前面A服务器没有timeout,就应该会在两边弹出有新ssh连接的信息,这就说明ssh的反向代理打通了。
Ways to Get Access to A
Brute-force Way
本来想连到B的7000端口上面去,可是Connection Closed by remote host了,就算hosts.allow
、hosts.deny
、安全组都把7000端口放通了都还是连不上,这就是我的知识盲区了。最后就通过最蠢的两次ssh连上去了。
首先ssh连到B上面去。进到B的shell之后,我们再运行
1 | ssh username@127.0.0.1 -p 6000 |
愿意的话可以再自己设置下ssh免密,不过已经可以打通了。
SSH in Multiple Hops
其实也可以用一行命令解决:
1 | ssh -t root@xx.xx.xx.xx ssh root@127.0.0.1 -p 6000 |
不仅在console上是如此,也可以在VS Code上直接连进去,方法是通过配置.ssh/config
:
1 | Host xx.xx.xx.xx |
其中,xx.xx.xx.xx
表示B的公网IP。
Multiple Clients to One Server Using frp
其实,B可以做多台内网服务器的中介,方法其实也跟上面类似,不过有一点小小的区别。
把新的需要做反向代理的内网服务器记作C,则同样在C上面配置frpc
有关内容,大部分操作与A类似,不过在frpc.ini
有更改:
1 | [common] |
其实[ssh2]
可以改为其他的名字,正如[ssh]
也只是一个identifier而已。再记得映射到另一个空闲的端口上。
用screen运行相应命令之后会prompt出started successfully之类的字样,之后不需要去在B上面做修改,在B的shell里面ssh新的5000端口就可以连上了。
SSH Connection in VS Code
试了一下可以在VS Code里面直接连上做好反向代理的内网服务器,大概操作流程是这样的:
- 额外下载一个叫
Remote SSH
的extension。 - 点左下角绿色的连接按钮,选择Connect to the Host,然后选择Select SSH configuration file to update,任选一个配置文件。
- 接下来进入了一个编辑文件的界面,就这样输入:
1 | Host xx.xx.xx.xx |
其中,xx.xx.xx.xx
代表B的公网IP。
- 接下来再点击连接,选择Connect to the Host,选择MyFabricServer,输入相应的密码,两个服务器的密码都输入正确的话就可以进入了。
Tips
可能在上面的设置中会出现些问题,此时要注意把已经screen的进程关闭掉。(说关闭还不如说直接杀掉)
1 | screen -ls |
想要重新尝试的话需要确保两边的screen都没有一个active的,然后才能再次尝试。