
假设基本信息
假设外网主机 B 的 ip 是 110.73.180.212,拥有一个名为 userB 的用户,ssh 对外暴露的端口号是 4086
内网主机A:我们想要连接的主机,userA,SSH端口22
内网A免密码连接公网B
1 | ssh-keygen #生成密钥 |
1 | cat .ssh/id_rsa.pub #查看是否生成了密钥 |
1 | ssh-copy-id -i .ssh/id_rsa.pub uaerB@110.73.180.212 -p portB |
1 | ssh -p '4086' 'userB@110.73.180.212' |
修改外网主机B允许ssh转发
1 | vim /etc/ssh/sshd_config #添加 GatewayPorts yes |
1 | service sshd restart #重启SSH |
在内网A上配置反向隧道
基本方法:1
2
3
4
5$ ssh -N -f -R 1111:localhost:22 userB@110.73.180.212 -p 4086
# -N 参数表明我们只做端口转发,而不执行远程命令。
# -R 1111:localhost:22 则表明当有人试图用 1111 端口来连接主机 B 的时候,就把它转发给主机 A 的 22 端口(即主机 A 的本地 ssh 端口)。1111可以更改为不冲突的任意端口
# -f 参数,只是指定 ssh 在后台运行而已。
# -p
优化方法:1
2
3
4autossh -M 1122 -N -f -R 1111:localhost:22 userB@110.73.180.212 -p 4086
# 仅多了一个-M参数,这个参数的意思就是用本机的1122端口来监听ssh,每当他断了就重新把他连起来
# 若autossh未安装,先安装
sudo apt-get install autossh
利用一个额外的端口监控1111端口,每当1111断了就重新把他连起来
最后在其他机器上连接内网A
1 | ssh userA@110.73.180.212 -p 1111 #登录内网机器A |