SSH的端口转发

Posted 莫孟林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSH的端口转发相关的知识,希望对你有一定的参考价值。

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

2、远程转发

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

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

操作方法:

  1. 在dumpserver上进行操作(对于dumpserver来说,client端相当于他的服务器):
  2. [[email protected]6-01 ~]# ssh -R 9000:172.18.30.100:23 172.18.30.253 -Nf
  3. [email protected]172.18.30.253‘s password:
  4. [[email protected]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. 上面操作dumpserver已经与client端建立了tcp连接
  9. 登录client端,执行命令
  10. [[email protected] ~]# telnet 127.0.0.1 9000
  11. Trying 127.0.0.1...
  12. Connected to 127.0.0.1.
  13. Escape character is ‘^]‘.
  14. Kernel 3.10.0-693.el7.x86_64 on an x86_64
  15. localhost login: ddd
  16. Password:
  17. Login incorrect
  18. localhost login: ddd
  19. Password:
  20. Last failed login: Tue Jan 9 20:53:16 CST 2018 from ::ffff:172.18.30.254 on pts/1
  21. There was 1 failed login attempt since the last successful login.
  22. Last login: Tue Jan 9 20:24:56 from ::ffff:172.18.30.254
  23. [[email protected] ~]$ ip a s | grep inet | grep Bond0
  24. inet 172.18.30.1/32 brd 172.18.30.1 scope global Bond0
  25. inet 172.18.30.100/16 scope global Bond0
  26. [[email protected] ~]$
  27. 连接成功

3、动态端口转发

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

配制方法:

    1. 在client端进行操作
    2. [[email protected] ~]# ssh -D 1080 172.18.30.254
    3. [email protected]172.18.30.254‘s password:
    4. Last login: Tue Jan 9 20:21:49 2018 from 172.18.30.253
    5. 这时在client端需要打开浏览器,配置sock5代理填写本机127.0.0.1 端口为1080,上网便是通过dumpserver来访问的了。
    6. 如:
    7. curl --socks5 127.0.0.1:1080 http://www.qq.com





以上是关于SSH的端口转发的主要内容,如果未能解决你的问题,请参考以下文章

SSH -R 远程端口转发

SSH 内网端口转发实战

SSH端口转发

SSH高级功能 - 远程端口转发

ssh动态端口转发

安全牛学习笔记SSH远程端口转发和动态端口转发以及X协议转发