SSH高级应用(端口转发)
转发自:http://www.cnblogs.com/sting2me/p/5167730.html
基于SSH协议的端口转发
【前言】
最近一直在使用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 11122:192.168.1.2:22 peter@10.1.1.1
或者:
ssh -N -L 10.10.10.10:11122:192.168.1.2:22 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 11122 <192.168.1.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 *:11122:192.168.1.2:22 peter@10.1.1.1
*是用来表示使用SSH Server的所有地址,你也可以使用10.1.1.1这个地址
Step 2:
ssh -p 11122 <192.168.1.2上的用户>@10.1.1.1
注意,跟本地端口转发不同的是,上面的地址和端口都是远程SSH Server的
- 动态端口转发
格式如下:
ssh -D [bind_address:]port <user>@<ssh server>
前面我介绍的两种方式都有一个比较大的问题,只能做到点对点的代理,或者说一个主机的port到另一个主机port上的映射,
动态端口就是用来解决这个问题的,完成从点到面的代理,或者说完成本机一个port到任意远程地址和端口的映射
一个比较典型的应用就是web代理服务器,下面我们准备把SSH Server变成一个web代理服务器
Step 1:
ssh -N -D 3456 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 -C -f -N -g -L listen_port:DST_Host:DST_port user@Tunnel_Host
ssh -C -f -N -g -R listen_port:DST_Host:DST_port user@Tunnel_Host
ssh -C -f -N -g -D listen_port user@Tunnel_Host
-f Fork into background after authentication.
后台认证用户/密码,通常和-N连用,不用登录到远程主机。
-D port
指定一个本地机器 “动态的'’ 应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port
端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接. 目前支持 SOCKS4
协议, 将充当 SOCKS4 服务器. 只有 root 才能转发特权端口. 可以在配置文件中指定动态端口的转发.
-C Enable compression.
压缩数据传输。
-N Do not execute a shell or command.
不执行脚本或命令,通常与-f连用。
-g Allow remote hosts to connect to forwarded ports.
在-L/-R/-D参数中,允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接。
此外,我们利用ssh可以为不安全的数据传输进行加密传输,比如ftp,也可以加密mysql的访问。
SSH高级应用(端口转发)的更多相关文章
- 基于SSH协议的端口转发
[前言] 最近一直在使用ssh协议的端口转发(隧道)功能,完成对内网空透等.这篇文章将主要讲解3种常用的ssh tunnelling使用方法和基本原理. 在介绍具体内容前,我先奉上端口转发的常用情景: ...
- SSH隧道:端口转发功能详解
SSH系列文章: SSH基础:SSH和SSH服务 SSH转发代理:ssh-agent用法详解 SSH隧道:端口转发功能详解 1.1 ssh安全隧道(一):本地端口转发 如下图,假如host3和host ...
- ssh隧道实现端口转发
ssh隧道实现端口转发 本地转发 # 本地转发 ssh -g -f -N -L : root@ # -L 本地端口转发,转发172.16.1.1主机可以访问的资源,这里为转发172.16.1.2的80 ...
- 使用 SSH 隧道实现端口转发、SOCKS 代理
SSH隧道 本地端口转发 本地客户端通过 local_port 连接到 MobaXterm: MobaXterm 绕过防火墙,使用 user 用户连接到 ssh_server_ip:ssh_serve ...
- SSH 内网端口转发实战
导读 大家都知道SSH是一种安全的传输协议,用在连接服务器上比较多.不过其实除了这个功能,它的隧道转发功能更是吸引人. 如果两个内网之间的linux服务器需要互相登录,或需要互相访问内网某个端口,担忧 ...
- SSH隧道技术----端口转发,socket代理
原文的原始出处不详,本文也是在复制引用了某篇转载,并做了必要的整理与编辑. 本文的受众 如果你遇到了以下问题,那么你应该阅读这篇文章 我听说过这种技术,我对它很感兴趣 我想在家里访问我在公司的机器(写 ...
- 流量操控之SSH隧道与端口转发
目 录 第1章 概述... 3 1.1. 实现命令... 3 1.2. SSH隧道类型... 3 第2章 SSH隧道... ...
- SSH Tunnel扫盲(ssh port forwarding端口转发)
SSH的的Port Forward,中文可以称为端口转发,是SSH的一项非常重要的功能.它可以建立一条安全的SSH通道,并把任意的TCP连接放到这条通道中.下面仔细就仔细讨论SSH的这种非常有用的功能 ...
- ssh验证和端口转发
ssh 服务登录验证 ssh 服务登录验证方式: 用户/ 口令 基于密钥 基于用户和口令登录验证 客户端发起ssh请求,服务器会把自己的公钥发送给用户 用户会根据服务器发来的公钥对密码进行加密 加密后 ...
- [Linux] SSH隧道本地端口转发访问远程服务中的数据库
当我的本地没有安装任何数据库服务的时候,可以直接通过我本地的端口访问远程机器上的数据库服务,实现这样的效果就可以使用本地转发功能 实际测试本地端口转发,把本地的9006端口转发给远程服务器的115.1 ...
随机推荐
- Divisibility by Eight
把当前数删除几位然后能够整除与8 那么可得知大于3位数的推断能否整除于八的条件是(n%1000)%8==0 能够得出我们的结论:仅仅须要枚举后三位后两位后一位就可以知道是否可整除于8 #include ...
- java Socket 获取本地主机ip
package cn.itcast.net.p1.ip; import java.net.InetAddress;import java.net.UnknownHostException; publi ...
- 如何让history命令显示最近所执行过的命令的具体执行时间
如何让history命令显示最近所执行过的命令的具体执行时间. 步骤如下: 1.以ROOT用户编辑/etc/profile文件,在里面加入下面内容(我一般习惯在最末尾加): export HISTTI ...
- ExceptionLess 搭建到本地服务器
Exceptionless 是一个开源的实时的日志收集框架,它可以应用在基于 ASP.NET,ASP.NET Core,Web Api,Web Forms,WPF,Console,MVC 等技术栈的应 ...
- iOS-夜间模式(换肤设置)
概述 iOS 开发中有时候会有夜间模式(换肤设置)的需求, 主要是更改相关颜色操作每次切换夜间/白天模式时,都会发出通知给所有ViewController,让它们切换到相应的主题. 详细 代码下载:h ...
- [转载]meclipse中project facet问题
原文地址:meclipse中project facet问题作者:丫头_樱桃 一般出现在从别处import的项目上,只有项目文件夹上有红叉,其他地方都正常,现总结个人的几个解决方案: 有几种可能: 1, ...
- WSDL格式
http://www.blogjava.net/charles/archive/2008/12/15/246368.html最近写Web service, 很多代码是用工具生成的,可以说只知其然,不知 ...
- 分布式缓存技术memcached学习系列(三)——memcached内存管理机制
几个重要概念 Slab memcached通过slab机制进行内存的分配和回收,slab是一个内存块,它是memcached一次申请内存的最小单位,.在启动memcached的时候一般会使用参数-m指 ...
- WebApi和MVC的区别
使用上区分,mvc主要用于建站,web api主要用于构建http服务,当然你非要用mvc来构建Uri式的Api也行,不过显然是没有这个必要的,一个不恰当的比喻就像是你也可以玩破解版的单机游戏,也可以 ...
- go 学习 ---数据类型
25个关键字 程序声明:import, package 程序实体声明和定义:chan, const, func, interface, map, struct, type, var 程序流程控制:go ...