简介

SSH 除了登录服务器,还有一大用途,就是作为加密通信的中介,充当两台服务器之间的通信加密跳板,使得原本不加密的通信变成加密通信。这个功能称为端口转发(port forwarding),又称 SSH 隧道(tunnel)。

端口转发有两个主要作用:

(1)将不加密的数据放在 SSH 安全连接里面传输,使得原本不安全的网络服务增加了安全性,比如通过端口转发访问 Telnet、FTP 等明文服务,数据传输就都会加密。

(2)作为数据通信的加密跳板,绕过网络防火墙。

端口转发有三种使用方法:动态转发,本地转发,远程转发。下面逐一介绍。

动态转发

动态转发指的是,本机与 SSH 服务器之间创建了一个加密连接,然后本机内部针对某个端口的通信,都通过这个加密连接转发。它的一个使用场景就是,访问所有外部网站,都通过 SSH 转发。

动态转发需要把本地端口绑定到 SSH 服务器。至于 SSH 服务器要去访问哪一个网站,完全是动态的,取决于原始通信,所以叫做动态转发。

$ ssh -D local-port tunnel-host -N

上面命令中,-D表示动态转发,local-port是本地端口,tunnel-host是 SSH 服务器,-N表示这个 SSH 连接只进行端口转发,不登录远程 Shell,不能执行远程命令,只能充当隧道。

举例来说,如果本地端口是2121,那么动态转发的命令就是下面这样。

$ ssh -D 2121 tunnel-host -N

注意,这种转发采用了 SOCKS5 协议。访问外部网站时,需要把 HTTP 请求转成 SOCKS5 协议,才能把本地端口的请求转发出去。

下面是 SSH 隧道建立后的一个使用实例。

$ curl -x socks5://localhost:2121 http://www.example.com

上面命令中,curl 的-x参数指定代理服务器,即通过 SOCKS5 协议的本地2121端口,访问http://www.example.com

如果经常使用动态转发,可以将设置写入 SSH 客户端的用户个人配置文件(~/.ssh/config)。

DynamicForward tunnel-host:local-port

本地转发

本地转发(local forwarding)指的是,SSH 服务器作为中介的跳板机,建立本地计算机与特定目标网站之间的加密连接。本地转发是在本地计算机的 SSH 客户端建立的转发规则。

它会指定一个本地端口(local-port),所有发向那个端口的请求,都会转发到 SSH 跳板机(tunnel-host),然后 SSH 跳板机作为中介,将收到的请求发到目标服务器(target-host)的目标端口(target-port)。

$ ssh -L local-port:target-host:target-port tunnel-host

上面命令中,-L参数表示本地转发,local-port是本地端口,target-host是你想要访问的目标服务器,target-port是目标服务器的端口,tunnel-host是 SSH 跳板机。

举例来说,现在有一台 SSH 跳板机tunnel-host,我们想要通过这台机器,在本地2121端口与目标网站www.example.com的80端口之间建立 SSH 隧道,就可以写成下面这样。

$ ssh -L 2121:www.example.com:80 tunnel-host -N

然后,访问本机的2121端口,就是访问www.example.com的80端口。

$ curl http://localhost:2121

注意,本地端口转发采用 HTTP 协议,不用转成 SOCKS5 协议。

另一个例子是加密访问邮件获取协议 POP3。

$ ssh -L 1100:mail.example.com:110 mail.example.com

上面命令将本机的1100端口,绑定邮件服务器mail.example.com的110端口(POP3 协议的默认端口)。端口转发建立以后,POP3 邮件客户端只需要访问本机的1100端口,请求就会通过 SSH 跳板机(这里是mail.example.com),自动转发到mail.example.com的110端口。

上面这种情况有一个前提条件,就是mail.example.com必须运行 SSH 服务器。否则,就必须通过另一台 SSH 服务器中介,执行的命令要改成下面这样。

$ ssh -L 1100:mail.example.com:110 other.example.com

上面命令中,本机的1100端口还是绑定mail.example.com的110端口,但是由于mail.example.com没有运行 SSH 服务器,所以必须通过other.example.com中介。本机的 POP3 请求通过1100端口,先发给other.example.com的22端口(sshd 默认端口),再由后者转给mail.example.com,得到数据以后再原路返回。

注意,采用上面的中介方式,只有本机到other.example.com的这一段是加密的,other.example.commail.example.com的这一段并不加密。

这个命令最好加上-N参数,表示不在 SSH 跳板机执行远程命令,让 SSH 只充当隧道。另外还有一个-f参数表示 SSH 连接在后台运行。

如果经常使用本地转发,可以将设置写入 SSH 客户端的用户个人配置文件(~/.ssh/config)。

Host test.example.com
LocalForward client-IP:client-port server-IP:server-port

远程转发

远程转发指的是在远程 SSH 服务器建立的转发规则。

它跟本地转发正好反过来。建立本地计算机到远程计算机的 SSH 隧道以后,本地转发是通过本地计算机访问远程计算机,而远程转发则是通过远程计算机访问本地计算机。它的命令格式如下。

$ ssh -R remote-port:target-host:target-port -N remotehost

上面命令中,-R参数表示远程端口转发,remote-port是远程计算机的端口,target-hosttarget-port是目标服务器及其端口,remotehost是远程计算机。

远程转发主要针对内网的情况。下面举两个例子。

第一个例子是内网某台服务器localhost在 80 端口开了一个服务,可以通过远程转发将这个 80 端口,映射到具有公网 IP 地址的my.public.server服务器的 8080 端口,使得访问my.public.server:8080这个地址,就可以访问到那台内网服务器的 80 端口。

$ ssh -R 8080:localhost:80 -N my.public.server

上面命令是在内网localhost服务器上执行,建立从localhostmy.public.server的 SSH 隧道。运行以后,用户访问my.public.server:8080,就会自动映射到localhost:80

第二个例子是本地计算机local在外网,SSH 跳板机和目标服务器my.private.server都在内网,必须通过 SSH 跳板机才能访问目标服务器。但是,本地计算机local无法访问内网之中的 SSH 跳板机,而 SSH 跳板机可以访问本机计算机。

由于本机无法访问内网 SSH 跳板机,就无法从外网发起 SSH 隧道,建立端口转发。必须反过来,从 SSH 跳板机发起隧道,建立端口转发,这时就形成了远程端口转发。跳板机执行下面的命令,绑定本地计算机local2121端口,去访问my.private.server:80

$ ssh -R 2121:my.private.server:80 -N local

上面命令是在 SSH 跳板机上执行的,建立跳板机到local的隧道,并且这条隧道的出口映射到my.private.server:80

显然,远程转发要求本地计算机local也安装了 SSH 服务器,这样才能接受 SSH 跳板机的远程登录。

执行上面的命令以后,跳板机到local的隧道已经建立了。然后,就可以从本地计算机访问目标服务器了,即在本机执行下面的命令。

$ curl http://localhost:2121

本机执行上面的命令以后,就会输出服务器my.private.server的 80 端口返回的内容。

如果经常执行远程端口转发,可以将设置写入 SSH 客户端的用户个人配置文件(~/.ssh/config)。

Host remote-forwardHostName test.example.comRemoteForward remote-port target-host:target-port

完成上面的设置后,执行下面的命令就会建立远程转发。

$ ssh -N remote-forward# 等同于
$ ssh -R remote-port:target-host:target-port -N test.example.com

实例

下面看两个端口转发的实例。

简易 VPN

VPN 用来在外网与内网之间建立一条加密通道。内网的服务器不能从外网直接访问,必须通过一个跳板机,如果本机可以访问跳板机,就可以使用 SSH 本地转发,简单实现一个 VPN。

$ ssh -L 2080:corp-server:80 -L 2443:corp-server:443 tunnel-host -N

上面命令通过 SSH 跳板机,将本机的2080端口绑定内网服务器的80端口,本机的2443端口绑定内网服务器的443端口。

两级跳板

端口转发可以有多级,比如新建两个 SSH 隧道,第一个隧道转发给第二个隧道,第二个隧道才能访问目标服务器。

首先,在本机新建第一级隧道。

$ ssh -L 7999:localhost:2999 tunnel1-host

上面命令在本地7999端口与tunnel1-host之间建立一条隧道,隧道的出口是tunnel1-hostlocalhost:2999,也就是tunnel1-host收到本机的请求以后,转发给自己的2999端口。

然后,在第一台跳板机(tunnel1-host)执行下面的命令,新建第二级隧道。

$ ssh -L 2999:target-host:7999 tunnel2-host -N

上面命令将第一台跳板机tunnel1-host2999端口,通过第二台跳板机tunnel2-host,连接到目标服务器target-host7999端口。

最终效果就是,访问本机的7999端口,就会转发到target-host7999端口。

SSH 端口转发多级端口转发相关推荐

  1. 【网络】SSH本地/远程/动态端口转发

    文章目录 网络拓扑图 SSH本地端口转发 桌面工作站访问实验室机器(免登录跳板机) 实验室机器访问外网(本地转发) SSH远程端口转发 SSH动态端口转发 网络拓扑图 为了方便讲解命令和原理,假想了一 ...

  2. SSH隧道技术及端口映射与转发

    拓扑图 假定攻击机已拿下web服务器且无法访问数据库服务器,以下未说明的ssh命令均在web服务器上完成 ssh正向连接 ssh -CNfL 0.0.0.0:5555:10.10.10.124:80 ...

  3. 内网转发——反弹端口

    反弹端口:是指受害者服务器的某一个端口不能访问,我们通过反弹端口的形式,让攻击者能够访问该端口,也叫端口转发 主要指以下情况:   -1.访问服务器的3389端口,由于防火墙的原因,我们访问不了338 ...

  4. 端口映射和端口转发概念整理

    端口转发 端口转发(Port forwarding),有时被叫做隧道,是安全壳(SSH) 为网络安全通信使用的一种方法.端口转发是转发一个网络端口从一个网络节点到另一个网络节点的行为,其使一个外部用户 ...

  5. [Ubuntu][网络][教程]端口转发以及端口管理

    1. 平台介绍 Ubuntu 20.04 LTS Armv7 2. 端口管理 进行端口转发之前,要先对端口进行一系列设置 2.1 安装ufw sudo apt install ufw 2.2 开启22 ...

  6. Linux网络转发和端口映射的笔记

    最近研究了一下Linux平台的网络IP转发和端口映射方面的东西,作了一点笔记.在学习时,查了很多资料,有的写的不是很清楚明白,而自己对这方面了解又不多,花的时间还是不少的. 一.网络转发 环境:某设备 ...

  7. linux设置mysql防火墙端口映射_Linux防火墙默认是关闭3306端口,iptables实现端口转发、端口映射及双向通路...

    iptables实现端口转发.端口映射及双向通路其实不难配置,看下文: 允许数据包转发: #echo 1 > /proc/sys/net/ipv4/ip_forward 转发TCP 8081到x ...

  8. linux 防火墙 443端口映射,linux防火墙实现端口转发、端口映射及双向通路

    iptables实现端口转发.端口映射及双向通路其实不难配置,看下文: 允许数据包转发: #echo 1 > /proc/sys/net/ipv4/ip_forward 转发TCP 8081到x ...

  9. 端口映射和端口转发区别是什么

    端口映射和端口转发的最大区别,是前者可以包括端对端P2P穿透,后者是完全走转发.例如北京金万维公司的快解析内网穿透软件端口映射,同时包含了P2P穿透和转发双重模式,只要可以上网就可以将本地端口快速映射 ...

最新文章

  1. Spring学习总结1——bean的生命周期
  2. flume-source
  3. grep -A :显示匹配行和之后的几行
  4. 95-10-080-启动-replicaManager副本管理器
  5. C#多线程学习-求和
  6. vss2005源码管理工具使用问题
  7. [Vue warn]: Extraneous non-props attributes (style) were passed to component but could not be 警告
  8. T4M插件放入unity后怎么找不到_Unity动画系统详解4:如何用代码控制动画?
  9. 第十二届noc网络机器人赛项成绩_2017年第15届中小学NOC活动全国决赛机器人超市购物赛项获奖结果...
  10. 类脑计算这么热,不如上了这趟车
  11. 附加Ken Burns特效的幻灯片
  12. 浙江工业大学计算机专业是几本,浙江工业大学是几本
  13. 总结40条常见的移动端Web页面问题及解决方案
  14. 搭建小说系统源码,如何实现读书的分页功能
  15. Axure初学者——好用的网站和技巧
  16. 双击jar包运行,出现使用压缩软件打开的情况
  17. 《大话设计模式(C#实现)》(Yanlz+VR云游戏+Unity+SteamVR+云技术+5G+AI+设计模式+GoF+UML+单例模式+观察者模式+抽象工厂+代理模式+框架编程+立钻哥哥++OK+)
  18. web安全——前端常见的攻击方式
  19. 数据大屏项目Vue+DataV+Echarts(附源码)
  20. maven是干嘛的_maven项目是干嘛的

热门文章

  1. 显示器测试软件 鲁大师,鲁大师怎么检测显示器 鲁大师有什么作用
  2. 判断图的连通子图个数
  3. 重磅----股票风险指标计算,附程序,百度网盘链接
  4. 百度网盘空间大缩水,最终会走向趣头条模式吗?
  5. let 连续复制_【进阶4-4期】Lodash是如何实现深拷贝的
  6. 手把手教你用Python+可视化工具制作漂亮地图
  7. c++练习 日期的顺延显示
  8. 实名认证挂号订单就诊人管理管理员对就诊人管理
  9. geoserver使用手册
  10. pe系统下读不到服务器硬盘,WinPE系统里找不到硬盘怎么办 WinPE系统里找不到硬盘解决【详解】...