点击展开更新日志

2025

04-14

这篇文章诞生了!

nexttime

会有些什么呢(❁´◡`❁)

源起

这篇文章的起因是在用了1年半的阿里云,跑了网站之后,突然想到如果服务器到期了数据咋办,所以决定在本地备份一份,到时候换机器重新部署即可。

最初是准备使用 rsync 的方式从服务器同步到本地的,但是主力机用的是 Win11,rsync 不太友好,所以选择了更加方便一点的 SFTP。

我的服务器版本为 Cent7,如果有些地方和你的发行版存在出入,请通过“问题+发行版”的形式使用谷歌查询。

SFTP 配置

修改SSH配置

登录服务器修改SSH配置文件

1
vim /etc/ssh/sshd_config

修改/新增以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
# 注释旧配置
# Subsystem sftp /usr/libexec/openssh/sftp-server
# 新增
Subsystem sftp internal-sftp
Match Group sftp_group # 限制用户组为 sftp_group,自定义
ChrootDirectory /data/backup # 限制访问目录
ForceCommand internal-sftp # 强制使用 SFTP
AllowTcpForwarding no # 禁用端口转发
X11Forwarding no # 禁用X11转发

# 修改默认 SSH 端口
Port 22333 # 如果修改了默认端口,一定要看!

❓: 为什么 Subsystem sftp 修改修改,可以使用默认的吗?【结果来自 Deepseek,供参考】

Subsystem sftp 表示定义 SFTP 服务模块, sftp_server 是外部 SFTP 服务进程路径,依赖外部进程。修改为 internal-sftp,使用 openssh 内置的 sftp 实现,优势:

  1. 直接集成在 SSH 守护进程中,减少了潜在的攻击面
  2. 若需限制用户仅能访问特定目录(如 /data/backup),必须使用 internal-sftp
  3. Cent8及Ubuntu20.04后的新版本openssh默认推荐 internal-sftp,。

重启 SSH 服务

1
systemctl restart sshd

创建 SFTP 用户与目录

创建用户与用户组(群组和用户名可以自定义):

1
2
3
groupadd sftp_group
useradd -m -G sftp_user -s /sbin/nologin sftp_user
passwd sftp_user

配置目录权限:

1
2
3
4
mkdir -p /data/backup/sftp
chown root:root /data/backup # 重要的一步:根目录属主必须为 root,权限755
chmod 755 /data/backup
chown sftp_user:sftp_group /data/backup/sftp

【‼️重要】放行安全组

  1. 阿里云控制台添加“入方向”规则,端口 22333/TCP,22 端口默认已放行;

  2. 服务器防火墙放行(如果开启了本地防火墙)

    1
    2
    firewall-cmd --zone=public --add-port=22333/tcp --permanent
    firewall-cmd --reload

做完之后一定先在本地尝试新端口 SSH 能否正常登录,确认没有问题后再退出。

如果修改了端口登录不上了怎么办

如果在修改端口之后就迫不及待退出了,然后发现无法登录(服务器防火墙没放行/关闭),难道只能重装了吗?!倒也不是没有办法,幸好在决定重装之前问了阿里云客服:

  1. 如果开启了SSH密钥登陆且关闭了密码登录:先重置密码(会重新开启密码登录)然后重新登录即可;
  2. 如果并没有关闭密码登录,可以从云平台使用 VNC 登录。

至此,就可以使用创建的账户登录进行 SFTP 同步了,但~是,真的就结束了吗。

SSH 密钥登录

起因是发现我的阿里云被尝试暴力破解,于是决定更换为私钥登录。这部分其实很早之前就做了,并非做 SFTP 的时候才想起,自然,上面新创的用户最好也用 SSH 私钥登录。

环境准备

Linux 自带了工具,Windows 建议安装 Git,使用 Git Bash 工具。

创建密钥对

打开 Git Bash,执行:

1
ssh-keygen -t ed25519 -f "ed25519_alicloud" -C "<MAIL>"
  • -t 指定密钥类型,rsa|ed25519,ed25519是一种更新、相比rsa更安全的算法,目前新版本ssh-keygen命令默认就是这个类型
  • -f 指定密钥文件名,默认为 id_rsa
  • -c 添加注释说明,一般用邮箱

执行之后会要求输入密码加密,可以选择用密码(不需要太复杂但一定要记住!),也可以直接回车不要密码。

拷贝至服务器

有两种方式可以将本地的公钥上传到服务器指定位置:

使用命令

1
ssh-copy-id -i ~/.ssh/ed25519_alicloud.pub <USERNAME>@<HOST>

会自动将公钥写入服务器 ~/.ssh/authorized_keys 文件中。

手动添加

  1. 查看公钥内容

    1
    cat ~/.ssh/ed25519_alicloud.pub
  2. 登录到服务器

  3. 创建密钥文件

    1
    2
    mkdir ·/.ssh
    vim ~/.ssh/authorized_keys

    将复制的公钥粘贴进来。

  4. 设置权限:必须设置正确的权限才会生效

    1
    2
    chmod 600 ~/.ssh/authorized_keys
    chmod 700 ~/.ssh

验证

如果修改了默认的密钥文件名,即不是 id_esa,就需要在登陆时指定使用的私钥文件,或者,在配置文件中进行定义:

1
vim ~/.ssh/config

config 文件帮忙管理每个会话使用的用户、端口和私钥文件。

说明:

  • 配置文件中不区分大小写,Hosthost 是一样的
  • 通过 tab 进行缩进区分配置块
  • 所有参数都支持通配符设置,比如将 Host 设置为 * 表示全局配置。
  • 没有必须配置的项,根据需要配置即可。

添加内容基本如下:

1
2
3
4
5
Host sftp_user
Hostname <IP>
User sftp_user
Port 22333
IdentityFile ~/.ssh/ed25519_alicloud
  • Host 配置块,名称自定义,用于之后连接使用,比如这里是 sftp_user ,之后我要使用这个用户连接服务器就可以直接用 ssh sftp_user 即可,会自动使用配置的用户、端口和私钥。
  • Hostname 服务器地址,IP或域名
  • User 登录用户
  • Port SSH 登录端口,默认 22。
  • Identityfile 使用的本地私钥文件

还有一些参数并不常用这里不介绍,感兴趣自行搜索:“ssh config配置”。

关闭密码登录

⚠️ 你只有在使用私钥成功登录后才能做这个操作

⚠️ 你只有在使用私钥成功登录后才能做这个操作

⚠️ 你只有在使用私钥成功登录后才能做这个操作

重要的事情我已经说了三遍,再发生什么问题就怪不得我了😌。

修改 SSH 配置文件:

1
vim /etc/ssh/sshd_config

修改/添加以下配置:

1
2
3
4
Port 22333
PubkeyAuthentication yes
PermitRootLogin yes # 如果你需要使用root远程就打开
PasswordAuthentication no # 关闭密码登录

如果,假设,万一关闭密码登录之后发现私钥也登不上,可以参考本 登不上服务器了怎么办

SFTP 同步

啊!中间跑题了一段,既然服务器上都准备好了,怎么同步到本地呢,使用 SFTP 工具就可以了,我因为用的是 GoodSync,配置好账号和路径就可以定时同步了。

等有时间出一期文章简单介绍一下我的备份方案吧。