暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SSH的4种端口转发类型实验测试

请叫我水哥 2020-09-10
2003

一、本地端口转发

    1.1 主要作用

    1.2 使用场景

    1.3 使用格式

    1.4 实验步骤

二、远程端口转发

    2.1 主要作用

    2.2 使用场景

    2.3 使用格式

    2.4 实验步骤

        2.4.1 简单测试远程端口转发

        2.4.2 远程端口转发代理配置

三、ssh的动态端口转发

    3.1主要作用

    3.2 使用场景

    3.3 命令格式

    3.4 实验步骤

四、ssh的X协议转发

    4.1 主要作用

    4.2 使用场景

    4.3 命令格式

    4.4 实验步骤

SSH除了提供加密的远程连接外,还同时提供了一个强大的功能---端口转发:它能够将其他 TCP 端口的网络数据通过 SSH 连接来转发,并且自动提供了相应的加密及解密服务。

SSH 端口转发能够提供两大功能:

  • 加密 SSH Client 端至 SSH Server 端之间的通讯数据。

  • 突破防火墙和一些其他网络限制完成一些之前无法建立的 TCP 连接。

一、本地端口转发

1.1 主要作用

发送到本地端口的请求,转发到目的端口。

1.2 使用场景

主要针对在内网环境服务器的应用端口被防火墙阻止,而这时候为了绕过防火墙做测试应用是否正常,就需要使用本地端口转发了。(当然你也可以在安全设备上面直接放行,更省事(●'◡'●))

1.3 使用格式

ssh -L 本地端口:目标地址:目标端口  用户名@目标地址

1.4 实验步骤

  • web服务器:192.168.10.183

  • 客户端1:192.168.10.182

  • win10客户端:192.168.10.1

1) 安装nginx(安装过程忽略),开启80端口
[root@web ~]# curl 127.0.0.1
ssh-ForwardPort:192.168.10.183


2)开启防火墙,禁止其他访问nginx(为了模拟如果通过ssh绕过防火墙访问应用端口)
[root@web ~]# iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport=80 -j DRO
//访问测试
[root@client ~]# curl 192.168.10.183
curl: (7) Failed connect to 192.168.10.183:80; 连接超时
//这样就无法访问nginx了,如何突破防火墙限制呢


3)ssh端口转发配置
[root@client ~]# ssh -f -N -L 80:127.0.0.1:80 root@192.168.10.183
root@192.168.10.183's password:
参数解析:
-f:与-N连用,不用登陆远程主机,在后台验证账号密码
-N:与-f连用,不执行脚本或者命令
-L:本地转发必须参数
[root@client ~]# netstat -anptul |grep 80 //会在本地开启80端口
tcp 0 0 127.0.0.1:80 0.0.0.0:* LISTEN 1346/ssh
tcp6 0 0 :::80 :::* LISTEN 1346/ssh


4)转发测试
[root@client ~]# curl 127.0.0.1:80 //可以看到访问本地的80端口跳转到48.183服务器的80端口了
ssh-ForwardPort:192.168.10.183


5)分析过程
a.在client上的应用数据发送到本机的80端口
b.本机的ssh client会将80端口的数据加密转发到web server服务器的ssh server上
c.ssh server会解密接收到的数据并转发到web80端口
d.web80原路返回响应,完成整个流程
注意:可以看到整个过程是ssh建立的,所以如果有防火墙的话,一定要保障ssh能够连接。
远程端口为什么用127.0.0.1?
这个取决nginx的配置,在nginx服务器上面只有127.0.0.1能够访问。如果服务器上端口可以通过ip访问,那么这里也可以把127.0.0.1替换成远端ip地址
[root@web ~]# curl 192.168.10.183
curl: (7) Failed connect to 192.168.10.183:80; 连接超时 //在web服务器上面也只能通过127.0.0.1访问


6)在上面本地测试中使用127.0.0.1访问,是否能够使用其他地址?
不行的,在本地端口转发中,绑定的是loopback接口,只有localhost或者127.0.0.1才能使用本地端口的转发。
如果其他机器也要访问,该如何设置?使用关键字-g:GatewayPorts
[root@client ~]# ssh -g -f -N -L 80:127.0.0.1:80 root@192.168.10.183
root@192.168.10.183's password:
//其他机器,比如我本地的win10客户端访问
C:\Users\cs>curl 192.168.10.182
ssh-ForwardPort:192.168.10.183
//说明下-g其实对应的是配置文件的#GatewayPorts这个值,改为yes后就和加-g命令选项是一样的了。

二、远程端口转发

2.1 主要作用

发送到远端端口的请求,转发到目标端口

2.2 使用场景

比如我在内网起了一个web服务,希望从外网能够访问或者测试应用,但是外网是不可能直接访问我的内网服务器的。所以我可以在本地web服务器上开启ssh的远程端口转发,这样就可以通过访问外网客户机的80端口,来访问web服务器的80端口了,从而实现外网访问内网的应用了。

2.3 使用格式

ssh -R 本地端口:目标地址:目标端口 user@目标host

2.4 实验步骤

  • web服务器:192.168.10.183 vmnet1

  • 代理服务器:192.168.10.182 vmnet1   192.168.48.182 vmnet8

  • 客户端:192.168.48.181  vmnet8   (两个网络要三层互通)

2.4.1 简单测试远程端口转发

sshclient--sshserver(本地转发这种属于正向连接),sshserver--sshclient(远程端口转发这种属于反向连接)
1.开启远程端口转发
[root@web ~]# ssh -g -f -N -R 8080:127.0.0.1:80 192.168.10.182
root@192.168.10.182's password:
//-R:远程端口转发关键字


2.执行完上面命令后,客户端马上会开启相应的监听端口
[root@client ~]# netstat -anptul |grep 80
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 1358/sshd: root
tcp6 0 0 ::1:8080 :::* LISTEN 1358/sshd: root


3.测试
[root@client ~]# curl 127.0.0.1:8080
ssh-ForwardPort:192.168.10.183


这个实验只是简单测试了下远程端口转发属于一种反向连接(在服务器开启转发)。实看一下和本地连接没什么区别,只是使用位置有变化而已。

2.4.2 远程端口转发代理配置

下面进行远程端口转发代理的配置,模拟公网环境(也就是前面所说的主要使用场景)

在上面的实验中,在client只能使用本地的127.0.0.1访问,如果这个client属于内网web和外网client的跳板机模拟公网场景。其实就是如何设置转发过来的监听不再使用127.0.0.1:8080监听,而使用0.0.0.0:8080监听

1.继续简单实验上面操作,查看client的监听
[root@client ~]# netstat -anptul |grep 80
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 1366/sshd: root
tcp6 0 0 ::1:8080 :::* LISTEN 1366/sshd: root


2.修改配置文件GatewayPorts=no改为yes,其实就是等同于-g参数
[root@client ~]# cat /etc/ssh/sshd_config |grep -i gatewayports
GatewayPorts yes
[root@client ~]# systemctl restart sshd


3.重新在webserver上面配置转发参数
[root@web ~]# ssh -g -f -N -R 8080:127.0.0.1:80 192.168.10.182
root@192.168.10.182's password:


4.客户端查看
[root@client ~]# netstat -anptul |grep 8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1472/sshd: root
tcp6 0 0 :::8080 :::* LISTEN 1472/sshd: root
//可以看到监听变了,从监听127.0.0.1到0.0.0.0所有地址


5.客户端测试下
[root@s2 ~]# curl -x 192.168.48.182:8080 127.0.0.1
ssh-ForwardPort:192.168.10.183
//这种方式使用了-g可以允许其他客户端访问,这个过程不是加密连接。值得注意
//-x:指定http请求的代理,比如上面指定http请求通过192.168.48.182:8080代理发出
//注意没有,其实还是要通过curl 127.0.0.1才能访问网站的

如果是windows客户端如何测试呢?使用chrmon浏览器,谷歌代理插件(SwitchyOmega):

配置好后,测试下

看到了吗,这样就可以通过不再一个网段,可以直接访问内网的服务。

三、ssh的动态端口转发

3.1主要作用

前面说的两种方式都要有一个固定的应用服务端口号。但是动态转发不需要指定特定的目标主机和端口。这种方式就是使用了sock5代理的方式了,用过翻墙的都知道。动态端口转发可以实现不加密的网络连接都走ssh连接,提升了安全性,其实也避免了端口的浪费。

3.2 使用场景

主要是作为中间代理访问应用,加密客户端到服务端的访问链接。

3.3 命令格式

格式:ssh -D 本地端口 user@目标主机 
//本地端口是随机端口,只要是本地没有使用的都可以

3.4 实验步骤

1.服务端配置
[root@client ~]# ssh -g -f -N -D 8000 root@192.168.10.183
root@192.168.10.183's password:
[root@client ~]# netstat -anptul |grep 8000
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 1520/ssh
tcp6 0 0 :::8000 :::* LISTEN 1520/ssh
2.代理配置测试
[root@s2 ~]# curl -x socks5://192.168.48.182:8000 http://192.168.10.183
ssh-ForwardPort:192.168.10.183
使用谷歌浏览器也可以测试,我这里就不演示了.和上面截图的配置方式一样,只不过是代理协议选择sock5就可以了

四、ssh的X协议转发

4.1 主要作用

和本地转发的作用类似,也是突破防火墙在中间的限制

4.2 使用场景

比如在使用一些图形界面(oralce的图形安装、vnc的使用等),需要把X Client端的图形转发到X Server端,但是中间有防火墙隔离这种情况

可能说的不明白,模拟下:下面其实原理就是利用了ssh协议x协议的转发原理

比如我要把一个服务器上的一个图形界面显示在本地电脑,这里以xclock下工具测试

这里使用工具xmanager中的xbrower来演示

需要在服务端端准备yum install -y xterm  xorg-x11-xauth

xstart配置,主要是使用xterm命令调用linux图形化界面到本地:如下图

然后就可以出来可小窗口,可以进行相关命令操作,并且还可以使用clock命令调用时钟窗口:

用的:0.0这个虚拟显示窗口,含义:<display#>.<virtual#>

从上面可以知道,如果我要图形化安装一些软件,比如oracle,是不是很方便。这就是shell的x转发好处

4.3 命令格式

格式:ssh -X 目标主机
//注意是大写的X

4.4 实验步骤

和xstart原理是一样的,只是xstart是别人做好的软件,更方便

1.为了模拟,还是使用xclock这个小玩意


2.把 X Client端的X窗口显示在 X Serve 端需要先行在 X Client端指定 X Server的位置,这个使用要使用DISPLAY变量(X Client端使用)
[root@client ~]# export DISAPLAY=192.168.48.183:10.0


3.开启X协议转发
[root@localhost ~]# ssh -X 192.168.48.183 //注意转发的目标端一定要有X Server,否则会报错
输入密码:
进入
[root@client ~]# xclock
截图如下


文章转载自请叫我水哥,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论