autossh-保持 SSH 隧道的工具


autossh:用于保持 SSH 隧道的工具

autossh 是一个用于自动重连和保持 SSH 会话的工具,特别适用于需要长期保持 SSH 隧道连接的场景。如果 SSH 会话意外断开(例如网络中断或主机故障),autossh 会自动重新建立连接,非常适合 MongoDB 副本集反向隧道配置。


安装 autossh

1. 在 Ubuntu 上安装

sudo apt update
sudo apt install autossh

2. 在 Windows 上使用

  • Windows 系统本身不支持 autossh,可以借助 WSL(Windows Subsystem for Linux) 或其他 SSH 客户端(如 PuTTY 和 Cygwin)实现类似功能。

基本用法

1. 基本命令格式

autossh [options] -R remote_port:local_host:local_port user@remote_host

示例:

建立一个反向 SSH 隧道,将本地的 27017 端口映射到远程主机的 27018

autossh -f -N -R 27018:localhost:27017 user@remote_host

参数说明:

  • -f:让 autossh 在后台运行。
  • -N:不执行远程命令,仅用于端口转发。
  • -R:反向端口转发,将远程的 remote_port 转发到本地。
  • user@remote_host:SSH 目标主机和登录用户。

2. 自动化保持 SSH 隧道

使用环境变量简化配置

通过设置 AUTOSSH_PORT,可以指定用于监控连接的本地端口(避免冲突):

export AUTOSSH_PORT=20000
autossh -f -N -R 27018:localhost:27017 user@remote_host

保持连接(启用探测)

默认情况下,autossh 会使用额外的端口探测连接状态,可以通过以下命令启用探测功能:

AUTOSSH_GATETIME=0 autossh -M 0 -f -N -R 27018:localhost:27017 user@remote_host

参数说明: - -M 0:禁用额外探测端口(默认会占用一个端口进行探测)。 - AUTOSSH_GATETIME=0:立即重新启动连接,而不等待。


实用案例

1. MongoDB 副本集反向隧道

将内网 MongoDB 的 27017 端口通过反向隧道映射到外网服务器的 27018 端口:

autossh -f -N -R 27018:localhost:27017 user@ubuntu_public_ip

在远程主机上,可以通过以下命令访问内网的 MongoDB:

mongosh --host localhost --port 27018

autossh 自动启动

1. 使用 Systemd 服务

创建一个 Systemd 单元文件,让 autossh 在系统启动时运行。

步骤

  1. 创建服务文件: bash sudo nano /etc/systemd/system/autossh-tunnel.service

  2. 添加以下内容: ```ini [Unit] Description=Autossh tunnel for MongoDB After=network.target

[Service] User=your_user Environment="AUTOSSH_GATETIME=0" ExecStart=/usr/bin/autossh -f -N -R 27018:localhost:27017 user@remote_host Restart=always

[Install] WantedBy=multi-user.target ```

  1. 启用并启动服务: bash sudo systemctl enable autossh-tunnel sudo systemctl start autossh-tunnel

  2. 检查服务状态: bash sudo systemctl status autossh-tunnel


2. 使用 cron 定时任务

如果不使用 Systemd,可以使用 cron 定期检查并启动隧道。

编辑 cron 配置

crontab -e

添加任务

每分钟检查并运行 SSH 隧道:

* * * * * pgrep -f "autossh.*-R 27018" || autossh -f -N -R 27018:localhost:27017 user@remote_host

注意事项

  1. SSH 公钥认证 使用 SSH 公钥认证避免输入密码: bash ssh-keygen -t rsa ssh-copy-id user@remote_host

  2. 连接探测稳定性 确保远程服务器的 SSH 端口正常开放。如果网络不稳定,建议设置较短的重连时间。

  3. 安全性

  4. 限制远程端口访问: 在 sshd_config 中添加绑定限制: ini AllowTcpForwarding yes GatewayPorts no

autossh 是一种简单、可靠的解决方案,可以帮助保持 MongoDB 副本集的反向隧道连接,非常适合内外网混合部署的场景。