本地转发和远程转发
本地转发相当于就是访问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
?
1
muzuiget 2022-02-03 23:11:18 +08:00 1
假设你的机器叫 A ,你的服务器叫 S ,你的朋友机器叫 B 。
ssh -L 帮助 A 通过 S 访问 B 。 ssh -R 帮助 B 通过 S 访问 A 。 ssh -D 动态版的 ssh -L |
2
Kinnice 2022-02-03 23:14:20 +08:00 via Android
看迷糊了?
手动操作一下,一次就明白了 |
3
jfdnet 2022-02-03 23:25:45 +08:00
拿第一条命令解释一下,应用场景基本上是:
LOCAL 和 DESTINATION 无法互相连通,但是它们都能连接 SSH_SERVER 这个命令就是通过 SSH_SERVER 做为隧道,把 LOCAL 的指定端口跟 DESTINATION 的指定端口绑定起来。 |
4
zxCoder OP |
5
sfqtsh 2022-02-04 02:18:26 +08:00 via Android
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 |
6
sfqtsh 2022-02-04 02:19:09 +08:00 via Android
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 |
7
sfqtsh 2022-02-04 02:24:32 +08:00 via Android
这里讲的 [监听] 端口你可以用 netstat 命令 分别到 ssh client 机器 和 ssh server 机器上测试和查看。监听地址可以是 127.0.0.1 或 0.0.0.0 或某个网卡的固定地址,默认 localhost ,这也是[LOCAL_IP:]和[REMOTE_IP:]可以省略的原因。
|
8
seanzxx 2022-02-04 04:27:03 +08:00
简单的说,L 和 R 的相对的功能,
L: 访问 localhost 转发访问 remote R: 访问 remote 转发访问 localhost |
9
Volekingsg 2022-02-04 10:15:42 +08:00
|
10
iqfEmhuNidBhDfWo 2022-04-05 21:00:19 +08:00
你只要区分“入口”和“落点”就行了,不要看啥“remote”和“local”,那只会越看越昏头。
PS:贵站敏感词太他妈多了,写了一堆发不出来。。。 |
11
iqfEmhuNidBhDfWo 2022-04-05 21:01:33 +08:00
@ukss 转发规则的前 2 域是入口,后 2 域是落点,记住这一点你再也不会晕。
|
12
lthon 2023-05-10 12:11:45 +08:00
说一下自己的理解,并回答 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 ,有非常漂亮的图解 |
13
lthon 2023-05-10 12:20:46 +08:00
本地转发,流量:本地主机 -> 远程主机 -> 目的主机;
远程转发,流量:远程主机 -> 本地主机 -> 目的主机; |