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

比较特别的 SSH 端口转发的问题

  •  
  •   frostnotfall · 2018-01-22 10:33:21 +08:00 · 3920 次点击
    这是一个创建于 2490 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求比较简单,一句话就可以描述: A 通过 B 连接 C 的 3306 端口

    但是具体是实现就比较麻烦了,实际上是被搞得特别乱,本地端口转发和远程端口转发网上说的都不太明朗,求助大家 如何在 A 上执行一条命令实现呢?

    17 条回复    2018-01-22 14:12:01 +08:00
    lairdnote
        1
    lairdnote  
       2018-01-22 10:39:04 +08:00   ❤️ 1
    ssh -L localhost:3306:C:3306 xxx@B ip
    EricInBj
        2
    EricInBj  
       2018-01-22 10:43:40 +08:00   ❤️ 1
    如果你有 B 的 SSH 权限,可以在 A 上执行:

    ```
    ssh -NfCL 0.0.0.0:3306:C_IP:3306 root@B_IP

    ```
    这样你就可以在 A 上,连接 A 机的 3306 端口,达到访问 C 上的 3306 端口的目的。
    同样,不管是 D 机 E 机还是啥机,只要是能访问到 A 机的,也都可以通过 A 机的 3306 访问到 C。
    如果不希望别的机通过 A 访问 C,那就把上面命令中的 0.0.0.0 换成 127.0.0.1 吧。
    mawenjian
        3
    mawenjian  
       2018-01-22 10:44:47 +08:00
    在 B 机上装个 socat 做转发
    EricInBj
        4
    EricInBj  
       2018-01-22 10:44:52 +08:00
    @lairdnote 发完发现大胸弟已经回答了。。。
    frostnotfall
        5
    frostnotfall  
    OP
       2018-01-22 10:49:30 +08:00
    @lairdnote #1 解决了,问题出在了 localhost 上,端口绑定到了 127.0.0.1 上,导致其他机器连接不了
    warcraft1236
        6
    warcraft1236  
       2018-01-22 10:51:54 +08:00   ❤️ 1
    给你贴出来我目前用的

    alias testsql="ssh -J vps -NL 13500:xx.xx.xx.xx:3306 -i ~/Downloads/text.pem xx.xx.xx.xx"

    第一个 xx.xx.xx.xx 是 MySql 所在的机器 IP,第二个 xx.xx.xx.xx 是跳板机 IP
    warcraft1236
        7
    warcraft1236  
       2018-01-22 10:53:16 +08:00
    @warcraft1236

    vps 是我自己 fq 用的 vps

    这个命令的作用就是,通过我的 vps 作为代理,连接到跳板机上然后连接到 MySql 服务器上。原因是跳板机在 aws 上,经常爆炸
    frostnotfall
        8
    frostnotfall  
    OP
       2018-01-22 10:54:37 +08:00
    @warcraft1236 #6 不错的思路
    falcon05
        9
    falcon05  
       2018-01-22 10:55:36 +08:00 via iPhone
    这一点也不特别……
    xderam
        10
    xderam  
       2018-01-22 11:01:32 +08:00
    或者 proxycommand 似乎也能解决,但比直接-L 貌似更难理解。
    frostnotfall
        11
    frostnotfall  
    OP
       2018-01-22 11:02:34 +08:00
    @falcon05 #9 看了二楼才发现真的不特别,哈哈(捂脸淘)
    ywgx
        12
    ywgx  
       2018-01-22 11:08:53 +08:00
    B 机器部署一个 Nginx, 经过 stream 四层转发 C 的 3306 端口即可, 这样从 A 远程连 B 的 3306 端口达到目的

    stream{
    upstream mysql {
    server xx.xx.xx.xx:3306;
    }
    server {
    listen 3306;;
    proxy_pass mysql;
    }
    wizardoz
        13
    wizardoz  
       2018-01-22 12:11:09 +08:00
    ssh -L 10022:C:22 user@B
    wekw
        14
    wekw  
       2018-01-22 13:53:05 +08:00
    Nginx +1
    JoyHao
        15
    JoyHao  
       2018-01-22 14:04:01 +08:00
    Nginx +2
    loadinger
        16
    loadinger  
       2018-01-22 14:06:10 +08:00
    所以你们都把 22 伪装成 mysql 来“骗人”吗。。
    pigzilla
        17
    pigzilla  
       2018-01-22 14:12:01 +08:00
    这个需求要说明 BC 两者哪个方向是可以直连的。

    如果仅 B 可以直连 C,那在 B 上 SSH 连接到 C 时做 Local Forwarding。或者在 B 上用任意端口转发 /隧道方案如 netcat,socat,iptables,spiped 等都可以。

    如果仅 C 可以直连 B,那在 C 上 SSH 连接到 B 时做 Remote Forwarding 即可。或者在 C 上发起隧道连接。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2623 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:50 · PVG 18:50 · LAX 02:50 · JFK 05:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.