layout: post
title: SSH的端口转发
date: 2018-01-09
tags: [“Linux”,”远程登录与文件传输工具”]


一、SSH端口转发的概念

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

二、SSH端口转发的三种场景

1、 本地转发

先看图,总共3台机器,我们想要使用 client去telnet到realserver上,直接连接是连不上的,这时我们可以在client端进行如下操作

我们可以开启client的端的一个本地端口,我们以30000端口为例
在client上连接自己的30000端口,传输的数据通过ssh封装发送到到dumpserver,再有dumpserver执行telnet到realserver,建立连接
这是,realserver的socket显示连接的是dumpserver,而不是client,但真实发送数据的是client端。
通过这种转发机制,即实现了,数据的封装保密,又实现了内外网服务的连接。

流程:data->client:30000->client:随即端口 ->dumpserver:22->dumserver: 随即端口->realserver:23

下面是执行步骤:

1、因为图内画的是同一网段的机器,为了实验,我们现在realserver上使用防火墙策略,禁止client端连接。
2、client、dumpserver需要安装telnet-server包
3、在client端进行转发配置

 

  1. realserver上操作,添加防火墙策略,禁止172.18.30.253访问
  2.  
  3. [root@localhost ~]# ip a ' grep inet ' grep eth0
  4. inet 172.18.30.100/16 brd 172.18.255.255 scope global eth0
  5. [root@localhost ~]# iptables -A INPUT -s 172.18.30.253 -j REJECT
  6. [root@localhost ~]# iptables -L
  7. Chain INPUT (policy ACCEPT)
  8. target prot opt source destination
  9. REJECT all -- 172.18.30.253 anywhere reject-with icmp-port-unreachable
  10.  
  11. Chain FORWARD (policy ACCEPT)
  12. target prot opt source destination
  13.  
  14. Chain OUTPUT (policy ACCEPT)
  15. target prot opt source destination
  1. dumpserver上安装telnet(以安装过)
  2. [root@joker-6-01 ~]# yum install -y telnet
  3.  
  4. realserver上安装 telnet,并开启telnet服务
  5. [root@newhostname ~]# yum install -y telnet telnet-server
  6. [root@localhost ~]# systemctl start telnet.socket
  7.  
  8. client上安装telnet
  9. [root@newhostname ~]# yum install -y telnet
  10.  
  1. client端进行配置
  2.  
  3. [root@newhostname ~]# ping -c1 172.18.30.100
  4. PING 172.18.30.100 (172.18.30.100) 56(84) bytes of data.
  5. From 172.18.30.100 icmp_seq=1 Destination Port Unreachable
  6.  
  7. --- 172.18.30.100 ping statistics ---
  8. 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
  9. 可以看出现在client是连接不上realserver
  10.  
  11. [root@newhostname ~]# ssh -L 30000:172.18.30.100:23 172.18.30.254 -Nf
  12. root@172.18.30.254's password:
  13. [root@newhostname ~]# telnet 127.0.0.1 30000
  14. Trying 127.0.0.1...
  15. Connected to 127.0.0.1.
  16. Escape character is '^]'.
  17.  
  18. Kernel 3.10.0-693.el7.x86_64 on an x86_64
  19. localhost login: ddd
  20. Password:
  21.  
  22. [ddd@localhost ~]$ ip a ' grep inet ' grep Bond0
  23. inet 172.18.30.1/32 brd 172.18.30.1 scope global Bond0
  24. inet 172.18.30.100/16 scope global Bond0
  25.  
  26. 上述命令 ssh -L 30000:172.18.30.100:23 172.18.30.254 -Nf 表示开启一个本地转发服务
  27. 30000为本地开启的一个端口
  28. 172.18.30.100为realserver
  29. 23为realserver的telnet端口
  30. -N表示不登录到跳板机
  31. -f表示放在后台
  32.  
  33. 开启转发服务之后,我们通过telnet client的30000端口,便可以连接到realserver了
  34. 这种在本地的操作需要在client也是一台linux主机

2、远程转发

同样是上面的图,只不过这次我们需要在dumpserver上进行操作,不需要再对client进行配置

我们需要在client上开启一个端口,我们就用9000为例,dumpserver会随机发起一个端口和client端的22端口建立一个连接,这client端就会监听其自身的9000端口,当有数据传入时,其会将数据通过ssh封装转发给dumpserver,dumpserver再随机开放一个端口,与realserver的23端口进行通信。

操作方法:

  1. dumpserver上进行操作(对于dumpserver来说,client端相当于他的服务器):
  2. [root@joker-6-01 ~]# ssh -R 9000:172.18.30.100:23 172.18.30.253 -Nf
  3. root@172.18.30.253's password:
  4. [root@joker-6-01 ~]# ss -nt
  5. State Recv-Q Send-Q Local Address:Port Peer Address:Port
  6. ESTAB 0 0 172.18.30.254:22 172.18.101.180:53815
  7. ESTAB 0 0 172.18.30.254:48064 172.18.30.253:22
  8.  
  9. 上面操作dumpserver已经与client端建立了tcp连接
  10.  
  11. 登录client端,执行命令
  12. [root@newhostname ~]# telnet 127.0.0.1 9000
  13. Trying 127.0.0.1...
  14. Connected to 127.0.0.1.
  15. Escape character is '^]'.
  16.  
  17. Kernel 3.10.0-693.el7.x86_64 on an x86_64
  18. localhost login: ddd
  19. Password:
  20. Login incorrect
  21.  
  22. localhost login: ddd
  23. Password:
  24. Last failed login: Tue Jan 9 20:53:16 CST 2018 from ::ffff:172.18.30.254 on pts/1
  25. There was 1 failed login attempt since the last successful login.
  26. Last login: Tue Jan 9 20:24:56 from ::ffff:172.18.30.254
  27.  
  28. [ddd@localhost ~]$ ip a s ' grep inet ' grep Bond0
  29. inet 172.18.30.1/32 brd 172.18.30.1 scope global Bond0
  30. inet 172.18.30.100/16 scope global Bond0
  31. [ddd@localhost ~]$
  32.  
  33. 连接成功

3、动态端口转发

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

配制方法:

  1. client端进行操作

  2. [root@newhostname ~]# ssh -D 1080 172.18.30.254
    root@172.18.30.254s password:
    Last login: Tue Jan 9 20:21:49 2018 from 172.18.30.253

  3. 这时在client端需要打开浏览器,配置sock5代理填写本机127.0.0.1 端口为1080,上网便是通过dumpserver来访问的了。

  4. 如:
    curl socks5 127.0.0.1:1080 http://www.qq.com


 

 

 

文档更新时间: 2018-12-19 15:15   作者:张尚