新品 NVIDIA B300 · 288 GB HBM3e 服务器 — 起价 $4,019/月 每块 GPU

查看 B300

文档 · 访问

SSH 访问:密钥、防火墙、隧道与文件传输

把服务器锁定为只允许基于密钥的 SSH 登录,即使断开连接也能让长时间任务继续运行,并通过 SSH 而不是开放端口来访问 notebook 和仪表盘。

更新于 4 分钟阅读

创建一个 ed25519 密钥

在您自己的电脑上创建密钥,切勿在服务器上创建。Ed25519 密钥体积小、速度快,当前所有 OpenSSH 版本都支持。为密钥设置一个口令;有了 SSH 代理,就不必每次连接都输入口令。

ssh-keygen -t ed25519 -C "alice@laptop"
# 私钥:~/.ssh/id_ed25519    公钥:~/.ssh/id_ed25519.pub
ssh-add ~/.ssh/id_ed25519           # 可选:将其加载到 SSH 代理中

把公钥复制到您用于登录的账户。在 Linux 或 macOS 上:

ssh-copy-id -i ~/.ssh/id_ed25519.pub alice@203.0.113.10

Windows 没有 ssh-copy-id 命令。在 PowerShell 中:

type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh alice@203.0.113.10 "umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys"

只有 .pub 文件会离开您的电脑。如果私钥可能已经泄露,请从服务器上的 ~/.ssh/authorized_keys 中删除对应的那一行,并创建一个新密钥。

~/.ssh/config 中的快捷方式

主机条目可以省去重复输入,并将相同的选项应用到 ssh、scp 和 rsync:

Host gpu1
    HostName 203.0.113.10
    User alice
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes
    ServerAliveInterval 30
    ServerAliveCountMax 4

现在只需 ssh gpu1 即可连接。ServerAliveInterval 会每 30 秒发送一次保活信号,避免闲置会话被沿途的路由器断开。在 Linux 和 macOS 上,该文件不能被其他用户写入(chmod 600 ~/.ssh/config);在 Windows 上,它位于 %USERPROFILE%\.ssh\config。

关闭密码登录

当您的用户可以用密钥登录后,就关闭密码登录和键盘交互式登录,并禁止 root 使用密码登录。Ubuntu 会在应用其余配置之前,先读取 /etc/ssh/sshd_config.d/ 目录下的配置片段文件,对大多数选项来说,最先读到的值生效。文件名以 00- 开头的文件会最先被读取,从而覆盖之后的文件——比如某个会重新开启密码登录的 cloud-init 文件。

sudo tee /etc/ssh/sshd_config.d/00-hardening.conf >/dev/null <<'EOF'
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
EOF
sudo sshd -t && sudo systemctl restart ssh
sudo sshd -T | grep -Ei '^(passwordauthentication|kbdinteractiveauthentication|permitrootlogin) '

重启 SSH 服务不会关闭已经建立的会话。请在第二个终端中确认:密码登录现在会被拒绝,而您的密钥仍然可以正常使用:

ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password alice@203.0.113.10   # 必须失败
ssh gpu1                                                                                  # 必须成功

当您的 sudo 用户正常工作后,可以进一步使用 PermitRootLogin no。

使用 ufw 搭建基础防火墙

拒绝除 SSH 之外的所有入站流量,之后再根据需要逐个开放其他端口:

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status verbose

在运行 ufw enable 之前,先允许 SSH。没有这条规则,一旦防火墙启用,您就无法再打开新的 SSH 会话。

如果需要公开的 HTTPS 服务,例如反向代理,可以开放 sudo ufw allow 80,443/tcp。其余端口都保持私有,通过下文的 SSH 隧道访问。请注意,Docker 会通过自己的防火墙规则发布容器端口,ufw 无法过滤这些规则:请只把端口发布到 127.0.0.1,具体做法见容器一文。

为 SSH 配置 fail2ban

关闭密码登录后,暴力猜测不可能再成功,但仍会不断填满日志。fail2ban 会封禁那些反复失败的地址。Ubuntu 的软件包默认已经启用了 SSH 的 jail;下面这段简单的覆盖配置用来设置封禁策略:

sudo apt install -y fail2ban
sudo tee /etc/fail2ban/jail.d/sshd.local >/dev/null <<'EOF'
[sshd]
enabled  = true
maxretry = 5
findtime = 10m
bantime  = 1h
# 请勿封禁您自己的固定地址:
# ignoreip = 127.0.0.1/8 ::1 198.51.100.7
EOF
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd

要解除封禁:sudo fail2ban-client set sshd unbanip 198.51.100.7。

用 tmux 保持长任务运行

在普通 SSH 会话中启动的任务,一旦连接断开就会停止。而在 tmux 里,任务会继续运行,您可以从任意一次新的登录中重新接入:

tmux new -s train                     # 启动一个命名会话
python train.py 2>&1 | tee train.log  # 运行任务,同时保留日志文件
# 分离会话:先按 Ctrl-b,再按 d
tmux ls                               # 列出所有会话
tmux attach -t train                  # 之后重新接入

按 Ctrl-b [ 向上翻看历史输出(之后用方向键滚动,按 q 退出)。日志文件能让您在不接入会话的情况下查看进度:tail -f train.log。

为 Jupyter 和 TensorBoard 做端口转发

让 notebook 和仪表盘都只绑定在服务器的 127.0.0.1 上,再通过 SSH 访问它们。这样不会有额外的内容暴露在公网上。

# 在服务器上,tmux 会话内
jupyter lab --no-browser --ip=127.0.0.1 --port=8888
tensorboard --logdir runs --host 127.0.0.1 --port 6006

# 在您的电脑上
ssh -N -L 8888:127.0.0.1:8888 -L 6006:127.0.0.1:6006 gpu1

然后在浏览器中打开 http://localhost:8888(使用 Jupyter 打印出的 token)以及 http://localhost:6006。如果想让转发在每次连接时自动生效,可以在 ~/.ssh/config 里 gpu1 条目下加入 LocalForward 8888 127.0.0.1:8888。

用 rsync 和 scp 复制数据

# 上传:末尾的斜杠会把 dataset/ 的内容复制到 /data/dataset/ 中
rsync -avhP ./dataset/ gpu1:/data/dataset/

# 下载结果
rsync -avhP gpu1:/data/checkpoints/ ./checkpoints/

# 单个文件
scp ./config.yaml gpu1:~/
scp gpu1:~/results.csv .

rsync 会跳过已经相同的文件,所以再次运行时只会发送有变化的部分;-P 会保留部分传输的文件,让中断的传输可以继续,并显示进度。对于文本或 CSV 这类可压缩的数据可以加上 -z,但图片、视频或压缩包不建议使用。在 Windows 上,scp 是内置的,rsync 可以通过 WSL 使用。

关于大型数据集以及备份到对象存储,请参阅存储与数据。

对这篇指南有疑问?

请通过联系表单告诉我们您使用的 GPU、运行的命令以及得到的输出结果。

客户中心

登录 CryptGPU

您的订单、账单和服务器,一站式管理。

还没有 CryptGPU 账户?

账户是在结账时创建的:先选择您的服务器和软件,然后在首次下单的账户步骤中创建账户。

部署服务器