问题描述

很多人肯定碰到这样一个问题:自己办公室的电脑回家之后就没法通过家里的电脑远程连接过来了。除非通过拨通×××或者其他方式先连接到公司内网。如果公司没有×××,那么我们如何通过SSH连接到公司的电脑呢?这里我们可以使用SSH反向代理


实验环境

机器编号IP
用户名
备注
  • A

172.16.206.131
aaa目标服务器,在局域网中,可以访问 A
  • B

10.10.10.206bbb代理服务器,在外网中,无法访问 A
  • C

10.10.10.202
可以直接访问 B,无法直接访问 A






目标

从 C 机器使用 SSH 访问 A

解决方案

在 A 机器上做到 B 机器的反向代理;在 B 机器上设置GatewayPorts yes

环境需求

  • 每台机器上都需要 SSH 客户端

  • A、B 两台机器上需要 SSH 服务器端。通常是 openssh-server。

CentOS系统默认都安装了openssh-server。


实施步骤

1、在A上面建立到B的反向代理

ssh -fCNR 88:localhost:22 bbb@10.10.10.206
参数解释:
-f 后台运行
-C 允许压缩数据
-N 不执行任何命令
-R 将端口绑定到远程服务器,反向代理
-L 将端口绑定到本地客户端,正向代理


命令解释:将主机A本地的22端口映射到代理服务器上的88端口上。

登录代理服务器B,查看是否启动了88端口

[root@localhost .ssh]# netstat -tunlp | grep '88'     
tcp        0      0 0.0.0.0:88                  0.0.0.0:*                   LISTEN      1234/sshd             
tcp        0      0 :::88                       :::*                        LISTEN      1234/sshd


2、修改代理服务器B的配置文件/etc/ssh/sshd_config设置GatewayPorts yes 


3、测试从C服务器用SSH连接到A

root@localhost:~/.ssh# ssh -p 88 aaa@10.10.10.206  
aaa@10.10.10.206's password: 
Last login: Fri Jun 24 14:43:01 2016 from localhost

注意:连接到A时,一定要用A主机上的账号,ip为代理服务器IP地址



SSH免密码登录

1、主机A在代理服务器B创建反向代理时,需要输入B的账户密码。为了免密码登录,可以将主机A的aaa用户公钥文件传到主机B的bbb账户authorized_keys文件中。


2、主机C通过SSH连接主机A时,也需要输入主机上的aaa用户的密码,为了免密码登录,可以将主机C上的用户的公钥传到主机A的aaa用户下的authorized_keys文件中。



Autosssh的用法


注意:要使用authssh,需要先配置ssh key的认证,将主机A的公钥传到主机B的bbb账户下

AutoSSH 的使用方法和 SSH 类似,只是它提供了断线自动连接功能,这样就不必每次重新输入命令了。而且还可以解决超时断开连接的问题。

经过测试,代理服务器B重启后,主机A上建立的反向代理连接会在主机B重启后,自动创建


安装autossh

yum -y install autossh

用autossh创建反向代理的命令

$ autossh -M 5678 -fCNR 88:localhost:22 bbb@10.10.10.206

比之前的命令添加的一个'-M 5678'参数,负责通过'5678'端口监视连接状态,连接有问题时就会自动重连

总结
由于SSH隧道也使用了SSH加密协议,因此是不会被防火墙上的内容过滤器监控到的。也就是说一切在隧道中传输的数据都是被加密的。当然,离开隧道后的数据还是会保持自己原有的样子,没有加密的数据还是会被后续的路由设备监控到。


参考文档:

http://www.freeoa.net/osuport/netmanage/linux-ssh-tunneling-proxy_1892.html

http://tilt.lib.tsinghua.edu.cn/node/755