Ubuntu使用ssh反向通道登陆内网机器

date: 2016.05.10; modification:2016.05.10

目录:

1 简介

如果想要登录到NAT后面的内网机器, 必须有一台具有公网IP的机器作为中转.

本文中假定如下几台机器:

2 配置

2.1 配置GatewayPorts

首先需要在公网IP的这台机器上配置ssh服务, 使能其端口转发:

sudo vi /etc/ssh/sshd_config

添加如下行:

GatewayPorts yes

重启sshd生效:

sudo service ssh restart

2.2 建立反向通道(reverse tunnel)

这个反向通道是建立在从OfficePc到Server之间的. 在OfficePc上运行命令:

ssh -R 6333:localhost:22 ServerUser@Server

示意图如下:

+--------+                         +----------+
| Server | <- ServerUser@Server -- | OfficePc |
+--------+                         +----------+
   6333 ------- Reverse Tunnel -------> 22

该命令首先通过一般的ssh方式登陆到Server上, 然后再建立一条从Server返回来的通道, 所以叫反向通道(Reverse Tunnel).

2.3 通过反向通道登录

想要登录到OfficeUser@OfficePc, 但是OfficePc是在NAT后面,看不到其IP, 所以就需要 Server来中转一下. 怎么中转呢, 就通过上面建立的这条通道.这样, 就可以从其他的机器 (比如HomePc)通过登录到OfficePc了. 怎么登呢? 如下:

在HomePc(或者任何其他机器), 运行:

ssh OfficeUser@Server -p 6333

注意这里的user是OfficeUser.

示意图为:

  +--------+                   +--------+                         +----------+
  | HomePc |                   | Server |                         | OfficePc |
  +--------+                   +--------+                         +----------+
      |                            |                                   |
      +-- OfficeUser@Server ----> 6333 ------- Reverse Tunnel -------> 22

现在应该就能登录到OfficePc的机器上, 看到其内容了.

2.4 自动重连

通过如上的方法, 可以实现远程登录到内网的机器了, 但是有个问题, 上面建立的这条通道, 如果连接断了呢? 那么就要有人帮忙在OfficePc上再建立一次反向通道. 这明显不符合懒人原则. 所有就有了autossh来充当这个角色. 运行如下命令:

autossh -M 6334 -fNR 6333:localhost:22 ServerUser@Server

用该命令代替前文中的: ssh -R 6333:localhost:22 ServerUser@Server 这样, 就相当于有个人在监控这个反向通道, 当发现它断了以后, 会自动重连.

2.5 防止掉线

有时(网络不好时候)虽然有了上面的autossh自动重连, 但是经常的掉线重连, 虽然是自动的但仍然挺烦人. 这时就可以适当的将判断掉线的超时时间延长. 在Server的/etc/ssh/sshd_config中配置如下内容:

TCPKeepAlive yes        # 该行应该是默认就存在并使能为yes的. 意为使能心跳检测.
ClientAliveInterval 10  # 该行需要添加. 意为需要每10秒钟发送一次心跳.
ClientAliveCountMax 30  # 该行需要添加. 意为连续30个ClientAliveInterval没有心跳, 就认为掉线.

上面的意思合起来就是10*30=300秒, 也就是5分钟如果没有心跳, 就认为掉线. 可以根据实际情况适当的调整这两个数值, 太大太小都不好.