需求
![](https://img.haomeiwen.com/i25806475/b0e39d95baf48cd3.png)
myPC无法直接访问到S2和S3,S1也无法直接访问到S3
在myPC上,通过S1,S2,间接访问到S3
此类情形经常发生在myPC是内网,S1是本地主机,S2是云主机有外网IP,S3是云主机只有云内网IP时
安装autossh
# ubuntu
sudo apt install autossh
# centos
sudo yum install autossh
配置隧道
配置公钥,S2上有S1的公钥;
假设
服务器 | IP | 端口 | 用户名 |
---|---|---|---|
S1 | 111.111.111.111 | 1111 | user_s1 |
S2 | 222.222.222.222 | 2222 | user_s2 |
S3 | 333.333.333.333 | 3333 | user_s3 |
在S1上,编辑.ssh/config文件,没有就创建
Host tunnel1
HostName 222.222.222.222
Port 2222
User user_s2
IdentityFile ~/.ssh/id_rsa
LocalForward 111.111.111.111:1111 333.333.333.333:3333
在S1上运行autossh
autossh -M 0 -f -T -N tunnel1
访问
此时从myPC上访问 (S1) 111.111.111.111:1111,可以直接访问到 (S3) 333.333.333.333:3333
ssh -p1111 user_s3@111.111.111.111
最终效果示意图
![](https://img.haomeiwen.com/i25806475/b21531db51cdbeb9.png)
注意:
- 其实user_s1是没有用到的,因此“S1上有myPC的公钥” 是不需要的
- S3上有没有S2的公钥,也是无关紧要的
- 如果S3上有myPC的公钥,则myPC就可以直接访问S3而不用用户名密码
简化版
如果MyPC仅需要通过S1访问S2,则配置文件简化为
Host tunnel1
HostName 222.222.222.222
Port 2222
User user_s2
IdentityFile ~/.ssh/id_rsa
LocalForward 111.111.111.111:1111 localhost:2222
访问方式
ssh -p1111 user_s2@111.111.111.111
另一种方式,不在S1与S2上建立隧道,仅仅做转发。这种方式也叫本地转发
Host tunnel1
HostName 111.111.111.111
User user_s1
Port 1111
IdentityFile ~/.ssh/id_rsa
LocalForward 111.111.111.111:1111 222.222.222.222:2222
访问方式
ssh -p1111 user_s2@111.111.111.111
注意这种方式其实是S1自己与自己建立了一个ssh通道,因此需要S1把自己的pubkey加入到自己的authorized_keys,否则要输入user_s1密码
此方式等同于直接运行命令
ssh -Nf -L 111.111.111.111:1111:222.222.222.222:2222 111.111.111.111
-N 告诉SSH客户端,这个连接不需要执行任何命令。仅仅做端口转发
-f 告诉SSH客户端在后台运行
-L 做本地映射端口
网友评论