参考了:https://baijiahao.baidu.com/s?id=1716487922632955537&wfr=spider&for=pc

由于经常用到,找的麻烦,碰巧看到这篇文档写的很好,就简化收录一下。

SSH隧道,功能强大,利用SSH进行数据传输时也是较为可靠和安全的。

用到的SSH参数说明

-L port:host:hostport

本地转发:将本地的某个端口转发到远端指定主机的指定端口。本地机器上分配一个 socket 侦听 端口, 发到这个端口上的连接请求会被转发到远程主机 host 的 hostport 端口上, 可以在配置文件中指定端口的转发, 只有 root 才能转发特权端口。

-R port:host:hostport

远程转发:将远程主机的某个端口转发到本地端指定主机的指定端口。远程主机上分配了一个 socket 侦听端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发,只有用 root 登录远程主机 才能转发特权端口。

-D port

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

-N

不执行远程命令. 用于转发端口

-f

要求 ssh 在执行命令前退至后台. 它用于当 ssh 准备询问口令或密语, 但是用户希望它在后台进行. 该选项隐含了 -n 选项. 在远端机器上启动 X11 程序的推荐手法就是类似于 ssh -f host xterm 的命令

-g

允许远端主机连接本地转发的端口

本地转发

本地转发即在A服务器执行ssh命令登录B服务器来启用SSH隧道,以实现通过访问A服务器的转发端口,达到实际访问为B服务器的目标端口的目的。

第一种场景

第二种场景

使用场景

当客户端可以访问主机A的任意端口,但由于网络或安全的原因客户端无法访问到主机B的任意端口。如果现在客户端想要访问主机B的某个服务时(如mysql数据库),此时只要主机A可以访问到主机B的SSH端口,这里就可以使用SSH隧道,实现客户端访问主机A的转发端口即可访问到主机B的mysql数据库。

命令示例

以下命令均在A主机执行:

SSH登录后启用ssh隧道,但仅监听A主机127.0.0.1地址,退出ssh登录后隧道断开

ssh -L A转发port:B主机IP:B目的端口 root@B主机

第一种场景

ssh -L 21306:192.168.2.22:3306 root@192.168.2.22

第二种场景,连接192.168.1.11的隧道端口,192.168.2.22再转发到192.168.2.23

ssh -L 21306:192.168.2.23:3306 root@192.168.2.22

SSH命令后不登录B主机,仅启用ssh隧道,仅监听A主机127.0.0.1地址,关闭A主机终端后隧道断开

ssh -N -L A转发port:B主机IP:B目的端口 root@B主机

第一种场景

ssh -N -L 21306:192.168.2.22:3306 root@192.168.2.22

第二种场景,连接192.168.1.11的隧道端口,192.168.2.22再转发到192.168.2.23

ssh -N -L 21306:192.168.2.23:3306 root@192.168.2.22

SSH命令后不登录B主机,仅启用ssh隧道,仅监听A主机 0.0.0.0 地址,关闭A主机终端后隧道不会断开

ssh -f -N -L A转发port:B主机IP:B目的端口 root@B主机

第一种场景

ssh -f -N -L 0.0.0.0:21306:192.168.2.22:3306 root@192.168.2.22

第二种场景,连接192.168.1.11的隧道端口,192.168.2.22再转发到192.168.2.23

ssh -f -N -L 0.0.0.0:21306:192.168.2.23:3306 root@192.168.2.22

将转发端口绑定至A主机所有网卡

效果同上

ssh -g -f -N -L A转发port:B主机:B目的端口 root@B主机

ssh -g -f -N -L 21306:192.168.2.23:3306 root@192.168.2.22

--------------------------

远程转发

功能解释

上面我们知道了本地转发是在A服务器执行ssh命令后将转发端口设置在A服务器本身,远程转发则相反,是将转发端口设置在ssh命令的目标服务器上。

远程转发即在B服务器执行ssh命令登录A服务器来启用SSH隧道,以实现通过访问A服务器的转发端口,达到实际访问为B服务器的目标端口的目的。如下图所示:

第一种场景

第二种场景

使用场景

远程转发使用场景较为广泛且实用。

如果我们在家庭电脑上跑了一个tomcat服务并想提供到互联网访问,由于家庭电脑一般是通过路由器来访问互联网的(即在nat网络中),我们需要在家庭路由器中进行端口映射来实现。

如果我们是公共路由器没有权限怎么办?又或者在权限管控严格的公司中我们没有权限怎么办?

巧合的是,我们手上还有一台拥有公网IP的主机(如阿里云主机等),我们的家庭电脑是可以访问到互联网的(即可以SSH访问到拥有公网IP的主机),直接使用SSH隧道就可以解决以上问题。

命令示例

以下命令均在B主机执行:

SSH命令后不登录A主机,仅启用ssh隧道,仅监听A主机127.0.0.1地址,关闭B主机终端后隧道不会断开

ssh -f -N -R A主机转发端口:B主机IP:B目的端口 root@A主机

看到这里,你一定会联想到以下两条指令来实现绑定到非lookback地址:

ssh -f -N -R A主机IP:A主机转发端口:B主机IP:B目的端口 root@A主机

ssh -g -f -N -R A主机转发端口:B主机IP:B目的端口 root@A主机

不过当你实验时敲下以下指令,会发现A主机的SSH隧道监听地址仍然是127.0.0.1,这又是为什么呢?

将远程转发绑定到网卡

上一小节我们尝试建立远程转发隧道后,仅监听127.0.0.1地址,这是因为在SSH服务的配置文件/etc/ssh/sshd_config中有这样一个配置

GatewayPorts 是否允许远程主机连接本地的转发端口,默认值为 no。

将此项配置为yes并重启SSH服务后,再次执行命令

ssh -f -N -R A主机转发端口:B主机IP:B目的端口 root@A主机

这时远程转发的转发端口会设置在A主机的所有网卡上,即0.0.0.0

当然除了这种方法,我们还可以使用其他技术手段来实现允许其他主机访问A主机127.0.0.1地址的转发端口,例如在A主机用其他程序去反向代理127.0.0.1的转发端口,使用Nginx反代实现方式和配置可以点开我的主页,查看《Nginx实现socket代理》这篇文章。

动态转发

功能解释

动态转发即通过配置一个本地端口,将通过隧道的数据转发到目标端地址网络。

如上图所示,动态转发不像本地转发与远程转发一样转发端口与目标端口是一对一的,动态转发中的转发端口对应的目标是目标主机所在的整个网络。不过使用动态转发访问目标主机所在网络时需要应用程序本身支持代理配置或者使用socket代理工具。

使用场景

同样如上图所示,如果存在一个子网1与子网2之间设有防火墙,主机A只能访问到主机B的ssh端口,这时如果主机A或者外部客户端想要访问子网2中的任意IP的任意端口时,可以使用动态转发隧道实现。

命令示例

以下命令均在A主机执行:

SSH命令后不登录B主机,仅启用ssh隧道,仅监听A主机127.0.0.1地址,关闭A主机终端后隧道不会断开

ssh -f -N -D A主机转发端口 root@A主机

SSH命令后不登录B主机,仅启用ssh隧道,监听A主机指定网卡IP地址,关闭A主机终端后隧道不会断开

ssh -f -N -D A主机IP地址:A主机转发端口 root@A主机

客户端代理配置

当隧道创建好之后我们需要通过代理客户端进行设置之后才会使用隧道,如果应用程序支持配置直接配置即可,如果是不支持配置代理的应用程序可以使用到socket代理工具来搭配使用,我常用的客户端代理工具是Proxifier,关于用法可以参考我主页的另一篇文章《Socket代理神器客户端Proxifier+服务端ss5》。

=======================================

AutoSSH

在实际的使用过程中,如果使用远程转发穿透到内网,ssh隧道将会非常不稳定,隧道会莫名其妙的消失或者失效,特别是在没有固定IP的网络内,本章节讲解使用AutoSSH进行稳定的远程转发。

下载安装

解压

tar zxvf autossh-1.4g.tgz

编译安装

cd autossh-1.4g

./configure

make

编译完成后当前目录下会生成autossh这个文件。

参数解释

AuthSSH只有三个自己的参数:

-M <port>[:echo_port] 指定要使用的基本监控端口,或者指定要使用的监控端口和回显服务端口。

-f 使 autossh 在运行 ssh 之前进入后台。注意在autossh中使用到此参数将不会提示输入密码,所以使用此参数需要先配置好公钥登录。

-V 查看版本号。

配置公钥登录

使用autossh进行远程转发

在B主机执行命令

AutoSSH命令后不登录A主机,关闭B主机终端后隧道不会断开

autossh -M 10000 -f -N -R A主机转发端口:B主机IP:B目的端口 root@A主机

验证稳定性

使用autossh命令后,autossh会打开另一个ssh进程创建隧道,我们尝试kill14837进程后,再次ps查看进程时发现autossh立即又打开了另一个ssh进程创建了隧道,并且测试隧道使用正常。

SSH隧道本地转发远程转发相关推荐

  1. 红蓝对抗之隧道技术第二篇(reGeorg内网穿透、SSH隧道本地Socks代理、SSH远程转发、Earthworm Socks5代理、Tunna正向代理、ICMP隧道、DNS隧道、Frp穿透)

    文章目录 隧道应用 reGeorg内网穿透 SSH本地转发(正向) 场景一 场景二 SSH远程转发(反向) Earthworm Socks5代理 正向代理 反向代理 Tunna正向代理 ICMP隧道 ...

  2. linux启动本地远程服务,如何使用SSH在本地控制远程服务器执行命令

    通过SSH在本地控制远程服务器执行命令,如果每次都要登录到远程服务器真的好麻烦,起始通过SSH就可以远程执行 在本地使用 ssh $RemoteNode    可以在执行远程机器上的命令,例如 ssh ...

  3. ssh 隧道 mysql_利用SSH隧道方式连接远程MySQL服务器

    1.简介: 大多数人知道SSH是用来替代R命令集,用于加密的远程登录,文件传输,甚至加密的FTP(SSH2内置),因此SSH成为使用极广的服务之一,不仅如 此,SSH还有另一项非常有用的功能,就是它的 ...

  4. laravel 使用SSH 隧道连接到远程数据库

    1.首先启动SSH隧道 #这里假设你的远程服务器地址是1.2.3.4,数据库安装在服务器本地,端口是3306 ssh -i ./path/to/id_rsa \-N -L 13306:127.0.0. ...

  5. ssh隧道远程mysql_利用SSH隧道方式连接远程MySQL服务器

    1.简介: 大多数人知道SSH是用来替代R命令集,用于加密的远程登录,文件传输,甚至加密的FTP(SSH2内置),因此SSH成为使用极广的服务之一,不仅如 此,SSH还有另一项非常有用的功能,就是它的 ...

  6. ssh 隧道 mysql_利用SSH隧道方式连接远程MySQL

    1.简介: 大多数人知道SSH是用来替代R命令集,用于加密的远程登录,文件传输,甚至加密的FTP(SSH2内置),因此SSH成为使用极广的服务之一,不仅如此,SSH还有另一项非常有用的功能,就是它的端 ...

  7. 细说SSH隧道——本地端口转发

    目录 前言 本地端口转发 举例1:服务器与SSH远程主机是分开的 命令 网络拓扑 环境配置 开始连接(-L连接) 登录用户 流量分析 办公网(VM1网卡): 外网(NAT-VM8网卡) 家庭电脑抓包( ...

  8. ssh远程端口转发到本地_Linux SSH隧道或端口转发本地和远程端口的示例?

    ssh远程端口转发到本地 Ssh protocol secures remote connections which are shell or terminal-based to the remote ...

  9. SSH端口转发(ssh隧道)

    在打DarkHole2靶机的时候,使用到了ssh端口转发,在网上搜集了很多资料,特此记录下来,以便后续查找 ssh端口转发 SSH 隧道 本地端口转发 远程端口转发 动态端口转发 当我们需要访问一台主 ...

最新文章

  1. python字符集_PYTHON 中的字符集
  2. 让你的man手册显示与众不同
  3. java运行环境(JRE)
  4. 数据结构中的各种排序---总结篇
  5. Cracked me --1--Acid_burn
  6. 嵌入式linux 时间同步,解决嵌入式Linux中的时区问题
  7. 浅谈 Windows API 编程
  8. 求求你,别再用wait和notify了!
  9. CentOS 7 常用命令集合
  10. android studio android 测试
  11. python字符串用空格切片_Python切片操作去除字符串首尾的空格
  12. iOS开发音频格式转换
  13. android 谷歌室内定位,打造室内导航 谷歌发布WifiRttScan App测试室内定位
  14. excel单元格内容拆分_EXCEL拆分单元格中的姓名,这都不叫事儿
  15. 中兴zxr10路由器重启命令_ZXR10路由器基本操作和配置.doc
  16. 关于手机信号强度单位db和dBm
  17. 点清铸造厂车间除臭剂处理废气和废水恶臭
  18. 广西免考职称英语计算机,广西职称英语免考条件及免试人群
  19. 【移动机器人技术】move_base中障碍物无法清除的解决办法
  20. 编码问题(Java的IO流为什么会有字节流和字符流)

热门文章

  1. 如何把图片转换成一个PDF格式文件
  2. 哪些行业适用到分账系统?
  3. “中兴坠楼”事件冷思考:AI带来的失业潮,我们该何去何从?
  4. web开发中如何使用引用字体
  5. 中投民生:今日A股大面积飘绿;注册制独领风骚
  6. MFC Windows 程序设计[233]之CPP十六进制编辑器(附源码)
  7. 在线打印资料的软件叫什么名字来着
  8. oracle树结构查询语句
  9. 安装 Adobe 软件报错,代码501
  10. 前端学习记录——offset与client