反向连接是指内部主机主动向外部的跳板机发起连接并创建隧道(例如 SSH -R),以便外部运维通过跳板机反向访问内网资源。对于无法被外网直连或出于安全隔离的主机,使用反向连接可以实现安全的远程管理。
实现双向审计(既记录运维人员在跳板机端的操作,也记录目标主机侧的真实会话与命令)能保证审计链完整,防止一端日志被篡改或遗漏,从而满足合规与取证要求。
确保跳板机(公网)与目标主机(内网)之间可以建立出站连接;使用密钥认证,禁用密码登录,准备独立的运维密钥对;为跳板机与目标主机分别建立最小权限的运维账号。
跳板机需开放用于反向隧道的监听端口(例如 22022 或随机高位端口),并在防火墙上限制来源与目标;在目标主机上确保出站端口(22 或指定端口)可达跳板机。
在 authorized_keys 使用限制选项(如 from=、command=、no-pty、no-agent-forwarding、permitopen 等)限制密钥用途;制定日志不可篡改策略、数据保留与访问控制规则;考虑使用基线扫描与审计白名单。
在目标主机执行(假设跳板机 user@jump.example.com,远端监听端口 22022):
ssh -i /root/.ssh/id_rsa -N -R 22022:localhost:22 user@jump.example.com
该命令会在跳板机上打开本地端口 22022,访问该端口会被转发到目标主机的 22 端口。
安装 autossh 并使用 systemd 单元保持连接自动重连,示例 systemd 服务:
[Unit]
Description=Autossh reverse tunnel
After=network.target
[Service]
User=root
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -M 0 -o "ServerAliveInterval=30" -o "ServerAliveCountMax=3" -i /root/.ssh/id_rsa -N -R 22022:localhost:22 user@jump.example.com
[Install]
WantedBy=multi-user.target
在跳板机端的 sshd_config 为该反向端口设置只允许指定来源访问,或在 authorized_keys 中使用 permitopen 限制允许的端口映射,避免被滥用。
常用工具包括 tlog(与 systemd-journal 集成)、script/ttyrec(简单的 TTY 录制)和商业方案(如堡垒机)。建议在跳板机对进入的 SSH 会话强制使用录制器:可在 sshd 的 ForceCommand 指向会话录制脚本或使用 PAM 模块。
在目标主机同时采集命令执行层面的审计:部署 auditd(记录 execve、用户切换等),或在 shell 层使用 sudosh/tlog-plugin-sudo 来记录交互与命令。结合 auditd 的规则可捕获 su/sudo/execve 系列事件。
把跳板机与目标主机的录制文件和审计日志实时发送到集中日志服务(rsyslog/Fluentd -> ELK/Wazuh)并启用传输加密(TLS)。为防篡改,可在集中端加入写时追加、WORM 存储或对日志做签名(例如使用 Hash 并上链或存储在只读备份)。
通过一次完整流程测试:目标主机建立反向隧道,运维在跳板机登录并对目标执行若干命令;随后核对跳板机录制的会话、目标主机 auditd 日志与集中日志是否一致,检查时间戳、会话 ID 与用户标识是否匹配。
1) 隧道不稳定:检查网络、使用 autossh 与 ServerAlive 设置;2) 权限/密钥问题:确认 authorized_keys 的限制选项与密钥路径;3) 日志不完整:检查录制程序是否被替换、auditd 规则是否加载、SELinux/AppArmor 阻止写入。
合规方面要制定日志保留策略、访问审批流程与审计查询记录;对敏感数据采取脱敏或访问控制,确保只有授权审计员能够查看完整会话。对不可篡改性的提升建议使用集中签名/时间戳与定期完整性校验(例如定期计算并归档日志哈希值)。