SSH 本地、远程隧道

Last-Modified: 2019年6月5日15:45:11

简介

建立ssh隧道常用于, 通过一台公网的主机或者是大家都可以访问的主机做跳转机,来访问内部或者外部不能直接访问的机器.

项目当前用途:

由于服务端上假设架设的redis未设置加密, 因此通过防火墙了屏蔽redis端口(6379), 其他外网机器需要连接到该端口就可以使用ssh隧道建立端口转发绕过防火墙.

参考文章: https://www.cnblogs.com/fbwfb...

个人简单理解:

  • 本地隧道: 访问本地指定端口, 通过"中间机器"转发到"目标机器"的"目标端口", 方向是: 本地 -> 中间 -> 远程
  • 远程隧道: 远程访问"远程端口", 通过本机转发到目标机器的端口, 此时本机是作为代理, 远程 -> 本地 -> 目标

本地SSH隧道

ssh -Nf -L {本地端口}:{目标机器}:{目标端口} {中间机器}
# 或
ssh -Nf -L {本地地址}:{本地端口}:{目标机器}:{目标端口} {中间机器}

# -N    不执行远程指令
# -f    后台执行ssh命令
# -L    local隧道, [bind_address:]port:host:hostport
# -4    强制使用ipv4地址

{本地地址}未配置, 则默认为 127.0.0.1, 即只有本机可以访问该转发端口

  • {目标机器}若填 “127.0.0.1”, 则指的是直接转发到中间机器

    ssh -f -N -L 36901:127.0.0.1:3690 root@xx.xx.xx.xx 即建立ssh隧道, 本地访问36901端口时, 会被转发到 root@xx.xx.xx.xx的3690端口

  • {中间机器} 可指定登陆的用户名 {user@xx.xx.xx.xx}

示例

clipboard.png

目的: A要访问C, 但被B屏蔽

手段: A通过D来间接访问C

# 以下命令都是在 192.168.0.100 上执行

# 从 192.168.0.100 通过 123.123.123.123 访问 234.234.234.234
ssh -N -f -L 2121:234.234.234.234:21 123.123.123.123
ftp localhost:2121 # 现在访问本地2121端口,就能连接234.234.234.234的21端口了
  • -N 告诉SSH客户端,这个连接不需要执行任何命令。仅仅做端口转发
  • -f 告诉SSH客户端在后台运行
  • -L 做本地映射端口,被冒号分割的三个部分含义分别是

    • 需要使用的本地端口号
    • 需要访问的目标机器IP地址(IP: 234.234.234.234)
    • 需要访问的目标机器端口(端口: 21)

最后一个参数是我们用来建立隧道的中间机器的IP地址(IP: 123.123.123.123)

-L X:Y:Z的含义是,将IP为Y的机器的Z端口通过中间服务器映射到本地机器的X端口。

远程SSH隧道

# 
ssh -Nf -R {远程端口}:{本地机器}:{本地端口} {远程机器}
# 或
ssh -Nf -R {远程绑定地址}:{远程端口}:{本地机器}:{本地端口} {远程机器}
  • {本地机器} 不一定是本机, 也可以是局域网内与本机联通的主机, 任何访问{远程机器}:{远程端口}的都会被连接到 {本地机器}:{本地端口}, 执行上述命令的主机本质上是作为中转主机.
  • {远程绑定地址} 若不填写, 则默认是 127.0.0.1, 若要允许其他机器通过 {远程机器}:{远程端口} 来访问该隧道, 则可将该地址配置为 0.0.0.0(即{远程机器}上会监听来自 0.0.0.0:{远程端口} 的tcp连接

{远程机器} 记得将 sshd 的 GatewayPorts 打开

vim /etc/ssh/sshd_config
# GatewayPorts yes
service sshd reload

示例

clipboard.png

利用 A(内网)-B-D 方向的连接 来建立 D-B-A方向的访问

# 在 192.168.0.100 上执行如下命令
ssh -Nf -R 2222:127.0.0.1:22 123.123.123.123

# 在远程 123.123.123.123 机器上执行如下命令即可连接到 A机器(192.168.0.100)的22端口
ssh -p 2222 localhost

-R 参数

  • 远程机器使用的端口(2222)
  • 需要映射的内部机器的IP地址(127.0.0.1)
  • 需要映射的内部机器的端口(22)

FAQ

免密码登陆

配置使用密钥连接

自动重连

隧道可能因为某些原因断开,例如:机器重启,长时间没有数据通信而被路由器切断等等。

可以通过配置 supervisord, 确保链接断开时自动重连, 但配置时应去掉 -f参数(不放在后台执行)

自动重连需配合"免密码登陆"

supervisord配置示例

[program:ssh_tunel_3690]
command=ssh -N -L 36901:127.0.0.1:3690 publisher@123.59.85.161
numprocs=1
autostart=true
autorestart=true
startretries=10
redirect_stderr=true
stdout_logfile=/data/tmp/supervisord/ssh_tunel_3690.log
supervisorctl update

PHPer@厦门

275 声望
21 粉丝
0 条评论
推荐阅读
⭐Redis 备忘录 - 基础
[TOC]文档/链接Redis 中文文档好像只到 3.* 版本Redis 丑但更新的中文文档图片来自: [链接]高性能官方数据: 10W+ QPS数据存储在内存单线程: 避免上下文切换和锁多路I/O复用数据类型及应用场景String 字符串单个 S...

嘉兴ing1阅读 1k

本地Linux通过SSH服务连接登录远程Linux服务器
本机Linux通过SSH服务连接登录远程Linux服务器查看IP:方式1: ifconfig方式2: ip addr登录命令格式: ssh 远程服务器用户名@远程服务器IP命令启动ssh服务: {代码...} 侦听端口(一般为22): netstat -na | grep 22 使...

DEFAULT1阅读 576

minikube master 节点的 docker 用户的密码什么?
先看下 node 的 ip 地址 {代码...} 但是直接登录 docker node 会失败! {代码...} 查了一下,可以不用账号密码,而是密钥对登录 {代码...} 指定公钥地址,就可以了 {代码...} 参考:How do I ssh into the VM for ...

ponponon阅读 1.2k

Windows Terminal + MSYS2 配置
前言本文对 Windows 10/11 适用MSYS2 官网:[链接]MSYS2 官方新闻:2022.10.29,将默认环境由 MINGW64 更换为 UCRT64安装到官方仓库下载 MSYS2 安装包,qbit 当前下载的是 msys2-x86_64-20221028.exe按提示步骤安...

qbit阅读 611

virtualbox linux虚拟机配置ssh服务(方便使用ssh工具连接)
{代码...} 1.安装ssh {代码...} 2.更改配置 {代码...} 3.重启服务 {代码...} 4.端口转发配置 {代码...} {代码...} {代码...} 5.打开ssh工具(例如finalshell) {代码...} 6.附录-ssh配置文件中各个字段含义 {代码...

等风来阅读 529

远程跳板机访问私网主机----流量转发
现在有三台主机:A、B、C, A和B通,B和C通,但是A和C之间不通,比如有防火墙,或者是网段不同等等。但是如果我非要通过A能访问C这个主机呢?这个时候就需要流量转发,通过将A->C的流量,交给B,由B作为跳板机...

SanPiBrother阅读 526

k1s 工具使用教程
.1. k1s 是 kubectl 辅助工具so easy, so fast. {代码...} .2. 什么是 k1sk1s 主要是用于 kubernetes 管理的命令行工具。对 kubectl 命令实现快捷操作。github 源码:[链接] 欢迎点星星。.3. k1s 特色支持 28 种 ...

百里阅读 455

封面图

PHPer@厦门

275 声望
21 粉丝
宣传栏