V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zxCoder
V2EX  ›  SSH

SSH 端口转发给我看迷糊了

  •  
  •   zxCoder · 2022-02-03 22:58:22 +08:00 · 1775 次点击
    这是一个创建于 805 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本地转发和远程转发

    本地转发相当于就是访问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

    13 条回复    2023-05-10 12:20:46 +08:00
    muzuiget
        1
    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
        2
    Kinnice  
       2022-02-03 23:14:20 +08:00 via Android
    看迷糊了?
    手动操作一下,一次就明白了
    jfdnet
        3
    jfdnet  
       2022-02-03 23:25:45 +08:00
    拿第一条命令解释一下,应用场景基本上是:
    LOCAL 和 DESTINATION 无法互相连通,但是它们都能连接 SSH_SERVER
    这个命令就是通过 SSH_SERVER 做为隧道,把 LOCAL 的指定端口跟 DESTINATION 的指定端口绑定起来。
    zxCoder
        4
    zxCoder  
    OP
       2022-02-03 23:35:27 +08:00
    @muzuiget

    请问 ssh 远程转发,命令也是在 A 机器执行的吗?
    然后 ssh -R 中的 REMOTE 是 B 机器 ip ,DEST 是 A 机器 ip 吗?
    sfqtsh
        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
    sfqtsh
        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
    sfqtsh
        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:]可以省略的原因。
    seanzxx
        8
    seanzxx  
       2022-02-04 04:27:03 +08:00
    简单的说,L 和 R 的相对的功能,
    L: 访问 localhost 转发访问 remote
    R: 访问 remote 转发访问 localhost
    iqfEmhuNidBhDfWo
        10
    iqfEmhuNidBhDfWo  
       2022-04-05 21:00:19 +08:00
    你只要区分“入口”和“落点”就行了,不要看啥“remote”和“local”,那只会越看越昏头。

    PS:贵站敏感词太他妈多了,写了一堆发不出来。。。
    iqfEmhuNidBhDfWo
        11
    iqfEmhuNidBhDfWo  
       2022-04-05 21:01:33 +08:00
    @ukss 转发规则的前 2 域是入口,后 2 域是落点,记住这一点你再也不会晕。
    lthon
        12
    lthon  
       344 天前
    说一下自己的理解,并回答 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
        13
    lthon  
       344 天前
    本地转发,流量:本地主机 -> 远程主机 -> 目的主机;
    远程转发,流量:远程主机 -> 本地主机 -> 目的主机;
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1084 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 22:52 · PVG 06:52 · LAX 15:52 · JFK 18:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.