本文是:SSH Tunnel - Local and Remote Port Forwarding Explained With Examples 的译文

  有两种方法可以创建SSH隧道,本地和远程端口转发(也有动态转发,但我们不在这里讨论)。最好的理解方法是通过一个示例,让我们从本地端口转发开始。

本地端口转发

  假设您处于一个不允许连接到特定服务器的专用网络上。比方说,你在工作,imgur.com被封锁。为了绕过这个,我们可以通过一台服务器创建一个不在我们的工作网络的隧道,从而可以访问Imgur。

$ ssh -L 9000:imgur.com:80 user@example.com

  这里的关键是-L选项, 告诉我们正在进行本地端口转发,将端口9000转发到imgur.com:80, 80是HTTP的默认端口。现在,只需要打开浏览器然后访问:

http://localhost:9000

  SSH隧道的好处在于它们是加密的。没有人会看到你访问的网站,他们只看到SSH连接到你的服务器。

连接到防火墙后面的数据库

  另一个很好的例子是,如果你需要访问服务器端口,且只能从本地主机访问,而不能远程访问。

  这里的一个例子是当您需要连接到数据库控制台时,出于安全上的考虑,仅允许本地连接。 假设您在服务器上运行PostgreSQL,默认情况下在端口5432上监听。

ssh -L 9000:localhost:5432 user@example.com

  在这里更改的部分是localhost:5432,它表示将连接从本地端口9000转发到服务器的5432端口。 现在我们可以直接连接到我们的数据库。

psql -h localhost -p 9000

  现在让我们在这里停下来一点点解释实际发生了什么。 在第一个例子中,9000:imgur.com:80实际上是将本地端口9000转发到imgur.com端口80。您可以想象您的服务器上的SSH实际上是在两个端口之间建立连接(一个隧道),一个在您的本地机器,一个在目标机上。

  但是如果我们说的是9000:localhost:5432,那就意味着从服务器的角度来看localhost,而不是本机上的localhost。 这意味着将本地端口9000转发到服务器上的端口5432,因为当您在服务器上时,localhost表示服务器本身。[因为这里,ssh登陆到目标机器上]

  这可能让人有点困惑,但重要的是要了解语法实际上意味着什么。 

远程端口转发

  现在是本教程的第二部分,远程端口转发。 这最好以一个例子来解释。  

  假设您正在本地计算机上开发Rails应用程序,并且希望将其显示给朋友。 不幸的是,您的ISP没有为您提供公共IP地址,因此无法通过互联网直接连接到您的计算机。

  有时这可以通过在您的路由器上配置NAT(网络地址转换,其实就是在路由器上做内网端口映射,也即端口转发)来解决,但这并不总是能够正常工作,并且需要您更改路由器上的配置,这并不总是可取的。 当您的网络上没有管理员访问权限时,此解决方案也不起作用。

  要解决这个问题,您需要另一台可以公开访问并具有SSH访问权限的计算机。 只要您可以连接到互联网上,它可以是任何服务器。 我们会告诉SSH在服务器上打开一个新端口的隧道,并将其连接到本机端口。

ssh -R 9000:localhost:3000 user@example.com

  这里的语法非常类似于本地端口转发,将-L变成-R。 但是与本地端口转发一样,语法保持不变。

  首先,您需要指定远程服务器将侦听的端口,在这里为9000,接下来的本地机器的本地端口(在这种情况下为3000)。

  还有一件事情你需要做,以实现这一点。 SSH不默认允许远程主机转发端口。 要启用,需要打开配置文件:/etc/ssh/ssh_config,并在配置文件中某个地方添加以下行:

$ sudo vim /etc/ssh/sshd_config
GatewayPorts yes

  确保你只添加了一次。重启SSH服务:

sudo service ssh restart

  此后,您应该能够远程连接到服务器,甚至可以从本地计算机连接到服务器。 这样做的方式是您首先创建一个SSH通道,将流量从端口9000上的服务器转发到端口3000上的本地计算机。这意味着如果您从本地计算机连接到端口9000上的服务器, 实际上通过SSH隧道向您的机器发出请求。

一些小提示

  您可能已经注意到,每次创建一个隧道时,您也可以将SSH登录到服务器并获得一个shell。 这通常不是必需的,因为您只是想创建一个隧道。 为了避免这种情况,我们可以使用-nNT标志运行SSH,如下所示,这将导致SSH不分配tty,只能做端口转发。

ssh -nNT -L 9000:imgur.com:80 user@example.com

  SSH有很多功能,所以建议您在man ssh上检查手册页面,其中包含更多提示。

【例】映射巡风扫描器到外网

  其实我要做的是将内网部署的web服务,通过外网ip能够访问,VPS你懂的,又贵,所以不能完全将一个很大的东西放在VPS上...

  本想映射乌云镜像的,无奈不在本机上...

  现在有的是一个内网机器上的巡风扫描系统:http://192.168.1.108/login     一个可SSH登陆的VPS:165.227.29.209

  VPS上还搭建了一个DVWA: http://165.227.29.209/dvwa/login.php

  现在就想在VPS上做一个远程端口转发,通过访问VPS上的端口就能直接访问到本地的服务。

Step 1: 登陆配置SSH

starnight:~ starnight$ ssh root@165.227.29.209
root@165.227.29.209's password: [input your login password here]
root@ubuntu-512mb-sfo2-01:~# ifconfig eth0 | grep inet
    inet addr:165.227.29.209 Bcast:165.227.31.255 Mask:255.255.240.0
    inet6 addr: fe80::5446:75ff:fe13:726e/64 Scope:Link
root@ubuntu-512mb-sfo2-01:~# vim /etc/ssh/sshd_config 

  在你喜欢的地方加上下面这行, 记住,只能出现一次。

    

  重启SSH服务:

root@ubuntu-512mb-sfo2-01:~# service ssh restart

Step 2: 远程端口转发

  在你需要将web服务映射出去的机器上运行如下命令:

root@starnight:~# ifconfig ens33 | grep inet
root@starnight:~# ssh -R 8080:localhost:80 root@165.227.29.209

  因为VPS上的80端口已经部署了dvwa,现使用8080端口:

Step 3: 访问测试

  访问远程VPS的8080端口:http://165.227.29.209:8080/login

  这样就能通过外部ip访问到本地机器上部署的服务了。


SSH连接不掉线

  用SSH进行连接有个小问题就是过段时间之后,ssh连接会断开,当然服务器不可能让ssh连接一直保持的。如果想一直保持ssh连接的话,可以参考如下解决方案。

打开服务器 /etc/ssh/sshd_config,我在最后增加一行
ClientAliveInterval
ClientAliveCountMax

  再重启一下SSH服务器:

service sshd restart

SSH不get shell

  一般来讲,如果我们只需要进行端口转发,而不需要拿到一个shell的话,可以设置一个选项:-nNT

$ ssh -nNT -L :imgur.com: user@example.com

【译】SSH隧道:本地和远程端口转发的更多相关文章

  1. ssh命令:隧道代理+本地端口转发+远程端口转发

        0.前言 nc是一个在网络连接两端的好工具,同时也是也个临时的端口转发的好工具.(永久的端口转发用什么?用iptables) ssh也是这方面的好工具,好处是加密可靠可复用在一端操作即可,代价 ...

  2. SSH的本地、远程、动态端口转发实验笔记

    SSH端口转发 SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据.但是,SSH 还能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务.这一 ...

  3. [Linux] SSH隧道本地端口转发访问远程服务中的数据库

    当我的本地没有安装任何数据库服务的时候,可以直接通过我本地的端口访问远程机器上的数据库服务,实现这样的效果就可以使用本地转发功能 实际测试本地端口转发,把本地的9006端口转发给远程服务器的115.1 ...

  4. ssh远程端口转发&&windows系统提权之信息收集&&网安工具分享(部分)

    一.ssh远程端口转发 背景:当我们在渗透过程中,获取到内网的一台仅有内网IP的服务器后,我们可以通过ssh隧道,将内网某个主机的端口进行远程转发 1.网络拓扑图 假设获取的服务器为web服务器,we ...

  5. SSH 远程端口转发

    既然"本地端口转发"是指绑定本地端口的转发,那么"远程端口转发"(remote forwarding)当然是指绑定远程端口的转发. 还是接着看上面那个例子,ho ...

  6. SSH远程端口转发实战详解

    问题 前段时间在外地没有在实验室,随身携带了一个笔记本电脑.但是笔记本性能不够,想用SSH远程连接实验室的电脑.问如何连接?现有以下设备 设备 IP 备注 系统 实验室电脑C1 192.168.0.2 ...

  7. ssh远程端口转发

    当ssh的连接方向和应用连接的方向不一致时,这就称为ssh远程转发. 主机3是一台web server 应用请求是主机2到主机1 ssh请求是主机1到主机2 主机2开启ssh服务 service ss ...

  8. 用SSH解决大局域网反向端口转发问题

    本文作者Tony Lee,转载自FreeBuf.COM ​​自从家里换了联通光纤后,联通就在我家宽带出口前搭了一个路由器,我家也彻底沦为192.168.1.0/24段的局域网了,带来的问题就是在外网无 ...

  9. iptables实现端口映射(本地和远程端口映射)

    说明:需要将外网访问本地IP(192.168.75.5)的80端口转换为访问192.168.75.3的8000端口,这就需要用到iptables的端口映射 实现:1. 需要先开启linux的数据转发功 ...

随机推荐

  1. 视频剪辑软件-PR (Adobe Premiere)

    1.PR 是什么? Adobe Premiere 是一款常用的视频编辑软件,由Adobe公司推出.PR是一款编辑画面质量较好的软件,有较好的兼容性,且可以与Adobe公司推出的其他软件相互协作.目前这 ...

  2. [51CTO]给您介绍Windows10各大版本之间区别

    给您介绍Windows10各大版本之间区别 随着win10的不断普及和推广,越来越多的朋友想安装win10系统了,但是很多朋友不知道win10哪个版本好用,为了让大家能够更好的选择win10系统版本, ...

  3. 一个Flume 异常(Put queue for MemoryTransaction of capacity 100 full)的排查和解决思路

    最近在做一个分布式调用链跟踪系统, 在两个地方采用了flume (我使用的flume版本是1.5.0-cdh5.4.4),一个是宿主系统 ,用flume agent进行日志搜集. 一个是从kafka拉 ...

  4. screen.height && screen.width

    screen.height && screen.width how to get window max width in js screen.height; screen.width; ...

  5. delphi(假三层之数据访问层)(第一天)

    本论文主要是通过三天来讲解三层的结构,今天是第一天,先讲解一下delphi下的Models层,我主要封装了两个查询得到数据集的函数,主要是通过在表示层上创建的数数据集控件传递进来,通过业务逻辑对语句的 ...

  6. Java的checked exception与unchecked exception

    在Java中exception分为checked exception和unchecked异常,两者有什么区别呢? 从表象来看, checked异常就是需要在代码中try ... catch ...的异 ...

  7. 第217天:深入理解Angular双向数据绑定的原理

    一.理解angular双向数据绑定 双向绑定是新的前端框架中频繁出现的一个新词汇,也是mvvm的核心原理.angularjs五条核心信念中的数据驱动,便是由双向绑定进行完成. 那么什么是双向绑定,下面 ...

  8. 【uoj#280】[UTR #2]题目难度提升 对顶堆+STL-set

    题目描述 给出 $n$ 个数 $a_1,a_2,...,a_n$ ,将其排为序列 $\{p_i\}$ ,满足 $\{前\ i\ 个数的中位数\}$ 单调不降.求字典序最大的 $\{p_i\}$ . 其 ...

  9. 内容显示在HTML页面底端的一些处理方式

    1.概要: 手机页面底端有时候需要显示版权信息,诸如一行文字或者一个背景图片,但是页面的滚动长度未知,需要考虑两个问题 当页面高度小于屏幕高度时候: 希望最后一行信息显示在屏幕底端,同时也就是页面底端 ...

  10. XML外部实体(XXE)注入详解

    ###XML与xxe注入基础知识 1.XMl定义 XML由3个部分构成,它们分别是:文档类型定义(Document Type Definition,DTD),即XML的布局语言:可扩展的样式语言(Ex ...