如何通过反向 SSH 隧道访问 NAT 后面的 Linux 服务器

你在家里运行着一台 Linux 服务器,它放在一个 NAT 路由器或者限制性防火墙后面。现在你想在外出时用 SSH 登录到这台服务器。你如何才能做到呢?SSH 端口转发当然是一种选择。但是,如果你需要处理多级嵌套的 NAT 环境,端口转发可能会变得非常棘手。另外,在多种 ISP 特定条件下可能会受到干扰,例如阻塞转发端口的限制性 ISP 防火墙、或者在用户间共享 IPv4 地址的运营商级 NAT。

什么是反向 SSH 隧道?

SSH 端口转发的一种替代方案是 反向 SSH 隧道。反向 SSH 隧道的概念非常简单。使用这种方案,在你的受限的家庭网络之外你需要另一台主机(所谓的“中继主机”),你能从当前所在地通过 SSH 登录到它。你可以用有公网 IP 地址的 VPS 实例 配置一个中继主机。然后要做的就是从你的家庭网络服务器中建立一个到公网中继主机的永久 SSH 隧道。有了这个隧道,你就可以从中继主机中连接“回”家庭服务器(这就是为什么称之为 “反向” 隧道)。不管你在哪里、你的家庭网络中的 NAT 或 防火墙限制多么严格,只要你可以访问中继主机,你就可以连接到家庭服务器。

在 Linux 上设置反向 SSH 隧道

让我们来看看怎样创建和使用反向 SSH 隧道。我们做如下假设:我们会设置一个从家庭服务器(homeserver)到中继服务器(relayserver)的反向 SSH 隧道,然后我们可以通过中继服务器从客户端计算机(clientcomputer) SSH 登录到家庭服务器。本例中的中继服务器 的公网 IP 地址是 1.1.1.1。

在家庭服务器上,按照以下方式打开一个到中继服务器的 SSH 连接。


  1. homeserver~$ ssh -fN -R 10022:localhost:22 relayserver_user@1.1.1.1

这里端口 10022 是任何你可以使用的端口数字。只需要确保中继服务器上不会有其它程序使用这个端口。

“-R 10022:localhost:22” 选项定义了一个反向隧道。它转发中继服务器 10022 端口的流量到家庭服务器的 22 号端口。

用 “-fN” 选项,当你成功通过 SSH 服务器验证时 SSH 会进入后台运行。当你不想在远程 SSH 服务器执行任何命令,就像我们的例子中只想转发端口的时候非常有用。

运行上面的命令之后,你就会回到家庭主机的命令行提示框中。

登录到中继服务器,确认其 127.0.0.1:10022 绑定到了 sshd。如果是的话就表示已经正确设置了反向隧道。


  1. relayserver~$ sudo netstat -nap | grep 10022


  1. tcp 0 0 127.0.0.1:10022 0.0.0.0:* LISTEN 8493/sshd

现在就可以从任何其它计算机(客户端计算机)登录到中继服务器,然后按照下面的方法访问家庭服务器。


  1. relayserver~$ ssh -p 10022 homeserver_user@localhost

需要注意的一点是你在上面为localhost输入的 SSH 登录/密码应该是家庭服务器的,而不是中继服务器的,因为你是通过隧道的本地端点登录到家庭服务器,因此不要错误输入中继服务器的登录/密码。成功登录后,你就在家庭服务器上了。

通过反向 SSH 隧道直接连接到网络地址变换后的服务器

上面的方法允许你访问 NAT 后面的 家庭服务器,但你需要登录两次:首先登录到 中继服务器,然后再登录到家庭服务器。这是因为中继服务器上 SSH 隧道的端点绑定到了回环地址(127.0.0.1)。

事实上,有一种方法可以只需要登录到中继服务器就能直接访问NAT之后的家庭服务器。要做到这点,你需要让中继服务器上的 sshd 不仅转发回环地址上的端口,还要转发外部主机的端口。这通过指定中继服务器上运行的 sshd 的 GatewayPorts 实现。

打开中继服务器的 /etc/ssh/sshd_config 并添加下面的行。


  1. relayserver~$ vi /etc/ssh/sshd_config


  1. GatewayPorts clientspecified

重启 sshd。

基于 Debian 的系统:


  1. relayserver~$ sudo /etc/init.d/ssh restart

基于红帽的系统:


  1. relayserver~$ sudo systemctl restart sshd

现在在家庭服务器中按照下面方式初始化一个反向 SSH 隧道。


  1. homeserver~$ ssh -fN -R 1.1.1.1:10022:localhost:22 relayserver_user@1.1.1.1

登录到中继服务器然后用 netstat 命令确认成功建立的一个反向 SSH 隧道。


  1. relayserver~$ sudo netstat -nap | grep 10022


  1. tcp 0 0 1.1.1.1:10022 0.0.0.0:* LISTEN 1538/sshd: dev

不像之前的情况,现在隧道的端点是 1.1.1.1:10022(中继服务器的公网 IP 地址),而不是 127.0.0.1:10022。这就意味着从外部主机可以访问隧道的另一端。

现在在任何其它计算机(客户端计算机),输入以下命令访问网络地址变换之后的家庭服务器。


  1. clientcomputer~$ ssh -p 10022 homeserver_user@1.1.1.1

在上面的命令中,1.1.1.1 是中继服务器的公共 IP 地址,homeserver_user必须是家庭服务器上的用户账户。这是因为你真正登录到的主机是家庭服务器,而不是中继服务器。后者只是中继你的 SSH 流量到家庭服务器。

在 Linux 上设置一个永久反向 SSH 隧道

现在你已经明白了怎样创建一个反向 SSH 隧道,然后把隧道设置为 “永久”,这样隧道启动后就会一直运行(不管临时的网络拥塞、SSH 超时、中继主机重启,等等)。毕竟,如果隧道不是一直有效,你就不能可靠的登录到你的家庭服务器。

对于永久隧道,我打算使用一个叫 autossh 的工具。正如名字暗示的,这个程序可以让你的 SSH 会话无论因为什么原因中断都会自动重连。因此对于保持一个反向 SSH 隧道非常有用。

第一步,我们要设置从家庭服务器到中继服务器的无密码 SSH 登录。这样的话,autossh 可以不需要用户干预就能重启一个损坏的反向 SSH 隧道。

下一步,在建立隧道的家庭服务器上安装 autossh

在家庭服务器上,用下面的参数运行 autossh 来创建一个连接到中继服务器的永久 SSH 隧道。


  1. homeserver~$ autossh -M 10900 -fN -o "PubkeyAuthentication=yes" -o "StrictHostKeyChecking=false" -o "PasswordAuthentication=no" -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R 1.1.1.1:10022:localhost:22 relayserver_user@1.1.1.1

“-M 10900” 选项指定中继服务器上的监视端口,用于交换监视 SSH 会话的测试数据。中继服务器上的其它程序不能使用这个端口。

“-fN” 选项传递给 ssh 命令,让 SSH 隧道在后台运行。

“-o XXXX” 选项让 ssh:

  • 使用密钥验证,而不是密码验证。
  • 自动接受(未知)SSH 主机密钥。
  • 每 60 秒交换 keep-alive 消息。
  • 没有收到任何响应时最多发送 3 条 keep-alive 消息。

其余 SSH 隧道相关的选项和之前介绍的一样。

如果你想系统启动时自动运行 SSH 隧道,你可以将上面的 autossh 命令添加到 /etc/rc.local。

总结

在这篇博文中,我介绍了你如何能从外部通过反向 SSH 隧道访问限制性防火墙或 NAT 网关之后的 Linux 服务器。这里我介绍了家庭网络中的一个使用事例,但在企业网络中使用时你尤其要小心。这样的一个隧道可能被视为违反公司政策,因为它绕过了企业的防火墙并把企业网络暴露给外部攻击。这很可能被误用或者滥用。因此在使用之前一定要记住它的作用。

原文发布时间为:2015-08-08



本文来自合作伙伴“Linux中国

时间: 2024-12-31 19:45:20

如何通过反向 SSH 隧道访问 NAT 后面的 Linux 服务器的相关文章

使用 NAT 穿透访问 NAT 后面的 HTTP Server 还是用更加简单的方式?

这篇文章整整拖了 5 个月,生成的 timestamp 原来是 2 月 7 的,现在都 7 月了... 其实本来是一个很简单的 C/S 模型,机器人 HTTP Server 是应对机器人上本地局域网中的一个客户端(Web,桌面,安卓/iOS).客户端连上机器的局域网,然后通过局域网的 IP 地址,访问机器人上的 HTTP Server,控制机器人. 但是后面有一个需求是,当机器人插上一个 3/4 G 网卡的时候,要复用机器人上的 HTTP Server 远程控制和访问机器人.那问题来了,该如何访

用OWA访问ISA后面的EXCHANGE SERVER?

用OWA访问ISA后面的EXCHANGE SERVER,除了在ISA上配置安全http://www.aliyun.com/zixun/aggregation/12489.html">邮件服务器外,还需要ISA开放什么特殊的端口吗? 具体情况如下: 公司的局域网通过光纤接入城域网,ISA的对外IP地址设置的是城域网的IP地址,通过在ISA上配置安全邮件服务器,在城域网内可以通过OWA以IP/EXCHANGE的形式访问公司内部的EXCHANGE SERVER(此处的IP为ISA在城域网的IP)

Windwos下使用winscp和批处理实现通过SSH端口上传文件到Linux服务器上_DOS/BAT

Windwos下使用winscp和批处理实现通过SSH端口上传文件到Linux服务器上 今天同事想在windows上使用winscp上传文件到linux服务器上,又想偷懒想使用批处理来进行上传,还好只固定上传一个php文件,多了还真不好搞. 1.下载winscp 大家可以去网上自己找,我把winscp安装在c:下的 2.把要执行的命令保存到文件winscp.bat里,这个winscp.bat可以自己创建,我是放在d:下的. winscp.bat脚本内容: 复制代码 代码如下: option co

通过SSH在位于F5后面的SUSE Linux上配置jdk和tomcat

JDK的安装 下载JDK:事先找到的jdk下载位置复制到剪贴板,用Putty通过SSH连到服务器,找个合适的位置准备下载JDK安装文件,如"/usr/java ",然后在此目录中输入: server:/usr/java # wget http://www.sun.com/....../jdk-6u13-linux-x64-rpm.bin 回车后即会开始下载. 安装:执行server:/usr/java # ./jdk-6u13-linux-x64-rpm.bin,会自动解压并安装,这个

学习ssh之ssh隧道应用

前几篇有关ssh的文章,我们只是介绍了ssh的登录功能.其实ssh功能不只是这些,这篇文章我们来介绍下有关ssh隧道的功能. ssh隧道也叫ssh端口转发,或者叫ssh tunnel,这些都是说的是ssh隧道功能.在此,我们统称为ssh隧道. ssh隧道分为正向隧道和反向隧道,在实际工作中我们可以根据需要来随其分别使用. 下面开始对正向和反向隧道分别介绍下,由于使用平台的不同,我们分为Linux和windows平台. 一.ssh正向隧道 什么是ssh正向隧道? 就是client连上server后

ssh隧道及转发技术应用场景三例

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1318975 ssh隧道技术在实际环境中时不时都会用到,最近一段时间以下三种方式都有用到过.原因就是各现场网络环境的多种多样,下面分别介绍三种应用场景.有可以通过ssh命令来实现,也可以通过SSH工具来实现,本文采用secureCRT工具来实现,仅以此做一下记录与整理,通常一些小的技能解决大问题. 本文连接:http://

如何通过SSH隧道实现 Windows Pass the Ticket攻击?

本文讲的是如何通过SSH隧道实现 Windows Pass the Ticket攻击?, 攻击者所使用基于NTLM哈希的哈希传递攻击以及基于Kerberos票据的票据传递攻击(pass-the-ticket,以下简称PtT)来访问用户主机或服务器是非常简单的,最常见的手段就是使用黄金票据(Golden Ticket)和银票据(Silver Ticket),不过本文要为大家介绍一个新办法,就是通过SSH 隧道实现PtT攻击 ,当然这个办法较前两种也比较复杂. 在今年举办的环太平洋大学网络防御竞赛(

Linux 有问必答:如何从VirtualBox中从主机访问NAT客户机

Linux 有问必答:如何从VirtualBox中从主机访问NAT客户机 提问: 我有一台运行在VirtualBox上的使用NAT的虚拟机,因此虚拟机会被VirtualBox分配一个私有IP地址(10.x.x.x).如果我想要从主机SSH到虚拟机中,我该怎么做? VirtualBox对虚拟机支持几种不同的网络方式,其中一种是NAT网络.当虚拟机启用NAT后,VirtualBox会自动在虚拟机和主机之间进行网络翻译,因此你不必在虚拟机和主机之间配置任何东西.这也意味着NAT中的虚拟机对于外部网络以

如何配置SSH来访问PIX防火墙

为了配置SSH来访问PIX,我们需要完成两组独立服务. ·配置PIX来接受SSH连接. ·配制我们的SSH客户端来连接到PIX. 1.下边开始配置PIX来接受SSH连接 pixfirewall(config)#hostname testdomain testdomain (config)#domain-name testdomain.com 为PIX分配主机名和域名.要想产生RSA密钥集,这是必需的. testdomain (config)#ca generate rsa key 2048 ca