[TOC]

0x00

概述

SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还同时提供了一个非常有用的功能,这就是端口转发。它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程有时也被叫做“隧道”(tunneling)。这是因为 SSH 为其他 TCP 连接提供了一个安全的通道,避免了用户名,密码以及隐私信息的明文传输。例如,Telnet,SMTP,LDAP 这些 TCP 应用。

某些特殊的网络环境中的防火墙限制访问一些端口,但能进行ssh连接,在这种情况下可以使用ssh将限制访问的tcp进行转发访问。

0x01

本地转发

将服务器的限制访问的端口转发到客户端本地。
1.jpg
当没有服务器ssh登录的权限时,但有其他可以访问被限制的服务器端口的设备的ssh登录权限时,将此台设备作为跳板来访问。
2.jpg

命令规则:

ssh -L [local host:]<local port>:<remote host>:<remote port> <ssh hostname>

实例&解释:

ssh -L 8001(指定本地端口):服务器ip:8000(被限制访问的端口) root@服务器ip

ssh -L 8001(指定本地端口):服务器ip:8000(被限制访问的端口) root@跳板机ip

当ssh登录成功后就已经将服务器端口转发到客户端本地端口了,上面实例客户端访问地址:127.0.0.1:8001

注意

  • 在上面的命令加一个-g可以让其他设备访问客户端

    ssh -L 8000:服务器ip:8000 root@服务器ip
    等价于
    ssh -L 127.0.0.1:8000:服务器ip:8000 root@服务器ip
    ssh -g -L 8000:服务器ip:8000 root@服务器ip
    等价于
    ssh -L 0.0.0.0:8000:服务器ip:8000 root@服务器ip
  • 转发时要一直保持ssh的连接,也就是不能关闭ssh的命令窗口。也可以添加-qTfNn用于告知ssh连接成功后就转到后台运行。

    远程转发(反向代理)

    远程访问就是将本地内网端口的流量通过一台公网设备转发出来
    3.jpg
    命令格式:

    ssh -g -R [ssh server host:]<SSH server port>:<local host>:<local port> <SSH hostname>

    实例:

    ssh -g -R 8000(指定公网设备的端口):内网设备ip:8000(内网设备的端口) root@公网设备ip

    注意

  • 和本地访问一样转发时不能关闭ssh命令窗口。也可以添加-qTfNn用于告知ssh连接成功后就转到后台运行。
  • 转发失败时检查/etc/ssh/sshd_config文件,将AllowTcpForwarding选项设置为yes

    动态转发(Socks代理)

    开启一条Socks隧道。
    前面的本地转发和远程转发都需要指定端口进行转发,而动态转发则不需要指定端口就可以转发(不建议使用这个来fq,因为该方法早已被GFW和谐),可以进行内网访问。
    4.jpg
    命令格式:

    ssh -D <local port> <SSH Server>

    实例:

    ssh -D 8000(本地指定的端口) root@进行转发的服务器ip(跳板)

    ssh执行为后台任务

    ssh -qTfNn用于建立纯端口转发用途的ssh连接,参数具体含义如下:

  • -q: quiet模式,忽视大部分的警告和诊断信息(比如端口转发时的各种连接错误)
  • -T: 禁用tty分配(pseudo-terminal allocation)
  • -f: 登录成功后即转为后台任务执行
  • -N: 不执行远程命令(专门做端口转发)
  • -n: 重定向stdin为/dev/null,用于配合-f后台任务

END

Last modification:October 24, 2019
如果觉得我的文章对你有用,请随意赞赏