• 请不要在回答技术问题时复制粘贴 AI 生成的内容
eggt
V2EX  ›  程序员

如何通过跳板机无缝连接需要跳转的服务器?

  •  
  •   eggt · Jul 23, 2021 · 11033 views
    This topic created in 1932 days ago, the information mentioned may be changed or developed.
    本机( mac 环境) 与跳板机 A 是通的,A 与 B, C, D ... 是通的,但 本机与 B,C,D 之间是不直通的,请教下,如何通过一些配置或工具,达到 本机全局情况下与 B,C,D 无缝连接(自动通过 A 中转连接)

    A, B, C, D.... 均是 linux 服务器
    51 replies  •  2021-07-24 11:12:24 +08:00
    zwy100e72
    zwy100e72
    Jul 23, 2021
    1
    先搭建 本机 - A 的隧道( SSH / VPN 均可)
    再通过隧道连接其他机器
    Ariver
    Ariver
    Jul 23, 2021
    2
    一楼正解。
    有的跳板机是 windows,烦死了。
    lcdtyph
    lcdtyph
    Jul 23, 2021 via iPhone❤️1
    3
    ssh -J jumpserver targetserver

    可以写进 .ssh/config
    huoshen
    huoshen
    Jul 23, 2021
    4
    gost 直接端口转发中转
    mrxun1998
    mrxun1998
    Jul 23, 2021
    5
    ssh -t -t B_user@B_ip -p 22 -o ProxyCommand='ssh -t -t A_user@A_ip -p 22 -W %h:%p''
    两边都配置成密钥登录的话一条命令就能通过 A 登录 B 了
    liyunyang
    liyunyang
    Jul 23, 2021
    6
    同问,有没有详细教程~
    公司的堡垒机限制太烦了,mac 环境被迫只能先远程 window 桌面,再连接 Linux 服务器
    重点是 mac 的 Windows 远程桌面工具( Microsoft Remote Desktop )实在难用,被迫安装了 pd 虚拟机。。
    神烦
    eggt
    eggt
    OP
    Jul 23, 2021
    7
    @lcdtyph 这只针对会话吧?我想找个全局都真通的方案
    @mrxun1998
    jk1030
    jk1030
    Jul 23, 2021
    8
    我也被搞得很烦 假如 A 是 windows b,c,d 是 lunix 这个时候应该怎么联通
    huoshen
    huoshen
    Jul 23, 2021
    9
    啥叫全局都真通?
    shynome
    shynome
    Jul 23, 2021 via Android
    10
    可以使用 tinc 组网,但前提是你能在 a, b, c, d 机器上安装软件
    组网的话以 a 机器为中心,本机和 b, c, d 都连接到 a,连接成功后,本机和 a, b, c, d 都可以互相访问就像在同一个局域网内(记得选一个不冲突的网段
    whale
    whale
    Jul 23, 2021
    11
    不直通的意思是 A,B,C,D 是同一个 VPC,就 A 开启了外网访问?
    网络环境不清楚,不好给方案。
    eggt
    eggt
    OP
    Jul 23, 2021
    12
    @huoshen 打错了,是直通😂
    eggt
    eggt
    OP
    Jul 23, 2021
    13
    @shynome 如果要在 b,c,d 上都要安装软件,这不被允许
    LLaMA2
    LLaMA2
    Jul 23, 2021❤️4
    14
    全程不使用额外的工具,完全依赖各个平台已有的工具,如下:
    假定本机的 ip 是 192.168.1.1,跳板机 windows (代号 A )是 192.168.2.1,生产机( BCD )是 192.168.3.1 、192.168.3.2 、192.168.3.3

    先在 A 上使用 Windows 命令行配置端口映射如下
    netsh interface portproxy add v4tov4 listenport=40022 connectport=22 connectaddress=192.168.3.1
    netsh interface portproxy add v4tov4 listenport=50022 connectport=22 connectaddress=192.168.3.2
    netsh interface portproxy add v4tov4 listenport=60022 connectport=22 connectaddress=192.168.3.3

    然后本机想要连接 B 机器就是 ssh [email protected] -p 40022
    然后本机想要连接 C 机器就是 ssh [email protected] -p 50022
    然后本机想要连接 D 机器就是 ssh [email protected] -p 60022
    yuanzi0
    yuanzi0
    Jul 23, 2021
    15
    mmh?
    shynome
    shynome
    Jul 23, 2021 via Android
    16
    @eggt 那只能在本机写路由转发了,将特定 ip 的访问转发到 a 服务器上,Linux 我知道能做到,Mac 不知道好不好做
    PandaRun
    PandaRun
    Jul 23, 2021
    17
    ssh tunnel
    LLaMA2
    LLaMA2
    Jul 23, 2021
    18
    linux 上端口转发
    # 将 A 机 40022 端口的流量转发至 B 机器 192.168.3.1 的 22 端口
    firewall-cmd --permanent --add-forward-port=port=40022:proto=tcp:toaddr=192.168.3.1:toport=22

    注意
    开启防火墙伪装:firewall-cmd --add-masquerade --permanent //开启后才能转发端口
    其他问题请搜索 firewalld 端口转发
    thet
    thet
    Jul 23, 2021
    19
    .ssh/config 里面配置
    host jump
    user xxxx
    hostname xxx.xxx.xxx.xxx
    port xxxx
    identityfile jumpserver.pem

    host server-a
    user xxxx
    hostname xxx.xxx.xxx.xxx
    proxyjump jump
    identityfile jump.pem

    配置好后,用 ssh server-a 就可以直接登录了,可以搜一下 ssh proxyjump 用法
    digitv
    digitv
    Jul 23, 2021
    20
    了解下 http tunnel,网上有现成的脚本
    libook
    libook
    Jul 23, 2021
    21
    本机 SSH 到 A,然后在 A 的 Shell 环境下直接 SSH 到 B 、C 、D 就可以。。。

    要是希望非 SSH 协议连到 B 、C 、D,可以在 A 上做几个映射到 B 、C 、D 上相应端口的转发规则,本地直接连接 A 上的对应端口就会自动被 A 转发到 B 、C 、D 上的特定端口上。这个可以去搜一搜 iptables 或者 SSH 隧道。

    VPN 能让你的本机和 A 、B 、C 、D 在一个网络里,这样是最方便的,不用配置特定端口。
    cpstar
    cpstar
    Jul 23, 2021
    22
    方法 1,SSH Tunnel,通过 A 的 ssh 建立 tunnel 到 B 、C 、D
    方法 2,端口映射,A 上开(比如 60022 、60122 、60222 之类)端口映射 B 、C 、D 的 22 。

    方法 1 安全一些,毕竟只暴露 A 的 22,B\C\D 的 22 不直接暴露,但是就是每次建立的时候,费点劲;
    方法 2 省事一些,直接连接连接

    方法 1,用 ssh 命令实现;方法 2 在 A 上用 iptables 或者 firewall-cmd 实现。两者都需要打开 port-forwarding,具体找文章。
    xylophone21
    xylophone21
    Jul 23, 2021
    23
    @zwy100e72
    @lcdtyph
    @huoshen
    @mrxun1998
    @ye4tar
    @ye4tar
    @thet
    @libook
    @cpstar

    这些代理,直通的方案,会不会降低系统的安全性?看起来这些方案里,A 机器都是做了数据转发,这样的话 A 就有可能并不知道 B 、C 、D 执行了什么命令,也就无从做审计,这样的话,堡垒机是不是就没有意义了?
    libook
    libook
    Jul 23, 2021
    24
    @xylophone21 #23 本来本地机器和 B 、C 、D 之间是隔离的,所以具备一定的安全性,你用任何方式打通了肯定就失去了对应的安全保障。这是个取舍问题。

    如果你希望记录本地机对 BCD 的网络调用情况,可以开网络日志进行审计,但你只能审计到网络连接的建立和断开以及对应的端口情况。

    如果是想知道具体做了哪些操作,就得做对应的协议的日志记录,比如 Shell 的日志、Web 日志。

    如果 A 是堡垒机,那么用本机直接操作 BCD 就是个伪命题,堡垒机的存在就是为了不让你在本机操作 BCD 的,必须登录到堡垒机 A,然后在堡垒机上再连接 BCD 进行操作,堡垒机 A 负责记录你的所有操作,甚至还会有录屏。

    安全和便利性是矛盾的,两者只能取其一。
    lavanil
    lavanil
    Jul 23, 2021
    25
    sshuttle -NHr user@B
    beginor
    beginor
    Jul 23, 2021 via Android
    26
    如果 堡垒机 a 能 ssh 转发的话可以这样,ssh 本地端口转发 `ssh -TNL 127.0.0.1:2022:server-b:22 user@a` 然后再 `ssh
    -p 2022 [email protected]`, 就是登录 b 了, 不用安装任何第三方软件
    xuboying
    xuboying
    Jul 23, 2021
    27
    真通只有 VPN 拨入啊。其他方案都是端口转发也就是通一个端口。
    其实这就是一个 AB 问题,OP 根本没有讲清楚业务需求,直接要一个最全最广的方案,相应的就是安全性或者部署复杂度的牺牲。
    xylophone21
    xylophone21
    Jul 23, 2021
    28
    @libook 对,所以我感觉这题是不是讨论偏了?无缝连接是个伪需求,因为要方便,要无缝连接,直接开放端口就好了,之所以不开放就是为了安全,才加堡垒机。如果又在堡垒机上开无缝连接,那么堡垒机就没有价值了。
    ming2050
    ming2050
    Jul 23, 2021
    29
    感觉还是老老实实用跳板机,通过打洞的方式访问服务器,跳板机就失去意义了。并且可能会带来新的安全隐患。
    Volekingsg
    Volekingsg
    Jul 23, 2021
    30
    我是往 A 开了个 SOCKS 代理,外网时自动走这个代理规则连 B, C, D 。
    Xusually
    Xusually
    Jul 23, 2021
    31
    直通的话,跳板机的作用就大打折扣了。
    knightdf
    knightdf
    Jul 23, 2021
    32
    ssh 隧道
    no1xsyzy
    no1xsyzy
    Jul 23, 2021
    33
    那就 ssh A -t ssh [B|C|D] -t 啊(
    eggt
    eggt
    OP
    Jul 23, 2021
    34
    @Volekingsg 我使用 clashx 创建了一个 scoket 代理,好像没用作用
    cpstar
    cpstar
    Jul 23, 2021
    35
    哦,堡垒机啊,那你应当选用具有审计功能的堡垒机。其实你这个 A 根本就不能称之为“堡垒机”,能 SSH 上去,然后再 SSH 到别的地方,审计,审啥啊,靠系统那点日志?得了吧。
    再说了,A 能 SSH,你能确保 ssh 到 A 的不打洞?一旦打动,任何所谓的审计措施全都失效。
    xiang0818
    xiang0818
    Jul 23, 2021
    36
    上面说了这么多,其实直接用 finalShell 建立隧道就可以了,哈哈哈 https://www.hualigs.cn/image/60fa811834c88.jpg
    Rache1
    Rache1
    Jul 23, 2021
    37
    @liyunyang 我觉得 RDP 还行呀,日常操作还是可以的,之前试过用 VNC 连 MAC mini 那才叫难受 😂
    libook
    libook
    Jul 23, 2021
    38
    @xylophone21 #28 堡垒机的价值就是约束管理员只能登录到堡垒机上对受保护资源进行操作,然后堡垒机记录相应的操作供审计。
    所以主题里描述的需求是和堡垒机的价值相悖的,要么去除堡垒机 A 然后让 BCD 可以被自由访问,要么老老实实登录到堡垒机 A 上再登录 BCD 进行操作,没有第三种方案。
    github2020
    github2020
    Jul 23, 2021
    39
    不考虑安全,单纯为了绕过限制、自己方便的话,可以:
    mac -> linux 透明代理(搞个 r2s 之类便携的) -> A 上的 ssh 或 socks5 代理-> B/C/D
    透明代理可以用 gost/glider 之类
    guanyin8cnq12
    guanyin8cnq12
    Jul 23, 2021
    40
    从 a 到 c 用 haproxy,代理 tcp 链接。从 a 到 d,经过 c,2 层代理,没搞过。
    Volekingsg
    Volekingsg
    Jul 23, 2021
    41
    @eggt #34
    Volekingsg
    Volekingsg
    Jul 23, 2021
    42
    @eggt #34
    大概步骤:
    1. ssh -fnNT -D 1080 username@ip -p port
    2. proxies 下面添加 socks 代理:
    proxies:
    - name: "name"
    type: socks5
    server: 127.0.0.1
    port: 1080
    udp: true
    3. 添加策略组和规则
    proxy-groups:
    - name: local
    type: select
    proxies:
    - name
    - DIRECT
    rules:
    - 'IP-CIDR,192.168.14.14/32,local'
    - 'IP-CIDR,192.168.14.16/32,local'
    4. 另外 clashx 没有增强模式,需要给 ssh 配置代理,或者使用 clashx pro
    Host *
    ...
    Proxycommand nc -X 5 -x 127.0.0.1:7890 %h %p
    ...
    Volekingsg
    Volekingsg
    Jul 23, 2021
    43
    @Volekingsg #42 或者连接不上再走代理
    Volekingsg
    Volekingsg
    Jul 23, 2021
    44
    @Volekingsg #42 或者连接不上再走代理
    Match exec "echo %h | grep '192\|124' | grep -q -v '208' && ! timeout 1 nc -z %h %p &> /dev/null"
    ProxyCommand nc -X 5 -x 127.0.0.1:7890 %h %p
    eggt
    eggt
    OP
    Jul 23, 2021 via iPhone
    45
    @Volekingsg 感谢老哥,我下周试试
    apeople
    apeople
    Jul 23, 2021
    46
    @liyunyang 我和你的情况简直一模一样,Microsoft Remote Desktop 经常连不上 mac 上的文件夹。
    akira
    akira
    Jul 24, 2021
    47
    跳板机就是让你 从跳板机去访问目标服务器的呀,还是你对跳板机理解有偏差了
    yuruizhe
    yuruizhe
    Jul 24, 2021 via iPhone
    48
    expect 脚本
    jinwyp
    jinwyp
    Jul 24, 2021
    49
    wireguard linux 内核自带 可以用我的脚本安装 wget --no-check-certificate https://raw.githubusercontent.com/jinwyp/one_click_script/master/install_kernel.sh && chmod +x ./install_kernel.sh && ./install_kernel.sh
    baoshuo
    baoshuo
    Jul 24, 2021
    50
    我用 Termius 解决这个问题,添加一个 Snippet 到主机的设置就行了
    jie123168
    jie123168
    Jul 24, 2021❤️1
    51
    用 expect 脚本, 我现在一直这么用的, 分享一个示例吧:
    ```
    #!/usr/bin/expect -f
    set user [lindex $argv 0];
    set password [lindex $argv 1];
    set server [lindex $argv 2];
    set ip 跳板机域名或 IP
    set port 22
    set timeout -1

    spawn ssh -p $port $user@$ip
    expect {
    "*yes/no" { send "yes\r"; exp_continue}
    "*跳板机域名或 IP's password: " {
    send "$password\r";
    exp_continue
    }
    "*Last login*" { exp_continue}
    "*Welcome to Alibaba Cloud*" { exp_continue}
    "Enter code*" {
    set code [gets stdin]
    send "$code\r"
    exp_continue
    }
    "*@跳板机主机名*" { send "ssh $server\r"; exp_continue }
    "*'s ssh password*" {send "$password\r"}
    }


    interact
    expect eof
    ```
    这里面先登陆跳板机, 然后手动输入了动态验证码, 再通过 ssh 登陆真实服务器.
    参数是跳板机的用户名, 密码. 及远程服务器的(主机名或 IP)
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1013 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 100ms · UTC 18:54 · PVG 02:54 · LAX 10:54 · JFK 13:54
    ♥ Do have faith in what you're doing.