一、SSH端口转发简介
SSH协议将其他TCP端口的网络数据通SSH链接来转发,这一过程也被叫做“隧道”(tunneling)。
在安全领域中可以利用SSH端口转发功能,突破防火墙的限制完成一些之前无法建立的TCP连接。
二、SSH端口转发分类
1、本地转发:
ssh -L localport:remotehost:remotehostport -fN sshserver
例如:ssh -L 8866:192.168.10.3:23 -fN 192.168.10.2
2、远程转发:
ssh -R localport:remotehost:remotehostport -fN sshserver
例如:ssh -R 8866:192.168.10.3:23 -fN 192.168.10.1
3、动态转发:
ssh -D proxyport -fN sshserver
例如:ssh -D 1100 -fN 192.168.10.2
参数:
localport 本机开启的端口号
remotehost 目标主机的IP地址
remotehostport 目标主机开放的TCP端口
sshserver 转发主机的IP地址
proxyport 代理端口
选项:
-f 后台启用
-N 不打开远程shell,处于等待状态(不加-N则直接登录进去)
-g 启用网关功能
三、实验案例:
案例环境:
3台RHEL6.5 64虚拟机(分别为:HostA、HostB、HostC)
桥接到vmnet1模式
IP地址:
HostA:192.168.58.134
HostB:192.168.58.135
HostC:192.168.58.136
角色:
外网主机:HostA
内网堡垒机:HostB
内网服务器:HostC
SSH本地转发
在本地(运行命令的机器上)建立一个监听端口,把所有对该本地端口的访问转发到sshserver,由sshserver替之访问internet
HostB:开启ssh远程访问
HostC:开启Telnet Server
需求:
HostC只允许HostB进行远程登录(以Telnet方式)
HostC拒绝HostA访问
HostB允许HostA访问(以ssh方式)
在HostA上设置本地转发
在HostA上实现对HostC的远程访问
(1)测试连通性,确保三台机子可以ping通
(2)在C上实施安全策略阻止A的访问
iptables -A INPUT -s 192.168.58.134 -j DROP
此时防火墙策略生效,A不能ping通C
B可以Ping通C
(3)C上安装telnet服务端,添加用户zhangsan
yum -y install telnet-server
修改telnet配置文件,使其可以telnet登录,
vim /etc/xinetd.d/telnet,修改disable=no
重启telnet服务
service xinetd start
添加用户zhangsan
useradd zhangsan
passwd zhangsan
(4)验证B能否访问
HOSTC安装客户端telnet
yum -y install telnet
B上验证是否可以使用telnet登录C
telnet 192.168.58.136
(5)A上验证是否可以telnet登录C
与B类似安装客户端telnet
yum -y install telnet
telnet C的ip – 不能访问
(6)B开启ssh登录服务
service sshd start (前提)
建立用户lisi
useradd lisi
(7)A验证是否可以SSH登录B
ssh lisi@192.168.58.135
(8)在A上设置本地转发
ssh -L localport:remotehost:remotehostport -fN sshserver
查看现在是否有8000端口
netstat -anpt|grep :8000
(9)A通过本地转发到B telnet登录C
telnet 127.0.0.1 8800
登录C的用户zhangsan
试着创建一个文件 mkdir c-from-c
在C上查看是否有 cc
(10)C主机上查看登录信息
netstat -anpt|grep :23
查看到B的ip,但实际上是A在连接
SSH远程转发
原理
远程端口转发,起一个监听端口在远程(sshserver机器);然后转发所有向这个新起远程端口的请求,到本地机器(执行命令的机器),再到目标机器。
和本地端口转发的区别是:
如果是本地转发,那么端口起在执行命令的机器上。
如果是远程转发,那么端口其在sshserver的机器上。
HostB:关闭ssh远程访问
HostC:开启Telnet Server
HostA:开启ssh远程访问
需求:
HostC只允许HostB进行远程登录(以Telnet方式)
HostC拒绝HostA访问
HostA允许HostB访问(以ssh方式)
在HostB上设置远程转发
在HostA上实现对HostC的远程访问
(1)关闭ssh远程登录服务,此时A不可ssh登录B
service sshd stop
(2)A开启ssh远程登录服务
service sshd start
创建用户wangwu
useradd wangwu
(3)B ssh远程登录A
ssh wangwu@192.168.58.134
(4)在B上设置远程转发
#ssh -R localport:remotehost:remotehostport -fN sshserver
#此处的端口号和本地转发一样,使用不存在的端口,此处我继续使用8000端口
#先查询ABC三台机子是否在使用8000端口,若正在使用,可以使用kill PID
杀死进程,释放端口
设置转发规则:ssh -R 8000:192.168.58.136:23 -fN 192.168.58.134
查询端口是否出现:netstat -anpt|grep :8800
(5)在A上远程登录C
telnet 127.0.0.1 8800
创建文件 mkdir ddd
(6)在C上查看登录信息
netstat -anpt|grep :23
查看到B的ip,但实际上是A在连接
查看ddd是否存在
SSH动态转发
原理
当用firefox访问internet时,本机设置的端口做为代理服务器,firefox的访问请求被转发到sshserver上,由sshserver替之访问internet
HostB:开启ssh远程访问
HostC:开启Telnet Server
需求:
HostC允许HostB访问其Web页(以http方式)
HostC拒绝HostA访问
HostB允许HostA访问(以ssh方式)
在HostA上设置动态转发
在HostA上设置浏览器代理
在HostA上实现对HostC的Web页访问
(1)B开启ssh远程访问,C开启telnet访问功能
(2)C上设置其web网页
cd /var/www/html
echo “www.c.com”>index.html
重启或开启http服务
service httpd restart/start
(3)在B访问C的web网页(以http方式)
(4)在A访问C的web网页(以http方式)
(5)在A上设置动态转发规则
ssh -D proxyport -fN sshserver
#此次我设置的端口号为1000,在使用前先查看端口号是否被占用
netstat -anpt|grep ssh
kill PID 杀掉进程,释放端口
netstat -anpt|grep ssh
killall ssh
ssh -D 1000 -fN 192.168.58.135
(6)在A上设置重新访问C
看有没有端口号1000
设置浏览器:编辑-首选项-高级-网络-设置-手动代理-socks,127.0.0.1,1000
浏览器重新访问C