ssh是个多用途的工具,不仅可以远程登录,还可以搭建socks代理、进行内网穿透,这是利用它的端口转发功能来实现的。

所谓ssh端口转发,就是在ssh连接的基础上,指定 ssh client 或 ssh server 的某个端口作为源地址,所有发至该端口的数据包都会透过ssh连接被转发出去;至于转发的目标地址,既可以指定,也可以不指定,如果指定了目标地址,称为定向转发,如果不指定目标地址则称为动态转发:

  • 定向转发
    定向转发把数据包转发到指定的目标地址。目标地址不限定是ssh client 或 ssh server,既可以是二者之一,也可以是二者以外的其他机器
  • 动态转发
    动态转发不指定目标地址,数据包转发的目的地是动态决定的

因为ssh端口转发是基于ssh连接的,所以如果ssh连接断开,那么设置好的端口转发也会随之停止。

在设置端口转发之前,必须确认ssh的端口转发功能是打开的。

怎样打开ssh的端口转发功能?

ssh端口转发功能默认是打开的。控制它的开关叫做 AllowTcpForwarding,位于ssh server的配置文件 /etc/ssh/sshd_config 里:
    AllowTcpForwarding yes
如果修改的话需要重启sshd服务才会生效。

怎样设置端口转发?

设置端口转发之前要注意 iptables 设置,确保相应的端口未被屏蔽,如果嫌麻烦的话也可以临时禁用 iptables:
# service iptables stop

定向转发和动态转发的设置方法是不一样的,以下分别介绍。

设置定向转发

定向转发可以把一个 IP:Port 定向映射到另一个 IP:Port,源和目的都必须指定。源地址既可以是 ssh client 的某个端口,也可以是 ssh server 的某个端口:

  • 如果源地址是 ssh client 的某个端口,称为本地转发(Local Port Forwarding),发往 ssh client 指定端口的数据包会经过 ssh server 进行转发;
  • 如果源地址是 ssh server 的某个端口,则称为远程转发(Remote Port Forwarding),发往 ssh server 指定端口的数据包会经过 ssh client 进行转发.

设置本地转发:

先看一下基本命令:

在ssh client上执行:
{ssh client}# ssh -g -N -f -o ServerAliveInterval=60 \
-L <local port>:<remote host>:<remote port> username@<ssh server>
参数的含义在后面有解释。

我们以下面的示意图为例:你想telnet连接{remote host},但是无法直达,你只能直接连接ssh client,于是试图通过{ssh client}到{ssh server}这条通道中转:

{you} — {ssh client} — {ssh server} — {remote host}

我们要做的是在{ssh client}上执行以下命令:

{ssh client} # ssh -g -L 2323:<remote-host>:23 username@<ssh-server>

输入口令之后,就跟普通的ssh登录一样,我们进入了shell,在shell中可以正常操作,不同之处是,它同时还把 {ssh client} 的2323端口映射到了{remote host} 的23端口——亦即telnet端口,此后执行”telnet <ssh client> 2323″就相当于”telnet <remote-host>”,只要shell不退出,这个定向转发就一直有效。

  • 注1:如果以上命令不加”-g”选项,那么SSH Client上的监听端口2323会绑定在127.0.0.1上,意味着只有SSH Client自己才能连上。加上”-g”选项之后,SSH Client才允许网络上其他机器连接2323端口。
  • 注2:以上命令会生成一个shell,有时候并不符合我们的需要,因为多数时候我们只想要一个端口转发功能,挂一个shell是个累赘,而且shell一退出,端口转发也停了。这就是为什么我们需要”-N -f”选项的原因:
    -N 告诉ssh client,这个连接不需要执行任何命令,仅做端口转发
    -f 告诉ssh client在后台运行
  • 注3:为了避免长时间空闲导致ssh连接被断开,我们可以加上”-o ServerAliveInterval=60″选项,每60秒向ssh server发送心跳信号。还有一个TCPKeepAlive选项的作用是类似的,但是不如ServerAliveInterval 好,因为TCPKeepAlive在TCP层工作,发送空的TCP ACK packet,有可能会被防火墙丢弃;而ServerAliveInterval 在SSH层工作,发送真正的数据包,更可靠些。
  • 如果不是以root身份设置端口转发的话,转发端口只能使用大于1024的端口号。
设置远程转发:

先看一下基本命令,分为两部分:

在ssh server上:
编辑 /etc/ssh/sshd_config,设置以下内容然后重启sshd服务
    GatewayPorts yes
在ssh client上执行:
{ssh client}# ssh -f -N -o ServerAliveInterval=60 \
-R <ssh server port>:<remote host>:<remote port> username@<ssh server>

这次的实例如下所示,你想用telnet连接{remote host},但是无法直达,于是试图通过{ssh server}到{ssh client}这条通道中转,注意与前面介绍的本地转发的不同之处是,本地转发的案例中你只能直接连接到 ssh client,而这里你只能直接连到 ssh server:

{you} — {ssh server} — {ssh client} — {remote host}

我们要做的是在{ssh client}上执行以下命令:

{ssh client} # ssh -f -N -R 2323:<remote-host>:23 username@<ssh-server>

输入口令之后,{ssh server}的2323端口映射到了{remote host}的23端口——亦即telnet端口,此后执行”telnet <ssh server> 2323″就相当于”telnet <remote-host>”。

本地转发与远程转发的区别与适用场景

定向转发(包括本地转发和远程转发)通常用于内网穿透,本地转发和远程转发的区别就在于监听端口是开在ssh client上还是ssh server上。常见的使用场景是:

  • 如果ssh client在内网里面,ssh server在Internet上,你想让Internet上的机器穿进内网之中,那就使用远程转发;
  • 如果ssh server在内网里面,ssh client在外面,你想穿进内网就应该使用本地转发。
设置动态转发

定向转发(包括本地转发和远程转发)的局限性是必须指定某个目标地址,如果我们需要借助一台中间服务器访问很多目标地址,一个一个地定向转发显然不是好办法,这时我们要用的是ssh动态端口转发,它相当于建立一个SOCKS服务器。

先看一下基本命令:

在ssh client上执行:
{ssh client}# ssh -f -N -o ServerAliveInterval=60 \
-D <ssh client port> username@<ssh server>

实际使用时有两种常见场景:

  • 你把自己的机器(127.0.0.1)当作 sock5 代理服务器:
    {you / ssh client} — {ssh server} — {other hosts}

命令如下:

{ssh client} # ssh -f -N -D 1080 username@<ssh-server>

这种情况下,我们得到的socks5代理服务器是:127.0.0.1:1080,仅供ssh client自己使用。
然后你就可以在浏览器中或其他支持socks5代理的软件中进行设置。

  • ssh client 和 ssh server 是同一台机器,并充当socks5代理:
    {you} — {ssh client / ssh server} — {other hosts}

命令如下:

{ssh client} # ssh -f -N -g -D 1080 username@127.0.0.1

这种情况下,我们得到的socks5代理服务器是:
{ssh client IP}:1080,可供网络上其他机器使用,只要能连接ssh client即可。

通过SSH建立的SOCKS服务器使用的是SOCKS5协议,在为应用程序设置SOCKS代理的时候要注意。

Linux:ssh端口转发详解的更多相关文章

  1. SSH端口转发详解及实例

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

  2. SSH端口转发详解及实例-转载

    作者:珂儿吖 出处:http://www.cnblogs.com/keerya/ 目录 1.1 SSH端口转发的两大功能 实验一:实现SSH端口转发——本地转发 实验二.实现SSH端口转发——远程转发 ...

  3. SSH端口转发详解

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

  4. SSH远程登录和端口转发详解

     SSH远程登录和端口转发详解   介绍 SSH 是创建在应用层和传输层基础上的安全协议,为计算机上的 Shell(壳层)提供安全的传输和使用环境. SSH 只是协议,有多种实现方式,本文基于其开源实 ...

  5. Linux SSH端口转发

    SSH端口转发分为两种,一种是本地端口转发,又称为本地SSH隧道.一直是远程端口转发.SSH端口转发,还必须指定数据传送的目标主机,从而形成点对点的端口转发. 本地端口转发     假定有三台主机A. ...

  6. hadoop ssh 端口-ssh-copy-id详解

    ssh-copy-id详解 http://www.blogdaren.com/post-1815.html 服务器时常需要配置无密码的登录方式,最一般的设置方式如下: 使用ssh-keygen和ssh ...

  7. Linux SSH的命令详解[转]

    http://www.linuxidc.com/Linux/2008-02/11055.htm前一阵远程维护Linux服务器,使用的是SSH,传说中的secure shell. 登陆:ssh [hos ...

  8. [转载]详解ssh端口转发(二)

    关于使用ssh portforwarding来进行FQ的操作,网络上已经有很多很好的文章,我在这里只是画两个图解释一下. 首先要记住一件事情就是: SSH 端口转发自然需要 SSH 连接,而 SSH ...

  9. Linux:SSH服务配置文件详解

    SSH服务配置文件详解 SSH客户端配置文件 /etc/ssh/ssh——config 配置文件概要 Host * #选项“Host”只对能够匹配后面字串的计算机有效.“*”表示所有的计算机. For ...

随机推荐

  1. Python 文件 isatty() 方法

    概述 Python 文件 isatty() 方法检测文件是否连接到一个终端设备,如果是返回 True,否则返回 False. 语法 isatty() 方法语法如下: fileObject.isatty ...

  2. java播放wav文件

    import java.io.File; import java.io.IOException; import javax.sound.sampled.AudioFormat; import java ...

  3. SQLServer2012 (非)聚集索引存储探究

    SQLServer2012 (非)聚集索引存储探究 Author:zfive5(zidong) Email:zfive5@163.com 引子 因为写了前一篇文字<SQLServer2012 表 ...

  4. 怎样让HTML 表格中内容自动换行??

    <table style="word-break:break-all; word-wrap:break-all;">

  5. 目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练

    将目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练. import xml.etree.ElementTree as ET import numpy as ...

  6. Python 学习参考书目推荐

    Python 学习,参考书目推荐 前言 好的技术书籍可以帮助我们快速地成长,大部分人或多或少地受益于经典的技术书籍.在「Python开发者」微信公号后台,我们经常能收到让帮忙推荐书籍的消息.这类的问题 ...

  7. nginx静态资源缓存与压缩

    一.静态资源缓存 参考文章 (1)apache设置max-age或expires 这里需要修改.htaccess文件. <IfModule mod_headers.c> <Files ...

  8. Mac 下安装Ruby环境

    步骤1 - 安装 RVM RVM 是干什么的这里就不解释了,后面你将会慢慢搞明确. $ curl -L https://get.rvm.io | bash -s stable 期间可能会问你sudo管 ...

  9. C/C++/Objective-C经典书籍推荐

    C语言要从大而全,从基础開始.它属于最好的.别被它误导.它也有非常多错误,不适合标准软件开发人员使用.变量声明,定义,编程规范全然不合规范,可是从语言学习方面做到极致,有大量不同的样例和试题.标准的教 ...

  10. javascript原生代码取单选框的值

    网上搜索到的,项目中正好用到,先记下来,以后直接从自己的博客上复制粘贴!!! //取单选框选择中的值,传入单选框的name function getRadioBoxValue(radioName) { ...