• SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。而且,SSH 还能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。
  • 例如,Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,也能够通过将 TCP 端口转发来使用 SSH 进行通讯
  • SSH 端口转发能够提供两大功能:
    • 1.加密 SSH Client 端至 SSH Server 端之间的通讯数据
    • 2.突破防火墙的限制完成一些之前无法建立的 TCP 连接

1 ssh本地端口转发

本地端口转发的场景如下:

  • 客户端A需要使用telnet直接连接主机Cnginx,但是telnet协议不安全,客户端A可以使用ssh连接防火墙B,B可以在内网中使用telnet连接主机C,这样可以借助ssh通道在外网环境中封装telnet协议,实现安全传输。

    • 客户端A:主机名:xuzhichao;地址:192.168.50.17;
    • 防火墙B:主机名:iptables;地址:eth1:192.168.20.71;eth2:192.168.50.71;
    • nginxC:主机名:nginx02;地址:192.168.20.22;

  • SSH端口转发的语法格式如下:

    ssh -L <localport>:<remotehost>:<remotehostport> <sshserver>
    
    例如ssh -L 10086:172.20.50.121:23 172.20.169.50
    |客户端A连接SSH服务器B的端口|目标服务器C的ip|C的端口|SSH服务器ip| 选项:
    -f 后台启用
    -N 不打开远程shell,处于等待状态
    -g 启用网关功能
  • 在客户机A上操作,开通与SSH服务器的隧道,在客户端A开一个端口10086来连接SSH服务器B,开通隧道:

    #1.直接使用以下命令会登录到iptables主机上,等待输入指令:
    #注意:此处三台主机已经相互实现了基于key的验证,否则需要输入主机B的密码。
    [root@xuzhichao ~]# ssh -L 10010:192.168.20.22:23 192.168.50.71
    Last login: Sun Jul 25 11:03:50 2021 from 192.168.50.17
    [root@iptables ~]# #2.加上选项-N,会在当前shell中等待执行指令,终端不释放,客户机A不能执行其他操作, 配合-f选项,后台执行,不影响当前终端继续执行命令:
    [root@xuzhichao ~]# ssh -L 10010:192.168.20.22:23 -N 192.168.50.71
    ^CKilled by signal 2.
    [root@xuzhichao ~]# ssh -L 10010:192.168.20.22:23 -Nf 192.168.50.71
  • 此时客户端主机Atelnet自身的10010端口,会通过ssh服务将据被加密后转发到SSH服务器B的,B再解密信息转发到C:23,完成登录。

    [root@xuzhichao ~]# telnet 127.0.0.1 10010
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'. Kernel 3.10.0-1127.el7.x86_64 on an x86_64
    nginx02 login: xu
    Password:
    Last failed login: Sat Jul 24 16:59:02 CST 2021 from 192.168.20.17 on ssh:notty
    There was 1 failed login attempt since the last successful login.
    Last login: Sat Jul 24 12:03:29 from 192.168.20.22
    [xu@nginx02 ~]$
  • 查看三台主机的TCP连接关系:

    #1.客户端A主机:
    [root@xuzhichao ~]# ss -nt
    State Recv-Q Send-Q Local Address:Port Peer Address:Port
    ESTAB 0 0 192.168.50.17:43466 192.168.50.71:22
    ESTAB 0 0 127.0.0.1:10010 127.0.0.1:51486
    ESTAB 0 0 127.0.0.1:51486 127.0.0.1:10010 #2.主机B:
    [root@iptables ~]# ss -nt
    State Recv-Q Send-Q Local Address:Port Peer Address:Port
    ESTAB 0 0 192.168.50.71:22 192.168.50.17:43466
    ESTAB 0 0 192.168.20.71:50690 192.168.20.22:23 #3.主机C:
    [root@nginx02 ~]# ss -nt
    State Recv-Q Send-Q Local Address:Port Peer Address:Port
    ESTAB 0 0 192.168.20.22:23 192.168.20.71:50690
  • 总结:以上三台主机的连接关系为:

    • A: localhost:51486←→A:localhost:10010 ←→ A:ssh_client:43466 ←→ B:sshsrv:22 ←→ B:telnet_client:50690←→ C:telnetsrv:23
    • 防火墙B无需打开ip_forward功能。
    • 主机A和主机C之间也不需要互通。

2 ssh远程端口转发

远程端口转发场景说明:

  • 通常情况下,外部网络是不能直接使用ssh服务与防火墙内部的主机建立连接,而内部网络是可以向外通讯的,可以由内部向外搭接隧道,来达成远程转发。

  • 逻辑示例图如下:

  • 注意:在实际工作中搭接要注意客户端主机A的地址要为公网地址,不然连接不了。

  • 在SSH服务B上执行如下,让A(sshsrv)侦听10010端口的访问,如有访问,就加密后通过ssh服务转发请求到B(本机ssh客户端),再由B解密后转发到telnetsrv:23:

    #在主机B上启用远程端口转发:
    [root@iptables ~]# ssh -R 10010:192.168.20.22:23 -fN 192.168.50.17
    # |A:ssh端口|:Cip|:Ctelnet端口| | Aip | #主机Atelnet自身的10010端口即可连接到主机C的23端口。
    #反向连接,客户端A充当的是SSH的服务器
    [root@xuzhichao ~]# telnet 127.0.0.1 10010
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'. Kernel 3.10.0-1127.el7.x86_64 on an x86_64
    nginx02 login: xu
    Password:
    Last login: Sun Jul 25 11:28:13 from ::ffff:192.168.20.71
    [xu@nginx02 ~]$
  • 查看三台主机的TCP连接关系:

    #1.客户端主机A:
    [root@xuzhichao ~]# ss -nt
    State Recv-Q Send-Q Local Address:Port Peer Address:Port
    ESTAB 0 0 192.168.50.17:22 192.168.50.71:38686
    ESTAB 0 0 127.0.0.1:51504 127.0.0.1:10010
    ESTAB 0 0 127.0.0.1:10010 127.0.0.1:51504 #2.防火墙主机B:
    [root@iptables ~]# ss -nt
    State Recv-Q Send-Q Local Address:Port Peer Address:Port
    ESTAB 0 0 192.168.50.71:38686 192.168.50.17:22
    ESTAB 0 0 192.168.20.71:50702 192.168.20.22:23 #3.nginx主机C:
    [root@nginx02 ~]# ss -nt
    State Recv-Q Send-Q Local Address:Port Peer Address:Port
    ESTAB 0 0 192.168.20.22:23 192.168.20.71:50702
  • 总结:以上三台主机的连接关系为:

    • A:localhost:51504 ←→ A:localhost:10010←→ A:sshsrv:22 ←→ B:ssh_client:38686 ←→B:telnet_client:50702 ←→C: telnetsrv:23
    • 防火墙B无需打开ip_forward功能。
    • 主机A和主机C之间也不需要互通。

3 跨网络访问(网关功能)

网关功能的场景如下:

  • 以上端口转发的场景中智能实现单台主机连接远端的服务器,要想实现一个网段内的所有设备都可以连接远端服务器,就需要使用网关功能。

  • 主机A所在网络的所有主机要telnet主机D,这样主机B和主机C位于公网,就可以建立ssh通道,承载主机A到主机D的telnet流量,主机B和主机C之间可以使用本地端口转发也可以使用远程端口转发。

    • 本地转发 -L ,此实验使用本地转发

      A(telnet client) B(SSH client) ------internet ssh----C(ssh server) D(telnet server)

    • 远程转发 -R

      A(telnet client) B(SSH server) ------internet ssh----C(ssh client) D(telnet server)

  • 在主机B上操作

    #需要加上选项-g来充当网关
    #如果不加-g选项,则B主机上的监听的端口为localhost:10010,只用本机可以连接
    #加上-g选项,10086端口为*:10086,所有人都可以连接,也就是说A可以连接
    [root@lvs-02 ~]# ssh -L 10010:192.168.20.22:23 192.168.2.43 -fgN [root@lvs-02 ~]# ss -ntl
    State Recv-Q Send-Q Local Address:Port Peer Address:Port
    LISTEN 0 128 *:10010 *:*
  • 主机A上telnet主机B的10010端口:

    #在主机A上执行如下命令,将请求发送到B主机的10010端口,通过SSH封装,发送给C,C解SSH封装后发送给D
    [root@xuzhichao ~]# telnet 192.168.50.32 10010
    Trying 192.168.50.32...
    Connected to 192.168.50.32.
    Escape character is '^]'. Kernel 3.10.0-1127.el7.x86_64 on an x86_64
    nginx02 login: xu
    Password:
    Last login: Sun Jul 25 17:58:50 from ::ffff:192.168.20.71
    [xu@nginx02 ~]$
  • 查看四台主机的TCP连接关系:

    #主机A:
    [root@xuzhichao ~]# ss -nt
    State Recv-Q Send-Q Local Address:Port Peer Address:Port
    ESTAB 0 0 192.168.50.17:55730 192.168.50.32:10010 #主机B:
    [root@lvs-02 ~]# ss -nt
    State Recv-Q Send-Q Local Address:Port Peer Address:Port
    ESTAB 0 0 192.168.2.38:55356 192.168.2.43:22
    ESTAB 0 0 192.168.50.32:10010 192.168.50.17:55730 #主机C:
    [root@iptables ~]# ss -nt
    State Recv-Q Send-Q Local Address:Port Peer Address:Port
    ESTAB 0 0 192.168.20.71:50704 192.168.20.22:23
    ESTAB 0 0 192.168.2.43:22 192.168.2.38:55356 #主机D:
    [root@nginx02 ~]# ss -nt
    State Recv-Q Send-Q Local Address:Port Peer Address:Port
    ESTAB 0 0 192.168.20.22:23 192.168.20.71:50704
  • 总结:

    • 主机B和主机C无需打开ip_forward功能。
    • 两个网络之间只需要主机B和主机C互通即可。
    • 如果使用远程转发:主机C上执行:ssh -R 10010:D:23 B -fgN

4 动态端口转发(KX上网)

当用firefox访问internet时,本机的1080端口做为代理服务器,firefox的访问请求被转发到sshserver上,由sshserver替之访问internet

语法格式

ssh -D localport root@sshserver

在本机firefox设置代理socket proxy:127.0.0.1:1080

curl --socks5 127.0.0.1:1080 http://www.qq.com

示例

A B C三台主机,假设B为墙外服务器,C为本地客户端,工作原理同SSH隧道,SSH客户端发送请求,通过ssh端口将信息封装,发送给SSH服务器,服务器解封装,发送给目标地址。

  • A主机充当谷歌
'启动httpd服务'
[root@haiB ~]$service httpd start
'将google放入名/var/www/html/index.html,伪装google页面'
[root@haiB ~]$echo www.google.com>/var/www/html/index.html
  • C本地客户端
#加入名字DNS解析,将192.168.32.6伪装为google:
[root@haiC ~]$vim /etc/hosts
192.168.32.6 www.google.com #字符界面,检验搭建情况
[root@haiC ~]$curl www.google.com #图形界面
[root@haiC ~]$firefox www.google.com
#A主机上拒绝C访问,假冒防火墙
[root@haiA ~]$iptables -A INPUT -s 172.20.50.201 -j REJECT #C主机上执行以下命令,通过本地10086接口,连接墙外服务器B,
[root@haiA ~]$ssh -D 10086 172.20.50.150 -fN
#修改浏览器的代理地址,让代理地址指向本机的10086端口

#配置浏览器,在浏览界面选择菜单preferences→Advanced→Network→Seting→Manual proxy configuration→SOCKS Host 127.0.0.1 Port:10086
  • 将C主机作为代理服务器,让其他主机通过C来连接A
#在C主机上执行以下命令,以10086端口作为ssh服务,连接B主机,加上网关功能-g选项
[root@haiC ~]$ssh -D 10086 172.20.50.150 -fgN #在A上拒绝主机D,假设防火墙
[root@haiA ~]$iptables -A INPUT -s 172.20.50.222 -j REJECT #主机D尝试通过代理服务连接A #字符界面
[root@haiD ~]$curl --socks5 172.20.50.201:10086 http://www.google.com #图形界面
配置浏览器,在浏览界面选择菜单preferences→ Advanced→ Network→ Seting→ Manual proxy configuration→ SOCKS Host 172.20.50.201 Port:10086

ssh端口转发实际应用的更多相关文章

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

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

  2. SSH 端口转发

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

  3. 实战 SSH 端口转发

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

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

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

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

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

  6. Linux SSH端口转发

    SSH端口转发分为两种,一种是本地端口转发,又称为本地SSH隧道.一直是远程端口转发.SSH端口转发,还必须指定数据传送的目标主机,从而形成点对点的端口转发. 本地端口转发     假定有三台主机A. ...

  7. 玩转SSH端口转发

    SSH有三种端口转发模式,本地端口转发(Local Port Forwarding),**远程端口转发(Local Port Forwarding)**以及**动态端口转发(Dynamic Port ...

  8. SSH端口转发详解及实例

    一.SSH端口转发简介 SSH会自动加密和解密所有SSH客户端与服务端之间的网络数据.但是,SSH还能够将其他TCP端口的网络数据通SSH链接来转发,并且自动提供了相应的加密及解密服务.这一过程也被叫 ...

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

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

  10. SSH端口转发(本地转发、远程转发、动态转发)

    SSH端口转发   一:什么是端口转发?     SSH 会自动加密和解密所有SSH 客户端与服务端之间的网络数据.但是,SSH 还能够将其他TCP 端口的网络数据通过SSH 链接来转发,并且自动提供 ...

随机推荐

  1. #树形dp,直径#51nod 1812 树的双直径

    题目 给定一棵树,边权是整数 \(c_i\) ,找出两条不相交的链(没有公共点), 使得链长的乘积最大(链长定义为这条链上所有边的权值之和,如果这条链只有1个点则链长视为0). \(n\leq 4*1 ...

  2. #扩展欧拉定理#CF906D Power Tower

    题目 给定一个数列,有\(m\)组询问 定义 \[\large f(x-1)={a_x}^{f(x)} \] 若 \(f(r)=a_r\) 求 \(f(l)\) 对固定的 \(mod\) 取模 分析 ...

  3. #排列组合,容斥#洛谷 5684 [CSPJX2019]非回文串

    题目 分析 那显然就是\(n!\)减去回文串的方案数 首先如果有超过一个出现奇数次字母那肯定不存在回文串 如果有且仅有一个首先要在次数中选择一个然后其它当偶数处理 偶数那就是首先字母位置选好但顺序可以 ...

  4. OpenHarmony Meetup 2023 广州站圆满举办,城市巡回全面启航

      "OpenHarmony正当时--技术开源"OpenHarmony Meetup 2023城市巡回活动,旨在通过meetup线下交流形式,解读OpenHarmony作为下一代智 ...

  5. 基于 Scriptable 从零开始美化iOS桌面(一)

    今天我为大家带来新的作品,iOS17桌面组件神器(Scriptable)原创脚本,精美作品分享!喜欢的话就点关注吧!更多脚本正在路上... * script : ONE-Progress.js * v ...

  6. BI、OLAP、多维分析、CUBE 这几个词是什么关系?

    这些词我们在建设分析型应用时经常会听到,这几个词也经常被弄混,这里来梳理一下. BIBI 是 Business Intelligence(商业智能)的缩写,是指企业利用已有数据进行数据分析从而指导商业 ...

  7. http协议重新整理——————历史[一]

    前言 简单整理一些http协议. 正文 20 世纪 60 年代,美国国防部高等研究计划署(ARPA)建立了 ARPA 网,它有四个分布在各地的节点,被认为是如今互联网的"始祖". ...

  8. SharePreferences概念

    概念 SharePreferences是一种轻量级的数据存储方式,它是以key-value的形式保存在 data/data//shared_prefs 下的xml文件中.通常使用它来保存应用中的一些简 ...

  9. 使用Skyline 新型UI管理OpenStack技术方案

    使用Skyline 新型UI管理OpenStack [摘要] Skyline 是一个经过 UI 和 UE 优化过的 OpenStack 仪表盘,支持 OpenStack Train 及以上版本.Sky ...

  10. 物联网浏览器(IoTBrowser)-使用深度学习开发防浸水远程报警

    一.起因 新房子买在2楼,反水概率较大,加上无良开发商的劣质材料,就我所在楼栋已经发生几起反水事件,而且是高层反水,有几户重复出现反水,原因是管道中间有一个钢筋 :( 二.解决方案 1.水浸传感器+W ...