一、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端进行转发配置
- 在realserver上操作,添加防火墙策略,禁止172.18.30.253访问
- [root@localhost ~]# ip a | grep inet | grep eth0
- inet 172.18.30.100/16 brd 172.18.255.255 scope global eth0
- [root@localhost ~]# iptables -A INPUT -s 172.18.30.253 -j REJECT
- [root@localhost ~]# iptables -L
- Chain INPUT (policy ACCEPT)
- target prot opt source destination
- REJECT all -- 172.18.30.253 anywhere reject-with icmp-port-unreachable
- Chain FORWARD (policy ACCEPT)
- target prot opt source destination
- Chain OUTPUT (policy ACCEPT)
- target prot opt source destination
- dumpserver上安装telnet(以安装过)
- [root@joker-6-01 ~]# yum install -y telnet
- realserver上安装 telnet,并开启telnet服务
- [root@newhostname ~]# yum install -y telnet telnet-server
- [root@localhost ~]# systemctl start telnet.socket
- client上安装telnet
- [root@newhostname ~]# yum install -y telnet
- client端进行配置
- [root@newhostname ~]# ping -c1 172.18.30.100
- PING 172.18.30.100 (172.18.30.100) 56(84) bytes of data.
- From 172.18.30.100 icmp_seq=1 Destination Port Unreachable
- --- 172.18.30.100 ping statistics ---
- 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
- 可以看出现在client是连接不上realserver的
- [root@newhostname ~]# ssh -L 30000:172.18.30.100:23 172.18.30.254 -Nf
- root@172.18.30.254‘s password:
- [root@newhostname ~]# telnet 127.0.0.1 30000
- Trying 127.0.0.1...
- Connected to 127.0.0.1.
- Escape character is ‘^]‘.
- Kernel 3.10.0-693.el7.x86_64 on an x86_64
- localhost login: ddd
- Password:
- [ddd@localhost ~]$ ip a | grep inet | grep Bond0
- inet 172.18.30.1/32 brd 172.18.30.1 scope global Bond0
- inet 172.18.30.100/16 scope global Bond0
- 上述命令 ssh -L 30000:172.18.30.100:23 172.18.30.254 -Nf 表示开启一个本地转发服务
- 30000为本地开启的一个端口
- 172.18.30.100为realserver
- 23为realserver的telnet端口
- -N表示不登录到跳板机
- -f表示放在后台
- 开启转发服务之后,我们通过telnet client的30000端口,便可以连接到realserver了
- 这种在本地的操作需要在client也是一台linux主机
2、远程转发
同样是上面的图,只不过这次我们需要在dumpserver上进行操作,不需要再对client进行配置
我们需要在client上开启一个端口,我们就用9000为例,dumpserver会随机发起一个端口和client端的22端口建立一个连接,这client端就会监听其自身的9000端口,当有数据传入时,其会将数据通过ssh封装转发给dumpserver,dumpserver再随机开放一个端口,与realserver的23端口进行通信。
操作方法:
- 在dumpserver上进行操作(对于dumpserver来说,client端相当于他的服务器):
- [root@joker-6-01 ~]# ssh -R 9000:172.18.30.100:23 172.18.30.253 -Nf
- root@172.18.30.253‘s password:
- [root@joker-6-01 ~]# ss -nt
- State Recv-Q Send-Q Local Address:Port Peer Address:Port
- ESTAB 0 0 172.18.30.254:22 172.18.101.180:53815
- ESTAB 0 0 172.18.30.254:48064 172.18.30.253:22
- 上面操作dumpserver已经与client端建立了tcp连接
- 登录client端,执行命令
- [root@newhostname ~]# telnet 127.0.0.1 9000
- Trying 127.0.0.1...
- Connected to 127.0.0.1.
- Escape character is ‘^]‘.
- Kernel 3.10.0-693.el7.x86_64 on an x86_64
- localhost login: ddd
- Password:
- Login incorrect
- localhost login: ddd
- Password:
- Last failed login: Tue Jan 9 20:53:16 CST 2018 from ::ffff:172.18.30.254 on pts/1
- There was 1 failed login attempt since the last successful login.
- Last login: Tue Jan 9 20:24:56 from ::ffff:172.18.30.254
- [ddd@localhost ~]$ ip a s | grep inet | grep Bond0
- inet 172.18.30.1/32 brd 172.18.30.1 scope global Bond0
- inet 172.18.30.100/16 scope global Bond0
- [ddd@localhost ~]$
- 连接成功
3、动态端口转发
当用client访问internet时,本机的1080端口做为代理服务器,client的访问请求被转发到dumpserver上,由dumpserver替之访问internet。
配制方法:
- 在client端进行操作
- [root@newhostname ~]# ssh -D 1080 172.18.30.254
- root@172.18.30.254‘s password:
- Last login: Tue Jan 9 20:21:49 2018 from 172.18.30.253
- 这时在client端需要打开浏览器,配置sock5代理填写本机127.0.0.1 端口为1080,上网便是通过dumpserver来访问的了。
- 如:
- curl --socks5 127.0.0.1:1080 http://www.qq.com