SSH隧道技术

1.什么是SSH隧道+为什么需要SSH隧道?

SSH 隧道就像是一条加密的地下通道,让你在不安全的网络上安全地传输数据。
比如:你想从家里访问公司内网的数据库,但数据库只能在公司内网访问,这时候 SSH 隧道就能帮你 “穿墙” 访问。

2.SSH的隧道类型

SSH反向连接(远程端口转发)

因此可以通过访问内网2来访问内网1的主机(因为内网2是允许外网主机访问的)

如果此时就是想访问server 1 可以修改命令为 ssh -L 80:127.0.0.1 用户@server1_ip

1
2
#ssh反向连接命令格式
ssh -R 远程主机监听端口:本地主机地址:本地服务端口 用户名@远程服务器地址

SSH正向连接(本地端口转发)

1
2
#指令格式
ssh -L 本地端口:内网目标IP:内网目标端口 SSH服务器用户名@SSH服务器IP

ssh动态连接(动态端口转发)


3.SSH的密钥

ssh最重要是第一次连接,这是漏洞的所在点


4.SSH的维持连接

断开原因:

网络层面的中断因素

  • 底层网络波动:Wi-Fi信号弱、移动网络切换、路由器故障或带宽不足,导致TCP连接超时。
  • 防火墙/NAT超时机制:企业网络防火墙或家用路由器设置连接超时时间(如无数据传输时),主动断开“非活跃连接”。
  • NAT穿透失效:内网通过NAT访问公网时,映射表项超时(如30分钟),导致公网无法识别连接。

设备与资源限制

  • 服务器负载过高:CPU、内存不足或进程异常,导致SSH服务进程被系统终止。
  • 客户端异常:设备休眠、电源中断、SSH客户端程序崩溃或网络接口断开(如拔网线)。

连接状态与配置问题

  • 心跳包机制未启用:未配置ServerAliveInterval等参数,无法通过心跳包维持连接活跃状态,被中间设备断开。
  • 配置参数不合理:如ClientAliveCountMax设置过小,导致轻微网络延迟即触发断连。

安全策略与异常行为

  • 账号锁定或认证失败:多次密码输入错误触发安全策略,账户被锁定或IP被封禁。
  • 会话残留或异常终止:连接断开时未正常释放资源,残留进程可能导致后续连接冲突。

其他偶发因素

  • 跨时区或时钟同步问题:服务器与客户端时钟偏差过大,导致TCP校验失败。
  • 网络攻击或干扰:DDoS攻击、中间人攻击等破坏TCP连接的完整性。

维持连接:

1.网络环境优化

  1. 物理网络稳定性

    • 使用有线网络替代Wi-Fi,或选择信号强的5GHz频段,减少波动。
    • 避免多层NAT环境(如家庭路由器+企业VPN),降低连接跳数。
  2. 防火墙与NAT配置

    • 调整防火墙规则,允许SSH流量通过(通常为TCP 22端口),并延长连接超时时间(如30分钟)。
    • 配置NAT设备的静态端口映射,确保SSH连接的稳定性。

2.SSH连接参数调整

  1. 客户端配置(~/.ssh/config)-Linux系统

    1
    2
    3
    4
    5
    6
    7
    Host *
    ServerAliveInterval 30 # 每30秒发送心跳包
    ServerAliveCountMax 10 # 连续10次无响应才断开
    TCPKeepAlive yes # 启用TCP级心跳
    ControlMaster auto # 启用连接复用
    ControlPath ~/.ssh/socket-%r@%h:%p
    ControlPersist 1h # 主连接保持1小时
  2. 服务器配置(/etc/ssh/sshd_config)-Linux系统

    1
    2
    ClientAliveInterval 60        # 服务器主动检测客户端的间隔
    ClientAliveCountMax 3 # 允许的无响应次数

    配置后重启SSH服务:sudo systemctl restart sshd

SSH 客户端如何发现并使用配置文件?

  1. 自动查找机制

    • 每次执行 ssh 命令时,客户端会按固定顺序查找配置文件:
      1
      ~/.ssh/config → /etc/ssh/ssh_config
    • Windows 路径:%USERPROFILE%\.ssh\configC:\ProgramData\ssh\ssh_config
  2. 优先级规则

    • 用户级配置 (~/.ssh/config) > 系统级配置 (/etc/ssh/ssh_config)
    • 文件中的配置从上到下生效,后出现的配置覆盖前面的
  3. 加载验证方法

    1
    2
    # 添加 -v 参数查看加载过程
    ssh -v user@server.com

    输出中会显示:

    1
    2
    debug1: Reading configuration data /c/Users/21143/.ssh/config
    debug1: Applying options for *
(1)为什么您需要手动创建文件?
  1. 默认文件不存在

    • SSH 不会自动创建用户级配置文件
    • 首次使用时需要手动创建
  2. 目录结构要求

    1
    2
    3
    4
    5
    6
    # 必需的目录结构
    C:\Users\21143\
    └── .ssh/
    ├── config # 配置文件
    ├── id_rsa # 私钥
    └── known_hosts # 已知主机记录
  3. 权限要求

    • 必须设置严格权限(否则 SSH 会忽略配置):
    1
    2
    icacls $env:USERPROFILE\.ssh /inheritance:r
    icacls $env:USERPROFILE\.ssh /grant:r "$env:USERNAME:(F)"
(2)配置文件如何影响连接?

当您执行 ssh user@host 时:

  1. 客户端加载 ~/.ssh/config
  2. 匹配 Host 配置块(支持通配符)
  3. 应用配置参数到当前连接
  4. 命令行参数会覆盖配置文件设置
(3)配置示例解析
1
2
3
4
5
6
7
8
9
Host myserver            # 定义主机别名
HostName 192.168.1.10 # 真实IP/域名
User admin # 自动使用此用户名
Port 2222 # 非标准端口
IdentityFile ~/.ssh/id_ecdsa # 指定私钥

Host * # 全局默认配置
ServerAliveInterval 30
TCPKeepAlive yes

使用时:

1
2
3
4
5
# 触发 myserver 配置块
ssh myserver

# 触发全局配置 (*)
ssh any-other-server
(4)关键验证步骤
  1. 创建文件后执行:

    1
    2
    # 检查配置是否被加载
    ssh -G myserver | findstr "ServerAliveInterval"

    应输出:serveraliveinterval 30

  2. 测试连接稳定性:

    1
    2
    # 观察是否还会超时断开
    ssh -v myserver

只要文件路径正确、权限合规且语法无误,SSH 客户端 100% 会自动加载 此配置文件,无需额外操作。这是 OpenSSH 的标准行为,在 Windows/Linux/macOS 上完全一致。

3.断线重连工具

  1. 使用autossh自动重连

    1
    autossh -M 0 -N -D 1080 user@server  # -M 0禁用端口监控,专注重连

    安装:

    • Ubuntu/Debian:sudo apt install autossh
    • macOS:brew install autossh
  2. 替代方案:mosh(移动SSH)

    1
    2
    3
    4
    # 服务器端安装
    sudo apt install mosh
    # 客户端连接(支持断线自动恢复)
    mosh user@server

4.会话持久化工具

  1. 使用screentmux

    • 在SSH会话中先启动screentmux,再执行长时间任务:
      1
      2
      screen -S mysession    # 创建会话
      # 执行任务(如编译、传输大文件)
    • 断线后重新连接,恢复会话:
      1
      screen -r mysession    # 恢复会话
  2. 后台运行命令

    1
    nohup command &         # 使命令不随SSH断开而终止

5.安全策略优化

  1. 密钥认证替代密码

    1
    2
    ssh-keygen              # 生成密钥对
    ssh-copy-id user@server # 上传公钥到服务器

    禁用密码认证(/etc/ssh/sshd_config):

    1
    PasswordAuthentication no
  2. 调整登录限制

    1
    2
    3
    4
    # 增加最大连接尝试次数
    MaxAuthTries 6
    # 设置登录超时
    LoginGraceTime 30s

6.监控与告警

  1. 实时监控连接状态

    1
    watch -n 1 'ss -tunap | grep ssh'  # 实时查看SSH连接
  2. 日志分析工具

    1
    journalctl -u sshd -f  # 实时查看SSH服务日志
  3. 告警机制

    • 配置服务器监控工具(如Prometheus+Grafana),当SSH连接异常时发送通知。

7.特殊场景解决方案

  1. 高延迟网络

    • 降低TCP窗口缩放:
      1
      2
      # 客户端临时设置
      sudo sysctl -w net.ipv4.tcp_window_scaling=0
  2. 跨时区时钟同步

    1
    2
    sudo apt install ntp    # 安装NTP服务
    sudo systemctl restart ntp

8.测试与验证

  1. 网络连通性测试

    1
    2
    ping server             # 测试网络可达性
    traceroute server # 追踪路由路径
  2. 端口可用性测试

    1
    nc -zv server 22        # 测试SSH端口连通性