SSH 端口转发给我看迷糊了

2022-02-03 22:58:22 +08:00
 zxCoder

本地转发和远程转发

本地转发相当于就是访问LOCAL_IP:LOCAL_PORT就变成访问DESTINATION:DESTINATION_PORT

ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER

远程转发相当于访问REMOTE:REMOTE_PORT就变成访问DESTINATION:DESTINATION_PORT

ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER

这样理解对吗?

有点不太理解是远程转发的REMOTE指的是哪个?是 ssh client 所在机器吗?

然后本地转发的时候,SSH_SERVER也可以就是DESTINATION,而远程转发的时候,REMOTE也可以就是DESTINATION

1794 次点击
所在节点    SSH
13 条回复
muzuiget
2022-02-03 23:11:18 +08:00
假设你的机器叫 A ,你的服务器叫 S ,你的朋友机器叫 B 。

ssh -L 帮助 A 通过 S 访问 B 。
ssh -R 帮助 B 通过 S 访问 A 。
ssh -D 动态版的 ssh -L
Kinnice
2022-02-03 23:14:20 +08:00
看迷糊了?
手动操作一下,一次就明白了
jfdnet
2022-02-03 23:25:45 +08:00
拿第一条命令解释一下,应用场景基本上是:
LOCAL 和 DESTINATION 无法互相连通,但是它们都能连接 SSH_SERVER
这个命令就是通过 SSH_SERVER 做为隧道,把 LOCAL 的指定端口跟 DESTINATION 的指定端口绑定起来。
zxCoder
2022-02-03 23:35:27 +08:00
@muzuiget

请问 ssh 远程转发,命令也是在 A 机器执行的吗?
然后 ssh -R 中的 REMOTE 是 B 机器 ip ,DEST 是 A 机器 ip 吗?
sfqtsh
2022-02-04 02:18:26 +08:00
ssh -L 是让你的 ssh client 进程额外 [监听] LOCAL_PORT 端口。访问 ssh client 所在机器的 LOCAL_PORT 端口的请求数据将由 ssh client 进程流转给 SSH_SERVER 上对应的 sshd 进程,
sshd 进程再转给指定的 DESTINATION:DESTINATION_PORT 。
------ 适用场景为:ssh client 所处网络环境无法直连到 DESTINATION ,但其能 ssh 通的 SSH_SERVER 能访问到 DESTINATION
sfqtsh
2022-02-04 02:19:09 +08:00
ssh -R 是让连上的 SSH_SERVER 上对应的 sshd 进程进程额外 [监听] REMOTE_PORT 端口。访问 SSH_SERVER 机器的 REMOTE_PORT 端口的请求数据将由 sshd 进程流转给 ssh client 进程,
ssh client 进程再转给指定的 DESTINATION:DESTINATION_PORT 。
------ 适用场景为:SSH_SERVER 所处网络环境无法直连到 DESTINATION ,但已被 ssh 通的 ssh client 能访问到 DESTINATION
sfqtsh
2022-02-04 02:24:32 +08:00
这里讲的 [监听] 端口你可以用 netstat 命令 分别到 ssh client 机器 和 ssh server 机器上测试和查看。监听地址可以是 127.0.0.1 或 0.0.0.0 或某个网卡的固定地址,默认 localhost ,这也是[LOCAL_IP:]和[REMOTE_IP:]可以省略的原因。
seanzxx
2022-02-04 04:27:03 +08:00
简单的说,L 和 R 的相对的功能,
L: 访问 localhost 转发访问 remote
R: 访问 remote 转发访问 localhost
Volekingsg
2022-02-04 10:15:42 +08:00
iqfEmhuNidBhDfWo
2022-04-05 21:00:19 +08:00
你只要区分“入口”和“落点”就行了,不要看啥“remote”和“local”,那只会越看越昏头。

PS:贵站敏感词太他妈多了,写了一堆发不出来。。。
iqfEmhuNidBhDfWo
2022-04-05 21:01:33 +08:00
@ukss 转发规则的前 2 域是入口,后 2 域是落点,记住这一点你再也不会晕。
lthon
356 天前
说一下自己的理解,并回答 OP 的两个问题。

在讨论转发 /代理类似主题时,需要先理清参与角色。这里有三个角色:
1. 本地主机,执行 ssh -L / -R ;
2. 远程主机,ssh 命令连接到的主机;
3. 目的主机,要转发到的主机;

第一个问题,远程转发的 REMOTE 指的是哪个?

贴一下 man 信息(机翻,并删除套接字相关描述):
ssh -R [bind_address:]port:host:hostport [user@]hostname
指定将与远程(服务器)主机上给定的 TCP 端口的连接转发到本地端的给定主机的端口 (host:hostport)。这是通过分配一个在远程一侧监听 TCP 端口 (port) 来实现的。每当有连接到达该端口时,SSH 将通过安全隧道转发该连接,并从本地主机向 host 端口 hostport 发起连接。
默认情况下,服务器上的 TCP 监听端口仅绑定到回环接口。可以通过指定 bind_address 来覆盖此设置。

回到 OP 的命令,
ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER
其中,SSH_SERVER 就是远程主机,[REMOTE:]REMOTE_PORT 就是远程主机监听的端口及其绑定的接口地址,所以 REMOTE = SSH_SERVER = 远程主机。

第二个问题,本地转发的时候,SSH_SERVER 也可以就是 DESTINATION ,而远程转发的时候,REMOTE 也可以就是 DESTINATION ?

本地转发的时候,远程主机充当代理,远程主机可以是目的主机;
远程转发的时候,本地主机充当代理,本地主机可以是目的主机;
这个可以看看 https://unix.stackexchange.com/a/115906 ,有非常漂亮的图解
lthon
356 天前
本地转发,流量:本地主机 -> 远程主机 -> 目的主机;
远程转发,流量:远程主机 -> 本地主机 -> 目的主机;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/831813

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX