SSH端口转发
SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是, SSH还能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”( tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如, Telnet, SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时, 如果工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,也能够通过将 TCP 端口转发来使用 SSH 进行通讯。
SSH 端口转发能够提供两大功能:
转发方法分为两种类型:
1、本地转发:
选项:
示例
当访问本机的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
第五步:设置浏览器中的代理服务器
*************************************完成****************************************