在之前 GRE 的文章中,我们知道隧道技术可以解决异种网络的通信问题。在今天这篇文章中,将认识隧道技术的另一应用 - SSH 端口转发。

首先我们对 SSH 并不陌生,是应该非常普遍的加密协议,用于在不安全的网络中提供安全的传输环境,常见的用途是用于远程登录。而今天要介绍的端口转发,原理类似。

端口转发解决的问题:

  1. 增加安全性,加密 Client 到 Server 端的通信数据
  2. 突破防火墙限制,完成一些被禁止的 TCP 连接

端口转发的类型

在此之前,我们先了解一下端口转发的概念,端口转发是 SSH 的一种应用,可以理解成在本地 SSH Client 和远程 SSH Server 建立了一条安全的隧道,而这条隧道传输的内容可以是运行的其他 TCP 端口的流量。在隧道传输这些流量时,会进行加密,常见的 Telnet, SMTP, LDAP, HTTP 等等使用 TCP 作为传输层的协议都可以进行端口转发。

通常来说,端口转发分为三种类型,本地端口转发,远程端口转发,动态不定端口转发。会依次从应用场景和如何实现来介绍。

本地端口转发

在给客户部署应用时,通过来说访问的都是客户的内网环境,一般需要我们挂上客户的 VPN 然后通过提供的跳板机来访问目标服务器。但这样的配置,就给在一些 debug 场景带来很大的不便。

来看这样一个场景:

这里 Client A 需要依赖于 Server B 上一个 TCP 应用才能进行开发,但是由于防火墙的设置,Client A 的流量会被 Deny 掉。但提供了一台 Server A,而 Server A 到 Server B 却是可达的。这时我们就可以利用端口转发技术,通过 Server A 间接地实现和 Server B 的通信。这时 Server A 也就是常说的 Jump Server.

可以将 Client A 和 Server A 之间看成一条隧道,而隧道传输的内容就是 Server A 访问 Server B 的流量。

下面来配置一下:

ssh -L <local port>:<remote host>:<remote port> <SSH hostname>

# local port 相当于 ssh client 端口
# remote host 是目标主机 Server B 的地址
# remote port 是目标主机 Server B 的端口
# ssh hostname 是跳板机,也就是 Server A 的地址 # 在 Client A 上
ssh -NfL 65001:10.124.207.152:8000 root@10.124.207.155 -f 表示后台运行
-N 表示不输入命令
-L 表示本地端口转发

需要注意的内容:

  • Server A 到 Server B 一定是可达的
  • 另外在绑定端口时,要选择没有被使用的端口
  • 选用 1024-65535 之间的端口,之前的端口是给管理员使用的。

如何关闭:

like-unix: ps 找到进程 kill 掉

windows:
netstat -ano | findstr "65001"
taskkill /f /t /im 19036

远程端口转发

远程端口转发和本地端口转发很像,只不过调换了 ssh server 和 ssh client 的位置。

考虑下面的场景,还是 Client A 无法访问 Server B,但是 Server A 可以访问 Server B, 与之前不同的是,Client A 也不能访问 Server A 了,但 Server A 可以访问 Client.

这时我们可以在 Server A 进行配置,把 Client A 作为 SSH Server 而自己作为 SSH Client 建立隧道。和之前本地一样,在 Client A 上访问配置的端口,就会把流量转发给 SSH Client 也就是 SSH Server A,这时 Sever A 再将流量转发至 Server B.

  $ ssh -R <ssh client port>:<destnation host>:<destnation port> <ssh client host>
  
  # Server B 进行配置
  ssh -NfR 65001:10.124.207.152:8000 root@10.124.207.154

这时我们就可以达到和本地端口转发相同的效果,在 Client A 上访问 Server B.

如果分不清本地还是远程端口转发,可以通过 SSH Client 和 SSH server 来在加上访问应用的顺序加以区分

比如这里 Client A 想要访问 Server B 的 HTTP。

那么 Client A 上的浏览器作为 HTTP 的客户端,Server B 作为 HTTP 的服务端。也就是在 HTTP 应用视角,是从 Client A 给 Server B 发送请求。这个无论是本地还是远程,方向都一样。

接着再看 SSH 的客户端和服务端。

如果 SSH 的客户端在 Client A,则说明是本地端口转发。和 HTTP client 和 server 同向。由于建立的转发端口在本地,所以叫本地转发。

否则如果是 SSH 的客户端在 Server A,则说明是远程端口转发。和 HTTP client 和 server 反向。由于建立的转发端口在远端,所以叫远程端口转发。

其实无论是同向和反向,都是建立了一条隧道,只不过发起者不一样,实现的目的都是一样的。

本地和远程端口转发的共享

有时我们会希望共享 SSH Client 和 SSH Server 建立的隧道,提供给其他主机同时使用。这时我们可以通过 -g 参数来实现。

比如对本地端口转发进行共享:

ssh -g -NfL 65001:10.124.207.152:8000 root@10.124.207.155

原来仅对 localhost 和 127.0.0.1 生效,现在对当前主机的所有地址都会生效,也就是 0.0.0.0 的范围。在其他主机上可以通过访问 SSH Client IP:65001 来进行服务的访问。

远程端口转发同理:

 ssh -g -NfR 65001:10.124.207.152:8000 root@10.124.207.154

动态端口转发

动态端口转发的原理和本地及远程没有任何的区别,唯一的不同是,对于本地和远程来说我们需要固定访问应用的端口号,比如 80,443 等等。

但假设应用的端口不固定或者需要很多的端口号怎么办?这时就需要动态端口转发。

ssh -D <local port> <SSH Server>
# local port - ssh client 开启的代理转发端口
# ssh server - ssh server 的ip及端口 ssh -g -Nf -D 65001 root@10.124.207.155

可以用 curl 进行测试:

curl  --socks5 127.0.0.1:6500  http://10.124.207.152:8000/api-token-auth/

总结

最后我们完成了本地,远程,共享,动态的端口转发配置。

从整体来看,其实实现的都是相同的功能。在 SSH Client 和 SSH Server 中建立隧道。只不过有时隧道连接的方向是不同的。

SSH 端口转发 - 你不让我看,我也能看的更多相关文章

  1. 使用SSH代理上IPV6(使用SSH端口转发)

    这几个月在国外待着,一直担心我的六维账户怎么办,那可是个宝贝啊.我看网上说可以用六飞啊神马的在IPV6下上IPV6的网站,但是冒失现在六维封禁了非学校的IPV6地址,所以这些软件就不顶用了. 想到以前 ...

  2. 利用SSH端口转发实现跨机器直接访问

    在实际项目测试中经常会遇到数据库操作,但是因为公司安全问题,访问数据库往往需要通过跳板机.但通过跳板机,测试效率大打折扣,因此通过使用SSH端口转发,从而达到跨机器直接访问数据库.实际项目中的应用会比 ...

  3. Linux:ssh端口转发详解

    ssh是个多用途的工具,不仅可以远程登录,还可以搭建socks代理.进行内网穿透,这是利用它的端口转发功能来实现的. 所谓ssh端口转发,就是在ssh连接的基础上,指定 ssh client 或 ss ...

  4. ssh 端口转发实现外网 80 端口映射到内网 80 端口

    开发中经常需要外网服务映射到本机内网服务的需要,便于调试. 以前都是同事帮着配,这两天自己也看了一下 ssh 端口转发. 同事分分钟钟搞定的事情,自己折腾了 2 天, 真是弱爆了. 最初老想不明白一件 ...

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

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

  6. 【转】实战 SSH 端口转发

    本文转自:http://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/index.html,至于有什么用,懂的懂! 实战 SSH 端口转发 通 ...

  7. SSH 端口转发

    第一部分 概述 当你在咖啡馆享受免费 WiFi 的时候,有没有想到可能有人正在窃取你的密码及隐私信息?当你发现实验室的防火墙阻止了你的网络应用端口,是不是有苦难言?来看看 SSH 的端口转发功能能给我 ...

  8. 实战 SSH 端口转发

    转自实战 SSH 端口转发 通过本文的介绍,读者可以从中了解到如何应用 SSH 端口转发机制来解决日常工作 / 生活中的一些问题.学会在非安全环境下使用端口转发来加密网络应用,保护个人隐私以及重要商业 ...

  9. SSH25个命令 + 深入SSH端口转发细节

    OpenSSH是SSH连接工具的免费版本.telnet,rlogin和ftp用户可能还没意识到他们在互联网上传输的密码是未加密的,但SSH是加密的,OpenSSH加密所有通信(包括密码),有效消除了窃 ...

随机推荐

  1. win7下建立docker共享文件夹

    前言 建立本机(win7)和VirtualBox中docker虚拟机的共享文件夹,注:下面的命令都是以root身份运行的,使用sudo -i切换到root身份,如无法切换,请自行在命令前加上sudo命 ...

  2. 阿里云内部超全K8s实战手册!超全127页可下载

    一直关注云计算领域的人,必定知道Docker和Kubernetes的崛起.如今,世界范围内的公有云巨头(谷歌.亚马逊.微软.华为云.阿里云等等)都在其传统的公共云服务之上提供托管的Kubernetes ...

  3. scratch编程——画笔模块画各种同心图案

    我们今天是要用画笔来画出不同的同心图案,在画之前,我们先来了解一下画笔模块: 1.画笔模块的用法 画笔模块的用法就是在舞台上留下不同颜色粗细的线条,它的默认是情况是抬笔,我们在使用的时候要让角色移动到 ...

  4. C++语法小记---智能指针

    智能指针 用于缓解内存泄露的问题 用于替代原生指针 军规:只能指向堆空间中的对象或变量 方法 在智能指针的析构函数中调用delete 重载"->"操作符,只能重载成成员函数, ...

  5. python-多任务编程05-协程(coroutine)

    协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源). 为啥说它是一个执行单元,因为它自带CPU上下文.这样只要在合适的时机, 我们可以把一个协程 切换 ...

  6. web自动化 -- Select(下拉选择框操作)

    目标:(现在 select 这种已经很少了.一般都是  ul/li 或者 span/svg) 代码示例:

  7. CSS3选择器用法小结

    1.*通配符选择器 eg:*{margin:0;padding:0;} 2.#id选择符 ID选择器是CSS中效率最高的选择器,使用的时候要保证ID的唯一性 eg:#div{width:960px;m ...

  8. 好用到飞起的12个jupyter lab插件

    1 简介 jupyter lab作为jupyter notebook的升级改造版,除了更加人性化的交互界面以及更多的用户自主定制功能之外,最吸引人的就是其丰富多样的拓展插件,使得每个使用jupyter ...

  9. GridMask:一种数据增强方法

    GridMask Data Augmentation, ARXIV 2020 代码地址:https://github.com/akuxcw/GridMask 这篇论文提出了一种简单的数据增强方法,在图 ...

  10. ath10k MAC地址

    使用openwrt下ath10k驱动QCA9880修改其MAC地址方式 1. 使用artGUI修改9880寄存器方法(该方法有严重后遗症,目前还没有找到修改回去的方法) 2. 使用preinit修改其 ...