0%

Establish SSH Connection to Servers in School

Problem

前几天师兄发了台实验室的服务器给我了,让我去搭一搭fabric的环境。

fabric的环境可以搭,但是搭完我还得回家。我回去了咋办?

实验室的服务器又是直接接在校园网内网的,那感觉意味着可以不用做了?(快进到摸鱼

实际上回家的话还是可以连得上的,下面是操作流程:

Prerequisite

一开始的准备是需要你有两台服务器:

  • A:实验室的服务器(在内网,没有公网IP)
  • B:有公网IP的服务器(在外网,一般可以是各大云的ECS弹性云服务器)

使用到的软件是frp,我们通过在两个服务器都部署frp来进行ssh内网穿透。

Configuration on Server A

首先把frp下载下来

1
2
3
$ wget https://github.com/fatedier/frp/releases/download/v0.37.0/frp_0.37.0_linux_amd64.tar.gz
$ tar zxvf frp_0.37.0_linux_amd64.tar.gz
$ mv frp_0.37.0_linux_amd64 frp

frpc有关的都删除了,然后保持默认的7000端口不用更改,用screen开一个frp的后台

1
2
3
4
rm -rf frpc*
vim frps.ini
screen -dmS frp
screen -r frp

最后运行

1
./frps -c ./frps.ini &

这个时候会跳出来一些信息,这表示左边已经正常连接了。

Configuration on Server B

当然也把frp下载下来,不过这时跟frps有关的就可以都删除了。这里就不贴命令了。

然后需要按照IP信息配置一下frpc.ini

1
2
3
4
5
6
7
8
[common]
server_addr = x.x.x.x(B的公网IP)
server_port = 7000
[ssh]
type = tcp
local_ip = x.x.x.x(A的内网IP)
local_port = 22
remote_port = 6000

A的内网IP并不是127.0.0.1,特别是在校园网环境下更是不可能,直接填在校园网上可以ssh连通的那个IP。

配置的意思是A通过打开6000端口可以接入本地的22端口,22端口也就是默认进shell的端口。

A跟B的7000端口通信,此时B访问自己的6000端口就可以接入A。

当然别忘记运行:

1
2
3
screen -dmS frp
screen -r frp
./frpc -c ./frpc.ini &

此时只要前面A服务器没有timeout,就应该会在两边弹出有新ssh连接的信息,这就说明ssh的反向代理打通了。

Ways to Get Access to A

Brute-force Way

本来想连到B的7000端口上面去,可是Connection Closed by remote host了,就算hosts.allowhosts.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
2
3
4
5
6
7
8
9
10
Host xx.xx.xx.xx
HostName xx.xx.xx.xx
User root
port 22

Host MyFabricServer
Hostname 127.0.0.1
User root
port 6000
ProxyJump 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
2
3
4
5
6
7
8
9
10
[common]
server_addr = x.x.x.x(B的公网IP)
server_port = 7000
- [ssh]
+ [ssh2]
type = tcp
local_ip = x.x.x.x(A的内网IP)
local_port = 22
- remote_port = 6000
+ remote_port = 5000

其实[ssh2]可以改为其他的名字,正如[ssh]也只是一个identifier而已。再记得映射到另一个空闲的端口上。

用screen运行相应命令之后会prompt出started successfully之类的字样,之后不需要去在B上面做修改,在B的shell里面ssh新的5000端口就可以连上了。

SSH Connection in VS Code

试了一下可以在VS Code里面直接连上做好反向代理的内网服务器,大概操作流程是这样的:

  1. 额外下载一个叫Remote SSH的extension。
  2. 点左下角绿色的连接按钮,选择Connect to the Host,然后选择Select SSH configuration file to update,任选一个配置文件。
  3. 接下来进入了一个编辑文件的界面,就这样输入:
1
2
3
4
5
6
7
8
9
10
Host xx.xx.xx.xx
HostName xx.xx.xx.xx
User root
port 22

Host MyFabricServer
Hostname 127.0.0.1
User root
port 5000
ProxyJump xx.xx.xx.xx

其中,xx.xx.xx.xx代表B的公网IP。

  1. 接下来再点击连接,选择Connect to the Host,选择MyFabricServer,输入相应的密码,两个服务器的密码都输入正确的话就可以进入了。

Tips

可能在上面的设置中会出现些问题,此时要注意把已经screen的进程关闭掉。(说关闭还不如说直接杀掉)

1
2
3
$ screen -ls
$ kill -9 [your-pid]
$ screen -wipe [your-pid]

想要重新尝试的话需要确保两边的screen都没有一个active的,然后才能再次尝试。

Reference