`

linux端口映射 ssh命令

 
阅读更多

在开发过程中,因为网络环境的原因,需要通过某一台服务器访问其他服务器的一些端口,这里就涉及到端口映射的问题。

 

当前自己现状及需求

1.本地机器window系统,有CRT工具
2.本地通过CRT可以通过Internet访问到内网中的机器172.18.1.34

3.但是本地通过CRT访问不到内网中的机器172.18.1.144

 

需求是想在本地访问172.18.1.144上web应用对应端口是80

 

解决过程:

1.通过CRT登陆到172.18.1.34 机器上执行:ssh -C -f -N -g -L 8080:127.0.0.1:80 172.18.1.144

   目的 把144的80端口映射到 34的8080上

 

2.在本地的CRT上做端口转发,把34上的8080端口映射到本地的8080上

  

     CRT 端口转发设置

 

 

 

端口转发概述

让我们先来了解一下端口转发的概念吧。我们知道,SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还同时提供了一个非常有用的功能,这就是端口转发。它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程有时也被叫做“隧道”(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果您工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,那么也是能够通过将 TCP 端口转发来使用 SSH 进行通讯。总的来说 SSH 端口转发能够提供两大功能:

  1. 加密 SSH Client 端至 SSH Server 端之间的通讯数据。
  2. 突破防火墙的限制完成一些之前无法建立的 TCP 连接。


图 1. SSH 端口转发
 

如上图所示,使用了端口转发之后,TCP 端口 A 与 B 之间现在并不直接通讯,而是转发到了 SSH 客户端及服务端来通讯,从而自动实现了数据加密并同时绕过了防火墙的限制。


第二部分 本地转发与远程转发

本地转发实例分析

我们先来看第一个例子,在实验室里有一台 LDAP 服务器(LdapServerHost),但是限制了只有本机上部署的应用才能直接连接此 LDAP 服务器。如果我们由于调试或者测试的需要想临时从远程机器(LdapClientHost)直接连接到这个 LDAP 服务器 , 有什么方法能够实现呢?

答案无疑是本地端口转发了,它的命令格式是:

 

ssh -L <local port>:<remote host>:<remote port> <SSH hostname>

在 LdapClientHost 上执行如下命令即可建立一个 SSH 的本地端口转发,例如:

 

$ ssh -L 7001:localhost:389 LdapServerHost



图 2. 本地端口转发
 

这里需要注意的是本例中我们选择了 7001 端口作为本地的监听端口,在选择端口号时要注意非管理员帐号是无权绑定 1-1023 端口的,所以一般是选用一个 1024-65535 之间的并且尚未使用的端口号即可。

然后我们可以将远程机器(LdapClientHost)上的应用直接配置到本机的 7001 端口上(而不是 LDAP 服务器的 389 端口上)。之后的数据流将会是下面这个样子:

  • 我们在 LdapClientHost 上的应用将数据发送到本机的 7001 端口上,
  • 而本机的 SSH Client 会将 7001 端口收到的数据加密并转发到 LdapServertHost 的 SSH Server 上。
  • SSH Server 会解密收到的数据并将之转发到监听的 LDAP 389 端口上,
  • 最后再将从 LDAP 返回的数据原路返回以完成整个流程。

我们可以看到,这整个流程应用并没有直接连接 LDAP 服务器,而是连接到了本地的一个监听端口,但是 SSH 端口转发完成了剩下的所有事情,加密,转发,解密,通讯。

这里有几个地方需要注意:

  1. SSH 端口转发是通过 SSH 连接建立起来的,我们必须保持这个 SSH 连接以使端口转发保持生效。一旦关闭了此连接,相应的端口转发也会随之关闭。
  2. 我们只能在建立 SSH 连接的同时创建端口转发,而不能给一个已经存在的 SSH 连接增加端口转发。
  3. 你可能会疑惑上面命令中的 <remote host> 为什么用 localhost,它指向的是哪台机器呢?在本例中,它指向 LdapServertHost 。我们为什么用 localhost 而不是 IP 地址或者主机名呢?其实这个取决于我们之前是如何限制 LDAP 只有本机才能访问。如果只允许 lookback 接口访问的话,那么自然就只有 localhost 或者 IP 为 127.0.0.1 才能访问了,而不能用真实 IP 或者主机名。
  4. 命令中的 <remote host> 和 <SSH hostname> 必须是同一台机器么?其实是不一定的,它们可以是两台不同的机器。我们在后面的例子里会详细阐述这点。
  5. 好了,我们已经在 LdapClientHost 建立了端口转发,那么这个端口转发可以被其他机器使用么?比如能否新增加一台 LdapClientHost2 来直接连接 LdapClientHost 的 7001 端口?答案是不行的,在主流 SSH 实现中,本地端口转发绑定的是 lookback 接口,这意味着只有 localhost 或者 127.0.0.1 才能使用本机的端口转发 , 其他机器发起的连接只会得到“ connection refused. ”。好在 SSH 同时提供了 GatewayPorts 关键字,我们可以通过指定它与其他机器共享这个本地端口转发。
    ssh -g -L <local port>:<remote host>:<remote port> <SSH hostname>

远程转发实例分析

我们来看第二个例子,这次假设由于网络或防火墙的原因我们不能用 SSH 直接从 LdapClientHost 连接到 LDAP 服务器(LdapServertHost),但是反向连接却是被允许的。那此时我们的选择自然就是远程端口转发了。

它的命令格式是:

 

ssh -R <local port>:<remote host>:<remote port> <SSH hostname>

例如在 LDAP 服务器(LdapServertHost)端执行如下命令:

 

$ ssh -R 7001:localhost:389 LdapClientHost



图 3. 远程端口转发
 

和本地端口转发相比,这次的图里,SSH Server 和 SSH Client 的位置对调了一下,但是数据流依然是一样的。我们在 LdapClientHost 上的应用将数据发送到本机的 7001 端口上,而本机的 SSH Server 会将 7001 端口收到的数据加密并转发到 LdapServertHost 的 SSH Client 上。 SSH Client 会解密收到的数据并将之转发到监听的 LDAP 389 端口上,最后再将从 LDAP 返回的数据原路返回以完成整个流程。

看到这里,你是不是会有点糊涂了么?为什么叫本地转发,而有时又叫远程转发?这两者有什么区别?

本地转发与远程转发的对比与分析

不错,SSH Server,SSH Client,LdapServertHost,LdapClientHost,本地转发,远程转发,这么多的名词的确容易让人糊涂。让我们来分析一下其中的结构吧。首先,SSH 端口转发自然需要 SSH 连接,而 SSH 连接是有方向的,从 SSH Client 到 SSH Server 。而我们的应用也是有方向的,比如需要连接 LDAP Server 时,LDAP Server 自然就是 Server 端,我们应用连接的方向也是从应用的 Client 端连接到应用的 Server 端。如果这两个连接的方向一致,那我们就说它是本地转发。而如果两个方向不一致,我们就说它是远程转发。

我们可以回忆上面的两个例子来做个对照。

本地转发时:

LdapClientHost 同时是应用的客户端,也是 SSH Client,这两个连接都从它指向 LdapServertHost(既是 LDAP 服务端,也是 SSH Server)。

远程转发时:

LdapClientHost 是应用的客户端,但却是 SSH Server ;而 LdapServertHost 是 LDAP 的服务端,但却是 SSH Client 。这样两个连接的方向刚好相反。

另一个方便记忆的方法是,Server 端的端口都是预定义的固定端口(SSH Server 的端口 22,LDAP 的端口 389),而 Client 端的端口都是动态可供我们选择的端口(如上述例子中选用的 7001 端口)。如果 Server 端的两个端口都在同一台机器,Client 端的两个端口都在另一台机器上,那么这就是本地连接;如果这四个端口交叉分布在两个机器上,每台机器各有一个 Server 端端口,一个 Client 端端口,那就是远程连接。

弄清楚了两者的区别之后,再来看看两者的相同之处。如果你所在的环境下,既允许 LdapClientHost 发起 SSH 连接到 LdapServerHost,也允许 LdapServerHost 发起 SSH 连接到 LdapClientHost 。那么这时我们选择本地转发或远程转发都是可以的,能完成一样的功能。

接着让我们来看个进阶版的端口转发。我们之前涉及到的各种连接 / 转发都只涉及到了两台机器,还记得我们在本地转发中提到的一个问题么?本地转发命令中的 <remote host> 和 <SSH hostname> 可以是不同的机器么?

 

ssh -L <local port>:<remote host>:<remote port> <SSH hostname>

答案是可以的!让我们来看一个涉及到四台机器 (A,B,C,D) 的例子。


图 4. 多主机转发应用
 

在 SSH Client(C) 执行下列命令来建立 SSH 连接以及端口转发:

 

$ ssh -g -L 7001:<B>:389 <D>

然后在我们的应用客户端(A)上配置连接机器(C )的 7001 端口即可。注意我们在命令中指定了“ -g ”参数以保证机器(A)能够使用机器(C)建立的本地端口转发。而另一个值得注意的地方是,在上述连接中,(A)<-> (C) 以及 (B)<->(D) 之间的连接并不是安全连接,它们之间没有经过 SSH 的加密及解密。如果他们之间的网络并不是值得信赖的网络连接,我们就需要谨慎使用这种连接方式了。


第三部分 其他类型的转发

动态转发实例分析

恩,动态转发,听上去很酷。当你看到这里时,有没有想过我们已经讨论过了本地转发,远程转发,但是前提都是要求有一个固定的应用服务端的端口号,例如前面例子中的 LDAP 服务端的 389 端口。那如果没有这个端口号怎么办?等等,什么样的应用会没有这个端口号呢?嗯,比如说用浏览器进行 Web 浏览,比如说 MSN 等等。

当我们在一个不安全的 WiFi 环境下上网,用 SSH 动态转发来保护我们的网页浏览及 MSN 信息无疑是十分必要的。让我们先来看一下动态转发的命令格式:

 

$ ssh -D <local port> <SSH Server>

例如:

 

$ ssh -D 7001 <SSH Server>



图 5. 动态端口转发
 

似乎很简单,我们依然选择了 7001 作为本地的端口号,其实在这里 SSH 是创建了一个 SOCKS 代理服务。来看看帮助文档中对 -D 参数的描述:

 

-D port 
 This works by allocating a socket to listen to port on the local 
 side, and whenever a connection is made to this port, the con- 
 nection is forwarded over the secure channel, and the applica- 
 tion protocol is then used to determine where to connect to from 
 the remote machine.  Currently the SOCKS4 and SOCKS5 protocols 
 are supported, and ssh will act as a SOCKS server.  Only root 
 can forward privileged ports.  Dynamic port forwardings can also 
 be specified in the configuration file.

之后的使用就简单了,我们可以直接使用 localhost:7001 来作为正常的 SOCKS 代理来使用,直接在浏览器或 MSN 上设置即可。在 SSH Client 端无法访问的网站现在也都可以正常浏览。而这里需要值得注意的是,此时 SSH 所包护的范围只包括从浏览器端(SSH Client 端)到 SSH Server 端的连接,并不包含从 SSH Server 端 到目标网站的连接。如果后半截连接的安全不能得到充分的保证的话,这种方式仍不是合适的解决方案。

X 协议转发实例分析

好了,让我们来看最后一个例子 - X 协议转发。

我们日常工作当中,可能会经常会远程登录到 Linux/Unix/Solaris/HP 等机器上去做一些开发或者维护,也经常需要以 GUI 方式运行一些程序,比如要求图形化界面来安装 DB2/WebSphere 等等。这时候通常有两种选择来实现:VNC 或者 X 窗口,让我们来看看后者。

使用 X 窗口通常需要分别安装:X Client 和 X Server 。在本例中我们的 X Client 就是所访问的远程 Linux/Unix/Solaris/HP,而我们的 X Server 则是发起访问的本地机器(例如你面前正在使用的笔记本或台式机)。把 X Client 端的 X 窗口显示在 X Server 端需要先行在 X Client 端指定 X Server 的位置,命令格式如下:

 

export DISPLAY=<X Server IP>:<display #>.<virtual #>

例如:

 

export DISPLAY=myDesktop:1.0

然后直接运行 X 应用即可,X 窗口就会自动在我们的本地端打开。

一切运行正常,但是,这时候 IT 部门突然在远程 Linux/Unix/Solaris/HP 前面加了一道防火墙。非常不幸的是,X 协议并不在允许通过的列表之内。怎么办?只能使用 VNC 了么?不,其实只要使用了 SSH 端口转发即可通过,同时也对 X 通讯数据做了加密,真是一举两得。(当然,使用此方法前最好先咨询相关 IT 部门是否符合相应的安全条例,以免造成违规操作。)

建立命令也很简单,直接从本地机器(X Server 端)发起一个如下的 SSH 连接即可:

 

$ ssh -X <SSH Server>



图 5. X 转发
 

建立连接之后就可以直接运行远程的 X 应用。注意建立 X 转发之后会自动设置 DISPLAY 环境变量,通常会被设置成localhost:10.0,我们无需也不应该在连接之后再进行修改此环境变量。

一个比较常见的场景是,我们的本地机器是 Windows 操作系统,这时可以选择开源的 XMing 来作为我们的 XServer,而 SSH Client 则可以任意选择了,例如 PuTTY,Cygwin 均可以配置 访问 SSH 的同时建立 X 转发。


第四部分 总结

至此,我们已经完成了本地端口转发,远程端口转发,动态端口转发以及 X 转发的介绍。回顾起来,总的思路是通过将 TCP 连接转发到 SSH 通道上以解决数据加密以及突破防火墙的种种限制。对一些已知端口号的应用,例如 Telnet/LDAP/SMTP,我们可以使用本地端口转发或者远程端口转发来达到目的。动态端口转发则可以实现 SOCKS 代理从而加密以及突破防火墙对 Web 浏览的限制。对于 X 应用,无疑是 X 转发最为适用了。虽然每一部分我们都只是简单的介绍了一下,但如果能灵活应用这些技巧,相信对我们的日常生活 / 工作也是会有所帮助的。

<!-- CMA ID: 442463 --><!-- Site ID: 10 --><!-- XSLT stylesheet used to transform this file: dw-article-6.0-beta.xsl -->

参考资料

作者简介

申毅,IBM中国软件开发中心 WebSphere Portal 部门软件工程师。目前从事于 WebSphere Portal z/OS 升级包的开发工作。同时较为关注 Linux/Mac 平台上的相关技术。

邵华,IBM中国软件开发中心 WebSphere Portal 部门软件工程师。目前从事于 WebSphere Portal FVT 的相关工作,对 Linux 及 Web 相关技术较为关注。

 

 

分享到:
评论

相关推荐

    在Linux系统下使用SSH实现端口映射的方法.docx

    在Linux系统下使用SSH实现端口映射的方法.docx

    linux-iOS免密登录ssh自动打开端口映射自动签名debugserver一键调试一键shell等

    自动登录ssh,自动打开端口映射,自动签名debugserver,一键调试,一键shell等等

    putty代理设置,映射远程服务器端口至本地

    通过SSH连接至linux服务器上,并将未开放远程访问权限机器端口映射至本地机器。

    nat123动态域名解析P2P全端口映射 v1.151123.zip

    WINDOWS远程桌面,SSH访问LINUX,路由器 (3)数据库。ORACLE,SQLSERVER,MYSQL (4)FTP。 (5)其他 nat123全端口映射p2p穿透动态域名解析 v1.151123更新: 1、增加自检提示知识库。 2、优化端到端通信协议,...

    菜鸟学Linux命令:ssh命令(远程登录)

    使用ssh -V命令可以得到版本号。需要注意的是,Linux一般自带的是OpenSSH: 下面的例子即表明该系统正在使用OpenSSH: $ ssh -V OpenSSH_3.9p1, OpenSSL 0.9.7a Feb 19 2003 下面的例子表明该系统正在使用SSH2: $ ...

    nat123全端口映射P2P域名解析 v1.140826.zip

    nat123是集合80端口映射、动态域名解析、域名解析管理的开放自由的...WINDOWS远程桌面,SSH访问LINUX,路由器 (3)数据库。ORACLE,SQLSERVER,MYSQL (4)FTP。 (5)其他 更新: 1.全端口映射P2P提升穿透率。

    Linux强制释放占用端口以及Linux防火墙端口开放方法详解

    Linux端口简单介绍,端口编号从0-65536,各编号端的用途如下: 0-1023:公认端口,与常见服务绑定(FTP,SSH) 1024-49151:注册端口,用于和一些服务绑定 49152-65535:动态或私有端口,可用于任意网络连接 端口...

    usb ssh脚本

    映射ssh端口到usb,让windows Mac linux 通过usb来用ssh scp sshfs等连接手机,连接远比无线wifi稳定快速。

    dog tunnel端口映射工具-其他

    狗洞是一个高速的 P2P 端口映射工具,同时支持Socks5代理。 0.5版后开始开源,UDP底层基于开源库KCP重写,效率大大提高,在恶劣环境下优势明显。 同时提供非P2P版本(Lite版本),两端连接过程完全不依赖中间服务器...

    alpine-ssh:在高山docker容器上启用SSH

    基于Alpine Linux的最小Docker映像,具有完整的软件包索引,大小仅为5 MB! 我已经准备好这个Dockerfile以在高山Docker容器上启用SSH。 那完全正常。 上面的Dockerfile在ssh服务器中启用了root权限,并在创建...

    如何使用ssh远程linux服务器(以xshell为例)

    看到接口转发,有个映射端口 其实就是内网ip:port映射到外网ip:port 然后有些小伙伴ssh远程连接的时候,选择内网ip:port,还说连不上,动动脑子好不好 或许是小伙伴们还没用过linux云服务器也没搞过linux虚拟机远程 ...

    企业级Linux服务攻略

    第1章 Linux服务器的搭建与测试 1.1 Linux的安装 1.1.1 Linux简介 1.1.2 Red Hat Enterprise Linux 5新特性介绍 1.1.3 Red Hat Enterprise Linux 5的安装 1.2 常规网络配置 1.2.1 配置主机名 1.2.2 使用ifconfig...

    P2P穿透软件免费可用

    安装并启用后,使用“全端口映射P2P”,访问端访问时通过访问者添加打开访问端口,即可访问异地应用。 应用示例有:外网访问内网OA网站、FTP、数据库、远程桌面、SSH访问LINUX、金碟、管家婆、视频监控、摄像头、C/S...

    Xshell_7.0.0090.zip

    Xshell,轻松管理远程服务器,会话管理器,支持多选项卡管理主机,支持远程协议Telnet、Rlogin、SSH/SSH PKCS#11、SFTP、Serial,具有Unicode编码支持、动态端口转发、自定义键盘映射、VB脚本支持等。 现在...

    RED HAT LINUX 6大全

    4.8 使用Red Hat的wmconfig命令 54 4.9 个人化的X资源文件 54 4.10 使用xdm 55 4.11 XFree86疑难解答 57 4.12 小结 57 第5章 窗口管理器 58 5.1 GNOME X环境 59 5.1.1 什么是GNOME 59 5.1.2 GNOME 安装组件 59 5.1.3...

    Kali使用手册.docx

    1 Linux的常用命令 8 1.1 系统 8 1.1.1 内核和系统信息 8 1.1.2 硬件信息 8 1.1.3 加载状态和消息 9 1.1.4 用户 9 1.1.5 限制 10 1.1.6 运行级别 10 1.1.7 重设root密码 11 1.1.8 内核模块 11 1.1.9 编译...

    SftpDriver

    将远程的linux服务器硬盘通过22端口映射为本地硬盘,方便的小工具。

    Xshell5终极版

    xshell 5功能强悍,具备标签式的环境,动态端口转发,自定义键的映射关系,用户定义的按钮,VB脚本,显示2字节字符和国际语言支持UNICODE,支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。 xshell 5...

    xshell官方免费版

    XShell6功能强悍,具备标签式的环境,动态端口转发,自定义键的映射关系,用户定义的按钮,VB脚本,显示2字节字符和国际语言支持UNICODE,支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过...

    让主机能和Linux的虚拟机内部SNAT网络互访

    通常情况下,需要做端口转发,但是这种方式太扰人了,比如我在我docker容器上装了三个linux发行版,用来做linux集群的学习使用,我要为它们每个做ssh端口映射,而且在它里面装其他应用又要重复做一遍.所以我想到了一个办法...

Global site tag (gtag.js) - Google Analytics