linux安全和加密篇(六)SSH隧道—动态端口转发

SSH端口转发

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

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

  • 加密 SSH Client 端至 SSH Server 端之间的通讯数据
  • 突破防火墙的限制完成一些之前无法建立的 TCP 连接

转发方法分为两种类型:

1、本地转发:

  • -L localport:remotehost:remotehostport sshserver

选项:

  • -f 后台启用
  • -N 不打开远程shell,处于等待状态
  • -g 启用网关功能

示例

  • ssh –L 9527:telnetsrv:23 -N sshsrv (srv表示服务器IP地址)
  • telnet 127.0.0.1 9527

当访问本机的9527的端口时,被加密后转发到sshsrv的ssh服务,再解密被转发到telnetsrv:23

A本机:9527

data <---> localhost:9527 <-----> localhost:XXXXX <----> sshsrv:22 <---->sshsrv:YYYYY <---->telnetsrv:23

例子:

互联网主机 A 通过telnet服务实现远程————连接企业内telnet服务器 B

虚拟机环境:

centos6主机A (A 充当互联网中的 client ) IP地址:192.168.161.128

centos6主机B (B主机充当企业内部ssh服务器 为实现搭建A---->C中的隧道功能)telnet数据通过ssh封装起到安全连接作用。

IP地址:192.168.161.129

centos7主机C (C充当企业内部局域网中telnet服务器和企业内部防火墙)IP地址:192.168.161.130

首先在主机B 中添加防火墙策略模拟外网防火墙,用来拒绝centos6主机的请求

iptables -A INPUT -s 192.168.161.128 -j REJECT

当主机A 使用telnet 192.168.161.130 请求主机B的时候就会被拒绝;出现以下提醒:

[root@localhost ~]# telnet 192.168.161.130                 ###请求被拒绝###
Trying 192.168.161.130...
telnet: connect to address 192.168.161.130: Connection refused

第一步:在主机A---B中间建立隧道连接

我们在主机A和主机B上建立 主机A-C的telnet隧道功能:

[root@localhost ~]# ssh -L 9527:192.168.161.130:23 -N 192.168.161.129 -f    ###在主机A上执行:

解释:9527表示在主机A中开启9527端口;

192.168.161.130:23表示目标服务器的地址;23表示telnet使用个端口号;

192.168.161.128表示企业内部ssh服务器地址

-N 表示不打开远程shell,处于等待状态

-f 后台启用

————————————————第一步隧道建立完毕————————————————

ss -nt (查看ssh服务器主机B端口连接状态)

[root@localhost ~]# ss -nt

State Recv-Q Send-Q Local Address:Port Peer Address:Port

ESTAB 0 0 192.168.161.129:50478(ssh客户端) 192.168.161.128:22(ssh服务器)

第二步:在主机A中查看连接端口

[root@localhost ~]# ss -ntl	(看看9527端口是否已经连接)
LISTEN      0      128               127.0.0.1:9527                     *:*     
LISTEN      0      128                     ::1:9527                    :::* 

###表示连接正常###

第三步:在主机A上使用telnet 连接 telnet服务器C

[root@localhost ~]# telnet 127.0.0.1 9527
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
centos7-4 login: zxb
Password: 
Last login: Fri Oct  5 15:20:04 from 192.168.161.130
[zxb@centos7-4 ~]$ 

当我们连接127.0.0.1 9527端口时;实际上是通过隧道连接SSH主机B,主机B把收到请求后去连接telnet服务器C了

第四步:退出隧道:killall ssh

当我们在主机C上查看端口号的的时候,其实会看到实际上只有B主机在和C主机连接:

[root@centos7-4 ssh]# ss -nt
State      Recv-Q Send-Q     Local Address:Port                    Peer Address:Port              
ESTAB      0      96       192.168.161.130:22                     192.168.161.1:59462              
[root@centos7-4 ssh]# ss -nt
State      Recv-Q Send-Q     Local Address:Port                    Peer Address:Port              
ESTAB      0      96       192.168.161.130:22                     192.168.161.1:59462              
ESTAB      0      0         ::ffff:192.168.161.130:23                    ::ffff:192.168.161.129:6012

ssh端口转发:反向端口转发(又称远程端口转发)

远程转发:

-R sshserverport:remotehost:remotehostport sshserver

示例:

ssh –R 9527:telnetsrv:23 –N sshsrv

让sshsrv侦听9527端口的访问,如有访问,就加密后通过ssh服务转发请求到本机ssh客户端, 再由本机解密后转发到telnetsrv:23

Data <--->sshsrv:9527 <----->sshsrv:22 <----->localhost:XXXXX <---->

localhost:YYYYY <----> telnetsrv:23

例子:

互联网中主机 A 通过telnet服务实现远程————连接企业内telnet服务器 B

虚拟机环境:

centos6主机A (A 充当互联网中的 ssh服务器 ) IP地址:192.168.161.128

centos6主机B (B主机充当企业内部 client 使用ssh隧道连接到互联网中的 主机A )

centos7主机C (C充当企业内部局域网中telnet服务器和企业内部防火墙)IP地址:192.168.161.130

拓扑图参考,IP地址按照以下真实例子修改

第一步:在主机B上执行:

[root@centos6-10 ~ 09:49:36]#ssh -R 9527:192.168.161.130:23 -N 192.168.161.128 -f
[email protected]'s password: 

用来建立主机A-C的telnet隧道功能;

第二步:检测主机B中连接端口

[root@centos6-10 ~ 09:53:23]#ss -nt
ESTAB      0      0     192.168.161.129:41718     192.168.161.128:22 

第三步:用主机A    telnet服务器主机C

[root@localhost ~]# telnet 127.0.0.1 9527
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
centos7-4 login: zxb
Password: 
Last login: Sat Oct  6 13:45:36 from ::ffff:192.168.161.129
[zxb@centos7-4 ~]$ 

************************************反向端口转发完成************************************

使用ssh隧道功能实现跨互联网端口转发:

环境:4台centso主机

实现主机A可以访问主机D

主机A地址:192.168.161.128

主机B地址:192.168.161.129

主机C地址:192.168.161.130

主机D地址:192.168.161.131

假设AB主机在一个网段中,CD主机中一个网段中

BC中间是互联网连接。

A           B-----------C           D

主机A为客户端 想通过telnet连接 主机D

主机D为smtp server

第一步:

因为centos 主机中默认的smtp邮件协议默认的发送模式为仅主机模式;也就是说它只能做到自己给自己发送邮件;我们首先解决虚拟机中smtp 邮件协议不能跨主机发送邮件的文件的问题

ss -ntl (可以查看到25端口是监听在自己的IP地址上的)

LISTEN 0 100 127.0.0.1:25

1、修改主机D中邮件服务监听端口:

[root@centos7-5 ~]# vim /etc/postfix/main.cf

inet_interfaces = localhost           (localhost表示仅主机)
inet_interfaces = all 开启这行
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
#inet_interfaces = localhost    注释掉这行

2、systemctl restart postfix (重启postfix服务)

第二步:

在目标主机D中添加防火墙策略;充当互联网中的防火墙,让主机AB不能直接使用telnet服务访问主机D

[root@centos7-5 ~]# iptables -A INPUT -s 192.168.161.128 -j REJECT
[root@centos7-5 ~]# iptables -A INPUT -s 192.168.161.129 -j REJECT

第三步:在B和C主机之间建立ssh隧道

[root@centos6-10 ~ 10:17:04]#ssh -L 9527:192.168.161.131:25 -Nfg 192.168.161.130

第四步:在主机A中使用telnet连接目标主机 D

[root@localhost ~]# telnet 192.168.161.129 9527

*****************************************完成连接*********************************************

动态端口转发 (实现google 翻墙上网功能访问国外网站)

动态端口转发:

当用firefox访问internet时,本机的1080端口做为代理服务器, firefox的访问

请求被转发到sshserver上,由sshserver替之访问internet

ssh -D 1080 root@sshserver

在本机firefox设置代理socket proxy:127.0.0.1:1080

curl --socks5 127.0.0.1:1080 http://www.qq.com

虚拟机环境:3台Linux主机

A:192.168.161.128  (充当国外google网站)

B:192.168.161.129  (充当国外一个跳板机搭建C-A的桥梁)

C:192.168.161.130  (充当国内客户机访问主机A)

第一步:

[root@localhost ~]# echo www.google.com >/var/www/html/index.html

###在主机A上建立一个模拟网站##

第二步:在主机C中测试访问主机A的google测试界面

1、vim /etc/hosts 临时DNS解析配置

192.168.161.128 www.google.com

2、firefox www.google.com 测试连接谷歌界面

命令行访问网页界面:

[root@localhost ~]# curl 192.168.161.128:80

www.google.com

第三步:在主机A 上模式国外防火墙杜绝国内主机访问google网站

[root@localhost html]# iptables -A INPUT -s 192.168.161.130 -j REJECT

第四步:建立主机B---C中间的ssh隧道

[root@localhost ~]# ssh -D 9527 192.168.161.129 -fN

第五步:设置浏览器中的代理服务器

*************************************完成****************************************

猜你喜欢

转载自blog.csdn.net/weixin_42741132/article/details/82947192
今日推荐