如何通过跳板机(堡垒机)SSH连接内网服务器


嘿,朋友!你是不是也遇到过这样的场景:公司的数据库、应用服务器都藏在内网里,从你家的电脑或者咖啡馆的Wi-Fi根本访问不到,每次都得先连上跳板机,再从跳板机连到目标服务器,操作起来相当繁琐?

别担心,今天这篇文章就是你的救星。咱们来聊聊如何通过跳板机(也叫堡垒机)用SSH优雅地、一步到位地连接到内网服务器。告别繁琐的两步登录,让你的工作流程丝滑顺畅!

为啥要有跳板机这玩意儿?

在开始之前,咱们先花半分钟搞清楚为啥要有“跳板机”这个角色。

简单来说,跳板机(Bastion Host)是一台可以直接从外网访问,并且也被授权访问公司内网资源的服务器。它就像一个戒备森严的“城堡大门”。 所有的进出请求都必须经过它,这样做有几个显而易见的好处:

  • 安全屏障:把内网服务器保护起来,不直接暴露在公网上,大大减少了被攻击的风险。
  • 集中管理:所有的访问都通过一个入口,方便进行权限控制和审计。管理员可以清楚地知道谁在什么时间访问了哪个资源。
  • 简化网络:不需要为每个内网服务器都配置复杂的防火墙和公网IP。

理解了这一点,咱们就知道为啥不能绕过它,而是要学习如何高效地“利用”它了。

传统但低效的方式:两步走

最原始的方法,估计很多人都用过:

  1. 第一步:先SSH登录到跳板机。
    ssh user_jump@jump_host_ip
  2. 第二步:在跳板机的终端里,再SSH登录到内网的目标服务器。
    ssh user_target@target_server_ip

这个方法能用,但缺点太明显了:

  • 操作繁琐:每次连接都要敲两次命令,输入两次密码或密码短语。
  • 文件传输困难:想用scp从本地传个文件到目标服务器?那得先scp到跳板机,再从跳板机scp到目标机,简直是噩梦。
  • 工具不兼容:很多图形化的SSH工具或者IDE的远程连接功能,在这种模式下配置起来非常麻烦。

那么,有没有更现代、更高效的玩法呢?当然有!

现代姿势一:ProxyJump (推荐)

ProxyJump 是 OpenSSH 7.3 版本之后引入的一个新特性,也是目前官方最推荐的方式。 它的别名是 -J 参数,作用就是告诉SSH客户端:“嘿,先帮我连上那个跳板机,然后通过它,再把我带到最终的目的地”。

整个过程是端到端加密的,非常安全。

1. 临时一次性连接

如果你只是偶尔需要这样连接一次,可以直接在命令行里使用 -J 参数。

代码案例:

假设:

  • 你的本地用户名:local_user
  • 跳板机地址:jump.example.com,登录用户:jump_user
  • 内网目标机地址:target.internal,登录用户:target_user

命令就像这样:

ssh -J [email protected] [email protected]

解析:

  • ssh:启动SSH客户端。
  • -J [email protected]:这里是关键!指定跳板机。SSH客户端会自动处理连接跳板机和建立通道的所有细节。
  • [email protected]:这个是你的最终目标。

输入这个命令后,系统可能会提示你输入jump_user的密码,然后是target_user的密码(如果你配置了SSH密钥对,那就更丝滑了,连密码都不用输)。整个过程一气呵成,就像直接连接目标机一样。

2. 一劳永逸的配置方式

每次都敲那么长的命令也挺烦的,对吧?作为一个追求效率的“懒人”,我们当然要把这个配置固化下来。方法就是修改你本地的SSH配置文件 ~/.ssh/config

代码案例:

打开(如果没有就创建一个)~/.ssh/config 文件,添加以下内容:

# 描述跳板机的信息
Host jump-server
    HostName jump.example.com
    User jump_user
    # 如果跳板机SSH端口不是22,可以在这里指定,例如 Port 2222

# 描述内网目标机的信息
Host target-server
    HostName target.internal
    User target_user
    ProxyJump jump-server

解析:

  • Host jump-serverHost target-server:这是两个别名,你可以随便取,方便自己记忆。
  • HostName:服务器的实际IP地址或域名。
  • User:登录该服务器的用户名。
  • ProxyJump jump-server:这是配置的核心!它告诉SSH客户端,当你要连接 target-server 这个主机时,请使用 jump-server 配置作为跳板。

效果如何?

配置好之后,神奇的事情发生了。现在你想连接内网的目标服务器,只需要执行:

ssh target-server

是不是超级简洁?如果你想传文件,同样简单:

scp /path/to/local/file target-server:/path/to/remote/directory/

所有需要SSH协议的工具,比如VSCode的Remote-SSH插件,现在也只需要填写主机别名 target-server 就可以直接连接了,它会自动读取你的 config 配置来完成跳板操作。

现代姿势二:ProxyCommand (兼容旧版)

ProxyJump 出现之前,ProxyCommand 是实现跳板功能的主流方式。 虽然现在有了更好的替代品,但了解一下还是很有必要的,万一你遇到一个非常古老的SSH客户端版本呢?

ProxyCommand 的原理是告诉SSH客户端,连接目标主机时,不要直接建立网络连接,而是执行一个命令,用这个命令的标准输入和输出(stdio)作为和服务器通信的通道。

代码案例:

同样是修改 ~/.ssh/config 文件:

# 描述跳板机的信息
Host jump-server
    HostName jump.example.com
    User jump_user

# 描述内网目标机的信息
Host target-server
    HostName target.internal
    User target_user
    ProxyCommand ssh -q -W %h:%p jump-server

解析:

  • ProxyCommand ssh -q -W %h:%p jump-server:这行命令的意思是,通过执行 ssh jump-server 命令,并利用它的 -W (netcat模式) 参数,将本地的请求原封不动地转发到目标主机(%h)的目标端口(%p)。

它的效果和 ProxyJump 几乎一样,只是配置稍微复杂一点点。在新版本的OpenSSH中,ProxyJump 内部实际上也是对 ProxyCommand 的一个更安全、更简单的封装。

案例:开发小哥的日常

小明是一名后端开发,他需要频繁连接到位于公司内网DMZ区的测试环境数据库服务器(10.0.1.100)进行调试。公司的安全策略规定,所有外部访问必须先通过堡垒机(bastion.mycompany.com)。

  • 没有配置前:小明每天都要先 ssh [email protected],然后再 ssh [email protected]。当他想用DataGrip这样的数据库工具直连内网数据库时,发现配置极其复杂,只好放弃。
  • 使用 ProxyJump 配置后:小明在自己的 ~/.ssh/config 文件里添加了如下配置:
    Host bastion
        HostName bastion.mycompany.com
        User admin
    
    Host test-db
        HostName 10.0.1.100
        User dev
        ProxyJump bastion
    现在,他只需要在终端输入 ssh test-db 就能一步登录。更棒的是,他在DataGrip的SSH/SSL配置里,直接选择代理方式为主机 bastion,就可以像连接本地数据库一样,无缝地操作内网的测试数据库了。效率大大提升!

总结

好了,总结一下今天的核心内容:

  1. 跳板机是保障网络安全的重要设施,我们不应该绕过它,而应该学会高效地使用它。
  2. 告别两步登录的原始方式,因为它低效且麻烦。
  3. **拥抱 ProxyJump**:这是现代OpenSSH客户端连接跳板机的最佳实践,使用 -J 参数或在 ~/.ssh/config 中配置 ProxyJump 指令。
  4. **了解 ProxyCommand**:作为备选方案,它在旧系统上依然能发挥作用。

强烈建议花五分钟时间,根据你的实际工作环境,优化一下你的 ~/.ssh/config 文件。这个小小的改动,绝对能为你今后的工作节省大量的时间和精力。现在就动手试试吧!


  目录