SSH端口转发详解及实例
一、SSH端口转发简介
SSH会自动加密和解密所有SSH客户端与服务端之间的网络数据。但是,SSH还能够将其他TCP端口的网络数据通SSH链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做"隧道"(tunneling),这是因为SSH为其他TCP链接提供了一个安全的通道来进行传输而得名。例如,Telnet ,SMTP ,LDAP这些TCP应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果工作环境许中的防火墙限制了一些网络端口的使用,但是允许SSH的连接,也能够将通过将TCP用端口转发来使用SSH进行通讯。
1.1 SSH端口转发的两大功能
- 加密SSH Client端至SSH Server端之间的通讯数据。
- 突破防火墙的简直完成一些之前无法建立的TCP连接。
二、本地转发
命令:-L localport:remotehost:remotehostport sshserver
说明:localport 本机开启的端口号
remotehost 最终连接机器的IP地址
remotehostport 转发机器的端口号
sshserver 转发机器的IP地址
选项:-f 后台启用
-N 不打开远程shell,处于等待状态(不加-N则直接登录进去)
-g 启用网关功能
接下来,我们通过实验来详细的说明一下如何实现本地转发:
实验一:实现SSH端口转发——本地转发
- 背景:企业内部C服务器只允许telnet连接(23端口)访问,不允许外部直接访问,B服务器是一个ssh服务器;有一个用户需要从外部连接到企业内部的C服务器。
- 前提:防火墙允许22端口进来(或者企业内部有一个堡垒机,ssh -t通过堡垒机进去)。
- 原理:A用户通过ssh协议连接到B机器上,再通过B机器做跳板,连接至C机器。
- 机器:rhel5模拟A用户,centos6模拟B机器,centos7模拟C机器
- 图示如下:

- 实验步骤:
1)模拟C机器不允许A用户连接,并且开启B机器的telnet服务端口23。
在centos7上输入以下口令:
iptables -A INPUT -s 192.168.191.55 -j REJECT

此时,从rhel5用ssh命令连接centos7,是拒绝的:

同时,我们还要开启7的telnet服务端口23:
systemctl start telnet.soc ket
用ss -ntl命令可以查看的服务端口是否已开启

2)开启端口转发(telnet隧道)
首先,我们在5机器上确认已经开启的端口有哪些:

我们使用的端口是9527端口,从上图中我么已经看出,9527端口没有被占用,所以我们可以使用~
接着我们建立本地转发的隧道(5上输入以下命令):
ssh -L 9527:192.168.191.77:23 -fN 192.168.191.66

在这里,我们可以使用ps aux来查询后台运行的进程。也可以通过ss -nt查看接口连接情况:


3)在rhel5上输入以下命令,用9527端口连接自己:
telnet 127.0.0.1 9527

此时,我们可以查看一下centos6和centos7的连接情况:


至此,我们已经实现了A用户在公司外部远程连接C机器的需求,接下来我们就来讲一讲实现过程:
data <- -> localhost:9527端口 <- -> localhost:XXXXX(随机在客户端6开一个端口) <- -> sshsrv:22(通过ssh封装) <- -> sshsrv:YYYYY(服务器解封装,开一个端口,代表telnet客户端) <- -> telnetsrv:23
用大白话来解释就是:当rhel5(A用户)连接自己的9527端口时,该请求自然会通过ssh协议封装发送给centos6(B机器),然后在centos6(C机器)上解封装,形成telnet流量,发送给centos7(C机器)。
实验做完了,如果我们想要停止这个隧道,直接把后台的隧道进程杀死就可以了,命令如下:
killall ssh

我们的实验圆满完成ヾ(✿゚▽゚)ノ
三、远程转发
在我们实验一的场景下,首先要满足的是防火墙上必须打开22端口,但是在现实生活中,企业处于安全考虑,一般是不会打开防火墙,只允许出不允许进。所以,当防火墙的端口没有打开的时候,我们要怎么办呢?这就要用到我们接下来要说的远程转发了:
命令:-R sshserverport:remotehost:remotehostport sshserver
说明:sshserverport 被转发机器开启的端口号
remotehost 最终连接机器的IP地址
remotehostport 被转发机器的端口号
sshserver 被转发机器的IP地址
同样的,我们以实验来具体说明我们的远程转发:
实验二、实现SSH端口转发——远程转发
- 背景:企业内部C服务器只允许telnet连接(23端口)访问,不允许外部直接访问,B服务器是一个ssh服务器;有一个用户需要从外部连接到企业内部的C服务器。
- 原理:B机器访问A用户,给A用户转发
- 机器:rhel5模拟A用户,centos6模拟B机器,centos7模拟C机器
- 图示如下:

- 实验步骤:
1)模拟C机器不允许A用户连接,并且开启B机器的telnet服务端口23。
在centos7上输入以下口令:
iptables -A INPUT -s 192.168.191.55 -j REJECT

此时,从rhel5用ssh命令连接centos7,是拒绝的:

同时,我们还要开启7的telnet服务端口23:
systemctl start telnet.soc ket
用ss -ntl命令可以查看的服务端口是否已开启

2)开启隧道转发(telnet隧道)
这一次,由于防火墙完全关闭,外部的设备连接不进来,所以我们要通过B机器去连接A用户的机器,因此,我们的开启隧道命令要在B机器(centos6)上运行:
首先,我们要确定一下centos6上开启了哪些端口:

然后,我们选择一个没有被开启的端口开启隧道,进行实验:

同样的,在这里,我们可以使用ps aux来查询后台运行的进程。也可以通过ss -nt查看接口连接情况:


3)在rhel5上输入以下命令,用9527端口连接自己:
telnet 127.0.0.1 9527

此时,我们可以查看一下centos6和centos7的连接情况:


至此,我们已经实现了A用户在公司外部远程连接C机器的需求,接下来我们就来讲一讲实现过程:
data <- -> sshsrv:9527端口 <- -> sshsrv:22(通过ssh封装) <- -> localhost:XXXXX(随机在客户端6开一个端口) <- -> localhost:YYYYY(服务器解封装,开一个端口,代表telnet客户端) <- -> telnetsrv:23
用大白话来解释就是:当rhel5(A用户)连接自己的9527端口时,该请求自然会通过ssh协议封装发送给centos6(B机器),然后在centos6(C机器)上解封装,形成telnet流量,发送给centos7(C机器)。
实验做完了,如果我们想要停止这个隧道,直接把后台的隧道进程杀死就可以了,命令如下:
killall ssh

我们的实验圆满完成ヾ(✿゚▽゚)ノ
四、动态转发
众所周知,我国有一个功能强大的防火墙,用来避免我们访问谷歌等外国的部分网站,嗯。。。翻墙的方法有很多,相信大家不比小编懂的少,所以我们就不一一举例说明了。接下来,小编就给大家说一说如何通过ssh转发技术实现翻墙~
这里,就要用到我们的动态转发技术了:
当用firefox 访问internet 时,本机的1080 端口做为代理服务器,firefox 的访问请求被转发到sshserver 上,由sshserver替之访问internet。
接下来,我们还是以实验进行说明:
实验三、实现SSH端口转发——动态转发
- 背景:模拟Google的服务器C不允许国内网站A直接访问,B服务器是国外的一个小型的学习用的服务器;国内网站A可以访问国外学习服务器B;实现国内网站A访问模拟Google服务器C。
- 原理:国内网站A通过ssh协议连接到国外学习服务器B上,再通过国外学习服务器B做跳板,连接至Google服务器C。
- 机器:centos6模拟国内网站A,rhel5模拟国外学习服务器B,centos7模拟Google服务器C
- 图示如下:

- 实验步骤:
1)在模拟google服务器C上搭建一个网页,从互联网上访问centos7时,页面显示"Welcome to www.google.com"
命令如下:
[root@centos7 ~]# cd /var/www/html/
[root@centos7 html]# vim index.html
<h1> Welcome to www.google.com </h1>
编写完文件以后,记得重启一下httpd服务:
[root@centos7 html]# systemctl restart httpd
2)模拟Google服务器C不允许国内网站A连接
在centos7上输入以下口令:
[root@centos7 ~]# iptables -A INPUT -s 192.168.191.66 -j REJECT
此时,我们来测试一下centos6和rhel5能否访问centos7,命令为:
curl 192.168.191.77 或 links 192.168.191.77
[root@rhel5 ~]# curl 192.168.191.77
<h1> Welcome to www.google.com </h1> [root@centos6 ~]# curl 192.168.191.77
curl: () couldn't connect to host
可以看出,rhel5可以连接到centos7,但是centos6不能连接到centos7。我们现在的需求就是希望centos6可以借助于rhel5访问centos7,方法也很简单,接下来就给大家说一说。
3)动态端口转发
首先,我们在6机器上确认已经开启的端口有哪些:

我们使用1080端口,从上图中我么已经看出,1080端口没有被占用,所以我们可以使用~
接着我们建立动态转发的隧道(6上输入以下命令):
ssh -D 1080 -fN 192.168.191.55

在这里,我们可以在rhel5上查看到centos6的连接:

4)设置代理rhel5访问centos7,命令如下(在centos6上输入):
curl --socks5 127.0.0.1:1080 http://192.168.191.77

5)在图形化界面,在centos6上的firefox浏览器设置代理:




我们的实验圆满完成ヾ(✿゚▽゚)ノ
SSH端口转发详解及实例的更多相关文章
- SSH端口转发详解及实例-转载
作者:珂儿吖 出处:http://www.cnblogs.com/keerya/ 目录 1.1 SSH端口转发的两大功能 实验一:实现SSH端口转发——本地转发 实验二.实现SSH端口转发——远程转发 ...
- Linux:ssh端口转发详解
ssh是个多用途的工具,不仅可以远程登录,还可以搭建socks代理.进行内网穿透,这是利用它的端口转发功能来实现的. 所谓ssh端口转发,就是在ssh连接的基础上,指定 ssh client 或 ss ...
- SSH端口转发详解
正文 一.SSH端口转发简介 SSH会自动加密和解密所有SSH客户端与服务端之间的网络数据.但是,SSH还能够将其他TCP端口的网络数据通SSH链接来转发,并且自动提供了相应的加密及解密服务.这一过程 ...
- SSH远程登录和端口转发详解
SSH远程登录和端口转发详解 介绍 SSH 是创建在应用层和传输层基础上的安全协议,为计算机上的 Shell(壳层)提供安全的传输和使用环境. SSH 只是协议,有多种实现方式,本文基于其开源实 ...
- hadoop ssh 端口-ssh-copy-id详解
ssh-copy-id详解 http://www.blogdaren.com/post-1815.html 服务器时常需要配置无密码的登录方式,最一般的设置方式如下: 使用ssh-keygen和ssh ...
- [转载]详解ssh端口转发(二)
关于使用ssh portforwarding来进行FQ的操作,网络上已经有很多很好的文章,我在这里只是画两个图解释一下. 首先要记住一件事情就是: SSH 端口转发自然需要 SSH 连接,而 SSH ...
- 利用SSH端口转发实现跨机器直接访问
在实际项目测试中经常会遇到数据库操作,但是因为公司安全问题,访问数据库往往需要通过跳板机.但通过跳板机,测试效率大打折扣,因此通过使用SSH端口转发,从而达到跨机器直接访问数据库.实际项目中的应用会比 ...
- ssh端口转发(之kettle ssh方式连接数据库)
ssh参数解释 格式 ssh [user@]host [command] 选项: -1:强制使用ssh协议版本1: -2:强制使用ssh协议版本2: -4:强制使用IPv4地址: -6:强制使用IP ...
- Linux:SSH服务配置文件详解
SSH服务配置文件详解 SSH客户端配置文件 /etc/ssh/ssh——config 配置文件概要 Host * #选项“Host”只对能够匹配后面字串的计算机有效.“*”表示所有的计算机. For ...
随机推荐
- LF模式是个坑,ZeroIce中间件让你体会这个痛
LF模式是个坑,一个小小的失误就可能使你的网络处理瘫痪,Ice就很好地展现了出来,换句话说,Ice中间件或是LF模式就是一个坑,如果你一不小心. LF模式的官方论文中,论述了此模式用于高性能网络并发模 ...
- POI设置excel某列值为文本格式
excel单元格格式默认为[常规],当某列限定必须从下拉框选择一个纯数字文本的时候,必须将单元格格式设置为[文本]. 否则即使输入的值和下拉框的一致,excel都认为输入的值是常规类型,而下拉框的值为 ...
- (转载)Java多线程入门理解
转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更 ...
- C# 三层架构之系统的登录验证与添加数据的实现
利用三层架构体系,实现学生管理系统中用户的登录与添加班级信息的功能,一下代码为具体实现步骤的拆分过程: 一.用户登录界面功能的实现 1.在数据访问层(LoginDAL)进行对数据库中数据的访问操作 u ...
- WCF(三)分布式事务
最近在学WCF,所以有两个设想疑问(菜鸟多疑问): 如果有WCF服务A,WCF服务B,客户端调用WCF服务A插入一条数据,然后再调用服务B也插入一条数据,然而服务B出错了进行了回滚,服务A能不能也进行 ...
- 第1阶段——u-boot分析之make指令(2)
通过make 100ask24x0_config 指令配置好芯片选型后,使用make指令来生成uboot.bin文件 本文学习目标: 对Makefile文件进行基本了解,掌握make指令是怎么实现生成 ...
- 前端AES的加密和解密
在工作的过程中,经常要对一些数据做一些加密,当然有复杂的加密和简单的加密,也有对称加密等等.总之加密的方式有很多.今天在这里,我只是简单的分享一个我最近遇到的加密方式-AES.这个也是后端工程师用的, ...
- 关于C语言
对于C语言方面 觉得自己在数组方面比较薄弱,寒假之前也借了一些书关于C语言的希望能在家里好好看看,也看了差不多两三百页,视频没怎么看,看了七八集,希望学一些深入的语法或者说是算法.
- 团队作业8——第二次项目冲刺(Beta阶段)Day2--5.19
1.展开站立式会议: 会议内容:①汇报一天大家任务的完成成果. ②新成员对学到的知识进行交流,并向老成员提问. ③根据大家的进度制定新一轮的任务计划. 2.每个人的工作分配 队员 今日任务 明日任务 ...
- 201521123057 《Java程序设计》 第8周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容 2. 书面作业 1.List中指定元素的删除(题目4-1) 1.1 实验总结 答:remove中注意应该使用eq ...