【前言】

最近一直在使用ssh协议的端口转发(隧道)功能,完成对内网空透等。这篇文章将主要讲解3种常用的ssh tunnelling使用方法和基本原理。

在介绍具体内容前,我先奉上端口转发的常用情景:

图中的“我”,现在是要访问内部网站的192.168.1.0/24网段里面的服务器,然而由于不在一个网段,我是不可以直接ssh到内部网络的服务器。

通常的做法是先ssh到“SSH Server”,然后再在ssh server上访问内部网站的服务器

我能不能不用上ssh server就直接ssh到内部服务器呢?从下面的文章你将得到答案。

SSH 端口转发主要有3种方式:

  • 本地端口转发

格式如下:

ssh -L [bind_address:]port:host:hostport <user>@<ssh server>

如上图我现在要直接访问IP地址为192.168.1.2的服务器,可以在本地(SSH Client)这样做:

Step 1:

ssh -N -L :192.168.1.2: peter@10.1.1.1

或者:

ssh -N -L 10.10.10.10::192.168.1.2: peter@10.1.1.1
# 如果你想绑定本机特定的IP可以在port前加上IP地址,如上面的10.10.10.10

注意:peter是SSH Server上的一个用户名,“-N” 表示不执行命令,也就是不登录到SSH Server上去。

输入SSH Server密码,命令会等在那,不要结束这个就行

Step 2:

ssh -p 11122 <192.168.1.2的用户名>@127.0.0.1

或者:

ssh -p  <192.168..2的用户名>@10.10.10.10

输入192.168.1.2服务器的密码,就登录了内部网络的192.168.1.2的机器了。

原理分析:

当你执行Step 1的命令时,ssh client程序会在本地监听指定的11122端口,你可以通过下面命令看到

netstat -ntlp |grep 

然后我们在Step 2中,我们ssh其实连接的是本地的11122端口,ssh client程序会帮我们转发到SSH Server的,然后SSH Server再帮我们转发到我们指定的192.168.1.2上的22端口


  • 远程端口转发

格式如下:

ssh -R [bind_address:]port:host:hostport <user>@<ssh server>

与 “本地端口转发”最大的不同是,这个命令后,绑定的端口不在是本地的端口,而是SSH Server(10.1.1.1/192.168.1.1)上的端口

注意:由于默认配置下,远程SSH Server只能绑定到127.0.0.1地址上,所以SSH Server以外的机器是不能使用到这个端口转发的,解决方法:

用sudo权限打开SSH Server上的/etc/ssh/sshd_config: sudo vim /etc/ssh/sshd_config ,加入

GatewayPorts yes

然后重启ssh service: sudo service ssh restart

Step 1:

ssh -N -R *::10.10.10.11: peter@10.1.1.1

*是用来表示使用SSH Server的所有地址,你也可以使用10.1.1.1这个地址,其中10.10.10.11是我上图 SSH Client同网络的其他客户端机器的IP.

Step 2:

ssh -p  <192.168..2上的用户>@10.1.1.1

注意,跟本地端口转发不同的是,上面的地址和端口都是远程SSH Server的。

192.168.1.X 网络的机器就通过gateway与ssh client之间的SSH隧道访问到了10.10.10.X网络的IP:10.10.10.11

  • 动态端口转发

格式如下:

ssh -D [bind_address:]port <user>@<ssh server>

前面我介绍的两种方式都有一个比较大的问题,只能做到点对点的代理,或者说一个主机的port到另一个主机port上的映射,

动态端口就是用来解决这个问题的,完成从点到面的代理,或者说完成本机一个port到任意远程地址和端口的映射

一个比较典型的应用就是web代理服务器,下面我们准备把SSH Server变成一个web代理服务器

Step 1:

ssh -N -D  peter@10.1.1.1

注意:现在SSH Client的3456就被用来转发http请求了

Step 2:

设置Firefox使用本地127.0.0.1的3456端口来做http代理,如下图设置:


注意上图,一定要选择SOCK5 或者SOCK4,因为ssh只能作为SOCK主机而不是一般的HTTP主机代理

这样,我们就可以使用SSH Server的代理,用Firefox来访问所有的页面了。

【结尾】

当然,上面所提到的SSH Client,不一定要Linux主机,也可以是Windows装上putty等ssh客户端,具体设置是,打开putty设置 Connecction->SSH->Tunnels,相信你只要理解上面的内容,设置putty是很简单的事。

如果putty设置有什么问题,可以留言,一起探讨。


参考文章:

https://mikeash.com/ssh_socks.html

基于SSH协议的端口转发的更多相关文章

  1. SSH隧道:端口转发功能详解

    SSH系列文章: SSH基础:SSH和SSH服务 SSH转发代理:ssh-agent用法详解 SSH隧道:端口转发功能详解 1.1 ssh安全隧道(一):本地端口转发 如下图,假如host3和host ...

  2. ssh隧道实现端口转发

    ssh隧道实现端口转发 本地转发 # 本地转发 ssh -g -f -N -L : root@ # -L 本地端口转发,转发172.16.1.1主机可以访问的资源,这里为转发172.16.1.2的80 ...

  3. 使用 SSH 隧道实现端口转发、SOCKS 代理

    SSH隧道 本地端口转发 本地客户端通过 local_port 连接到 MobaXterm: MobaXterm 绕过防火墙,使用 user 用户连接到 ssh_server_ip:ssh_serve ...

  4. Linux(例如CentOS 7)打开TCP 22端口,基于SSH协议

    SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议.SSH 是目前较可靠,专 ...

  5. 流量操控之SSH隧道与端口转发

    目  录 第1章            概述... 3 1.1.         实现命令... 3 1.2.         SSH隧道类型... 3 第2章            SSH隧道... ...

  6. ssh验证和端口转发

    ssh 服务登录验证 ssh 服务登录验证方式: 用户/ 口令 基于密钥 基于用户和口令登录验证 客户端发起ssh请求,服务器会把自己的公钥发送给用户 用户会根据服务器发来的公钥对密码进行加密 加密后 ...

  7. SSH 内网端口转发实战

    导读 大家都知道SSH是一种安全的传输协议,用在连接服务器上比较多.不过其实除了这个功能,它的隧道转发功能更是吸引人. 如果两个内网之间的linux服务器需要互相登录,或需要互相访问内网某个端口,担忧 ...

  8. SSH隧道技术----端口转发,socket代理

    原文的原始出处不详,本文也是在复制引用了某篇转载,并做了必要的整理与编辑. 本文的受众 如果你遇到了以下问题,那么你应该阅读这篇文章 我听说过这种技术,我对它很感兴趣 我想在家里访问我在公司的机器(写 ...

  9. SSH Tunnel扫盲(ssh port forwarding端口转发)

    SSH的的Port Forward,中文可以称为端口转发,是SSH的一项非常重要的功能.它可以建立一条安全的SSH通道,并把任意的TCP连接放到这条通道中.下面仔细就仔细讨论SSH的这种非常有用的功能 ...

随机推荐

  1. Flex Socket 安全沙箱问题解决

    Flex使用Socket与C++通讯时遇到了安全沙箱问题,NND,折腾我半天,这是我的解决方法: 1):策略文件与主套接字在同一端口,只需调用 Socket.connect() 或 XMLSocket ...

  2. 2016年,总结篇 之 VueJS 如何入门(一)

    接着 2016 年的总结,我们来看看 2016年 国内最火且没有之一的前端MVVM 框架 VueJs 虽然 到写文章的这个时间点,VueJs已经发布了 2.1.x 了, 但是对于很多 Vuejs 的初 ...

  3. Jenkins添加用户

    新建用户 Jenkins刚开始的界面是允许访客进行所有操作的,这时Jenkins是有安全隐患的,也不容易去管理.这时,我们需要管理Jenkins的权限,对它的权限进行设置.关于Jenkins权限设置的 ...

  4. matlab 子函数的使用

    本文参考了该篇博客:http://www.cnblogs.com/MarshallL/p/4048846.html 对其进行学习,为我所用吧. 一. 在matlab的函数定义中,如果函数如果函数较长或 ...

  5. 解析jQuery中extend方法--源码解析以及递归的过程《二》

    源码解析 在解析代码之前,首先要了解extend函数要解决什么问题,以及传入不同的参数,会达到怎样的效果.extend函数内部处理传入的不同参数,返回处理后的对象. extend函数用来扩展对象,增加 ...

  6. android学习10——对顶点着器和片段着色器的理解

    图形都是点,线,面组成的.顶点着器指定了顶点的位置,大小和颜色. 看一个顶点着色器的代码 attribute vec4 a_Position; attribute float a_PointSize; ...

  7. c++ TCP keepalive 使用

    来源:http://blog.csdn.net/weiwangchao_/article/details/7225338 http://www.cnitblog.com/zouzheng/archiv ...

  8. Tomcat8 + Redis实现session集中管理

      环境准备:   部署两台 tomcat 8.0   安装 redis 服务器   下载工具库( commons-pool2-2.3.jar.jedis-2.7.2.jar .改良版的 tomcat ...

  9. video.js支持m3u8格式直播

    为什么要使用video.js? 1. PC端浏览器并不支持video直接播放m3u8格式的视频 2. 手机端各式各样的浏览器定制的video界面风格不统一,直接写原生的js控制视频兼容性较差 3. v ...

  10. Mvc动态注册HttpModule详解

    序言 注册Httpmodule可以让我们使用HttpApplication对象中的处理管道事件.目前大家所熟知的应该有2种方式来使用HttpApplication对象中的处理管道事件.第一种是通过Gl ...