SSH反向代理
目录:
示例机器
机器 | IP | 用户名 | 备注 |
---|---|---|---|
A | 10.141.28.100 | root | 目标服务器,处于内网 |
B | 47.91.219.253 | root | 外网服务器,相当于桥梁的作用 |
解决方案
在内网机器A做到外网机器B的反向代理,然后外网机器B做正向代理实现本地端口转发
参数介绍
- -f 后台执行ssh指令
- -C 允许压缩数据
- -N 不执行远程指令
- -R 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
- -L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口
- -p 指定远程主机的端口
内网机器A做到外网机器B的反向代理
操作命令
ssh -fCNR [外网机器B的IP或省略]:[外网机器B的端口]:[内网机器A的IP]:[内网机器A的端口] [登陆外网机器B的用户名@服务器IP -p端口]
实际实施
[root@VM_28_100_centos ~]# ssh -fCNR 127.0.0.1:3333:127.0.0.1:22 root@47.91.219.253 -p 22
root@47.91.219.253's password:
可以看到本地启动的进程
[root@VM_28_100_centos ~]# ps -ef | grep ssh
root 1259 1 0 16:10 ? 00:00:00 /usr/sbin/sshd
root 1922 1259 0 16:10 ? 00:00:00 sshd: root@pts/0
root 13983 1 0 18:08 ? 00:00:00 ssh -fCNR 127.0.0.1:3333:127.0.0.1:22 root@47.91.219.253 -p 22
root 14049 1259 0 18:09 ? 00:00:00 sshd: root@pts/1
root 14117 1951 0 18:10 pts/0 00:00:00 grep ssh
可以在外网机器B上看到对应的端口了
[root@why 18:08:21 js]#ss -nlpt | grep ssh
LISTEN 0 128 *:22 *:* users:(("sshd",pid=31028,fd=3))
LISTEN 0 128 127.0.0.1:3333 *:* users:(("sshd",pid=413,fd=9))
这样实际本机的127.0.0.1的3333端口就被sshd转发到内网机器B的22端口了,就可以直接通过外网机器ssh请求到内网机器了
外网机器B做正向代理
操作命令
ssh -fCNL [内网机器A的IP或省略]:[内网机器A的端口]:[外网机器B的IP]:[外网机器B端口] [登陆外网机器B的用户名@B机器的IP -p端口]
实际实施
[root@why 18:08:25 js]#ssh -fCNL 127.0.0.1:2201:127.0.0.1:3333 root@localhost -p 22
root@localhost's password:
可以看到本地启动的进程
[root@why 18:08:45 js]# ps -ef | grep ssh
root 458 31028 0 18:08 ? 00:00:00 sshd: root [priv]
root 463 1 0 18:08 ? 00:00:00 ssh -fCNL 127.0.0.1:2201:127.0.0.1:3333 root@localhost -p 22
root 464 458 0 18:08 ? 00:00:00 sshd: root
root 494 25062 0 18:09 pts/1 00:00:00 ssh root@127.0.0.1 -p 2201
root 620 32554 0 18:11 pts/4 00:00:00 grep --color ssh
root 31028 1 0 17:33 ? 00:00:00 /usr/sbin/sshd -D
本地的端口
[root@why 18:08:49 js]#ss -nlpt | grep ssh
LISTEN 0 128 127.0.0.1:2201 *:* users:(("ssh",pid=463,fd=4))
LISTEN 0 128 *:6666 *:* users:(("sshd",pid=31028,fd=3))
LISTEN 0 128 127.0.0.1:3333 *:* users:(("sshd",pid=413,fd=9))
SSH登录
然后就可以ssh登录了
[root@why 18:09:10 js]#ssh root@127.0.0.1 -p 2201
The authenticity of host '[127.0.0.1]:2201 ([127.0.0.1]:2201)' can't be established.
RSA key fingerprint is SHA256:tB8z5p1knh+4ljqaypjgtuwxuyPAxt13bs4uz/OLC5A.
RSA key fingerprint is MD5:d1:8b:3c:ac:f6:8f:05:e9:70:cb:16:b6:0a:66:f4:e5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[127.0.0.1]:2201' (RSA) to the list of known hosts.
root@127.0.0.1's password:
Last login: Wed Oct 17 16:10:58 2018 from 114.251.228.131
autossh建立稳定隧道
不过这种反向代理不是很稳定,因为反向代理的链接会因为超时而关闭,导致内网到外网的通道无法正常维持。
可以先建立ssh免密码登录
ssh-copy-id 外网用户名@外网IP
安装autossh
yum install -y autossh
建立稳定ssh反向代理
autossh -M 3334 -fCNR 127.0.0.1:3333:127.0.0.1:22 root@47.91.219.253 -p 22
authssh和ssh参数是一致的,但是会在隧道断开的时候自动连接。
- -M参数是指定另一个端口,外网机器B用于接受内网机器A的信息,如果隧道不正常则返回A使其实现重新连接