SSH端口转发

Posted fuqu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSH端口转发相关的知识,希望对你有一定的参考价值。

在这之前要检查下端口转发功能是否已开启,必须要配置/etc/ssh/sshd_config,文件中允许端口转发,重启ssh

AllowTcpForwarding yes

一、本地端口转发

场景如下:

技术分享图片

ssh client与ssh server的概念

  • ssh client(启动一个端口等待连接的一方)
  • ssh server(使用ssh client通过隧道发送过来的数据就进行转发的一方)

对于本地端口转发来说,ssh client与ssh server分别如下:

技术分享图片

需求是想从客户端直接传送东西至内部服务器,在采集机上配置端口转发,采集机为ssh client,堡垒机为ssh server

命令格式为:ssh –g -L <local port>:<remote host>:<remote port> <SSH Server>

ssh client上执行命令,即在采集上(172.16.13.16)执行如下命令

ssh -g –L 1234:192.168.3.16:22 [email protected]

这时候采集机上就启动了1234端口,作为ssh client接收数据,然后把数据通过ssh协议传输到ssh server,sshserver再转发数据到内部服务器的22端口

这时候连接采集机(172.16.13.16)的1234端口,就相当于连接了192.168.3.16的22端口,如下为以上两个参数的解释

-L 本地端口
-g 允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接

二、远程端口转发

本地端口转发和远程端口转发是在本地启动一个端口监听等待连接还是远程启动端口监听等待连接的区别

命令格式为:ssh -R <local port>:<remote host>:<remote port> <SSH Client>

注:还是以上场景,只不过执行命令的机器为ssh server,本地端口转发执行命令的机器为ssh client

ssh server上执行命令,即在堡垒机(172。16.12.150)执行如下命令 

ssh –g -R 1234:192.168.3.16:22 [email protected]

这时候采集机上就启动了1234端口,作为ssh client接收数据,然后把数据通过ssh协议传输到ssh server,sshserver再转发数据到内部服务器的22端口

三、动态端口转发

上面的本地端口转发和远程端口转发都要求有一个固定的远程主机和端口,那如果没有这个主机和端口号呢?这就需要用到我们的动态端口转发来实现

ssh -D <local port> <SSH Server>

-D port
指定一个本地机器 “动态的’’ 应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去。 目前支持 SOCKS4 协议, 将充当 SOCKS4 服务器. 只有 root 才能转发特权端口. 可以在配置文件中指定动态端口的转发.

模拟一个场景:

A机器可以访问B机器的ssh端口
B机器可以访问C机器
A机器完全不通C机器

如下图:

 

技术分享图片

需求:从A机器使用浏览器直接访问C机器的任意应用

1、模拟A机器完全访问不到C机器

在C机器的iptables做策略,完全禁止A机器的访问,加入如下策略

-A INPUT -s 192.168.2.150 -j REJECT

重启C机器的iptables使其生效

在A机器执行如下命令测试:

curl http://192.168.2.241:8080

如下图:策略生效

技术分享图片

2、在A机器执行如下命令

ssh -D 1234 [email protected]

查看A机器上,已经启动了1234端口进行监听

技术分享图片

3、在A机器访问C机器上的应用

A机器命令终端可以如下命令测试:

curl --socks5 127.0.0.1:1234 http://192.168.2.241:8080

如果能够返回数据,代表从A机器直接访问C机器成功

原理:当用A机器访问C机器上的应用时,本机的1234端口做为代理服务器(ssh client),访问请求被转发到B机器(sshserver)上,由sshserver替之访问C机器上的应用

可在C机器使用tcpdump抓包来判断源IP是否为B机器

tcpdump port 8080

在A机器使用curl命令后,抓取包如下,源IP地址为B机器

[[email protected] sysconfig]# tcpdump port 8080
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes

22:45:36.720471 IP 192.168.2.151.47741 > TAPP01.webcache: Flags [S], seq 2062243485, win 14600, options [mss 1460,sackOK,TS val 434850441 ecr 0,nop,wscale 7], length 0
22:45:36.720512 IP TAPP01.webcache > 192.168.2.151.47741: Flags [S.], seq 727239428, ack 2062243486, win 5792, options [mss 1460,sackOK,TS val 394379199 ecr 434850441,nop,wscale 7], length 0
22:45:36.720997 IP 192.168.2.151.47741 > TAPP01.webcache: Flags [.], ack 1, win 115, options [nop,nop,TS val 434850443 ecr 394379199], length 0

省略………………….

A机器与B机器的通讯通过ssh协议,可在B机器抓包分析A机器过来的包的情况

tcpdump src 192.168.2.150

在A机器使用curl命令后,抓取包如下,可知A机器与B机器是通过ssh协议通讯

[[email protected] ~]# tcpdump src 192.168.2.150
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

22:53:43.622494 IP 192.168.2.150.59514 > 192.168.2.151.ssh: Flags [P.], seq 2688161549:2688161649, ack 2351494896, win 290, options [nop,nop,TS val 5330431 ecr 435312270], length 100
22:53:43.624297 IP 192.168.2.150.59514 > 192.168.2.151.ssh: Flags [P.], seq 100:312, ack 53, win 290, options [nop,nop,TS val 5330433 ecr 435372705], length 212

以上,同时也可分析出A机器通过socket端口1234接收到数据后,启动另外一个端口与B机器进行ssh连接,B机器收到A机器的访问请求,再启动一个端口访问C机器的web服务

 

四、其他

上面的本地端口转发,执行命令的时候要求登录ssh server,登录成功后,本地会启动一个端口进行监听,此时,如果登录ssh server的终端断开,监听的端口也会关闭

现在场景要开放一个端口,保持长时间的连接,同时作为ssh client和 ssh server,把数据转发到远端机器,如下命令

ssh -C -f -N -g [email protected] -L 8080:163.163.163.163:143

参数释义:

-f 后台认证用户/密码,通常和-N连用,不用登录到远程主机

-N 不执行脚本或命令,通常与-f连用

-C Enable compression,压缩数据传输。












以上是关于SSH端口转发的主要内容,如果未能解决你的问题,请参考以下文章

ssh的代理和端口转发机制介绍

SSH进行端口转发

SSH 内网端口转发实战

SSH -R 远程端口转发

SSH端口转发

ssh服务端口转发详解