SSH反向代理

时间:Feb. 27, 2019 分类:

目录:

示例机器

机器 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使其实现重新连接