SSH -R 远程端口转发

Posted

tags:

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

参考技术A 下次不要找借口说内网机器没法 SSH 远程登陆,我们要不要 QQ 远程之类的 ...

注意下文将用 A, B, C 指代它们,在命令里面也用 A, B, C 代表他们的域名。

一般情况下 A 和 C 分别处于两个不相干的内网,B 是一台可以公共访问的 VPS.

利用 B 的转发,让 C 访问 A 的 8888 端口

ssh -vNR 8889:127.0.0.1:8888 -p 22 user@B

可能是由于 SSH 服务端没有设置 GatewayPorts yes ,这种情况下映射端口仅绑定在 127.0.0.1 上,无法通过外网访问。请查看一下配置文件 /etc/ssh/sshd_config ,具体修改方式请自行了解。

❤ 其实用这个方法,可不仅仅是能让 C 访问 A 那么简单。
任何 A 能直接访问的内网服务,都可以通过这种方法分享给 B,比如 A 所在内网有个 Redis 服务 D:6379 ,想要让 C 访问,C 并不需要知道知道 D 的存在。

仍然是在主机 A 上操作,执行如下命令:

▲请仔细观察与上一个命令的不同之处▲

然后就可以在 C 访问 Redis 服务了:

SSH 内网端口转发实战

原文连接

SSH 内网端口转发实战:主要是把这篇文章的内容整理成自己能理解的内容,方便使用

先给出本文主角,两条SSH命令:

远程端口转发(由远程服务器某个端口转发到本地内网服务器端口)

ssh -CfNg -R(命令行的关键) 2222(远程服务器端口):127.0.0.1:22(本地端口) 123.45.67.8(远程服务器)

本地端口转发(由本地内网服务器某个端口转发到远程服务器端口)

ssh -CfNg -L(命令行的关键) 2222(远程服务器端口):0.0.0.0:4444(本地端口) 123.45.67.8(远程服务器)

命令行选项解释:

-C:压缩数据传输。

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

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

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

-L 本地端口:目标IP:目标端口

-T 不分配 TTY 只做代理用

-q 安静模式,不输出 错误/警告 信息

建立连接

目标:

  1. 内网机器IntranetA》公网机器PubNet》内网机器IntranetB
  2. IntranetA与IntranetB在不同的网络中,现在想实现互通,那么我们就需要一个中间人PubNet

建立PubNet到IntranetB的隧道:

  • IntranetB上执行:ssh -CfNg -R 2222:127.0.0.1:22 123.45.67.8
    • 用途:由远程服务器某个端口转发到本地内网服务器端口,-R是关键。
    • 建立的隧道中,远端PubNet的2222端口的数据将被转发到本地IntranetB的22端口上。

在PubNet上可以通过ssh访问到内网IntranetB:ssh -p 2222 localhost

至此:我们已经可以在公网上操作内网IntranetB了,但是IntranetA还访问不到IntranetB。

建立IntranetA到公网PubNet的隧道

  • 在IntranetA上执行:ssh -CfNg -L 2222:0.0.0.0:4444 123.45.67.8
    • 用途:由本地内网服务器某个端口转发到远程服务器端口。
    • 建立的隧道中,本地IntranetA的4444端口上的数据将被转发到远端PubNet的2222端口上。

至此:

IntranetA通过端口4444发送数据到PubNet的2222端口,PubNet的2222端口接收到数据后,会将数据转发到IntranetB的22端口。两个完全互相不认识的机器IntranetA、IntranetB通过共同的朋友PubNet,建立了一个单工的通道。

如果IntranetB想远程连接IntranetA,采用同样的办法炮制

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

SSH 内网端口转发实战

利用SSH端口转发实现远程访问内网主机远程桌面 建立SSH转发

安全牛学习笔记SSH远程端口转发和动态端口转发以及X协议转发

[转帖]SSH原理与运用:远程操作与端口转发

SSH原理与运用:远程操作与端口转发

ssh 执行远程命令和端口转发