Debian 服务器初始化全攻略:从裸机到生产环境
为什么选择 Debian?
Debian 作为最稳定、最可靠的 Linux 发行版之一,一直是服务器环境的首选。它的包管理系统稳定、安全,并且拥有庞大的软件仓库。本文将带你从一台全新的 Debian 13 服务器开始,一步步完成初始化配置,打造一个安全、高效的生产环境。
准备工作
在开始之前,我们需要:
- 一台安装好 Debian 13 的云服务器
- 服务器 IP 地址已解析到
maze.com域名 - 掌握
root密码,用于初始登录
第一步:登录服务器
首先,让我们通过 SSH 登录到服务器:
ssh root@maze.com
root@maze.com's password:第二步:设置主机名
为了便于识别和管理,我们需要设置主机名为maze(不建议使用域名作为主机名):
hostnamectl hostname maze编辑 hosts 文件:
vim /etc/hosts确保有这一行:
127.0.1.1 maze第三步:创建普通用户
直接使用root用户操作服务器存在安全风险,我们需要创建一个具有 sudo 权限的普通用户。这里我们创建一个名为mazeuser的用户:
# 创建用户并设置默认 shell 为 bash
useradd mazeuser -m -s /bin/bash
# 设置用户密码
passwd mazeuser
New password:
Retype new password:
passwd: password updated successfully
# 编辑 sudoers 文件,授予无密码 sudo 权限
$ /sbin/visudo在打开的sudoers文件中添加以下内容:
mazeuser ALL=(ALL) NOPASSWD: ALL第四步:配置 SSH 密钥登录
为了提高安全性并方便登录,我们使用 SSH 密钥进行无密码认证:
在本地机器上生成 SSH 密钥对
# 生成 Ed25519 密钥对(更安全、更高效)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 将公钥复制到远程服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub mazeuser@maze.com
mazeuser@maze.com's password:配置本地 SSH 客户端
修改本地的~/.ssh/config文件,添加如下内容:
Host maze
HostName maze.com
IdentityFile ~/.ssh/id_ed25519
User mazeuser
Port 22
ServerAliveInterval 60
ServerAliveCountMax 3测试 SSH 登录
现在尝试登录服务器,应该不需要输入密码了:
$ ssh mazeuser@maze.com如果登录成功,说明配置正确,我们可以禁用密码登录:
# 编辑 SSH 配置文件
sudo nano /etc/ssh/sshd_config
# 确保以下配置
PasswordAuthentication no
ChallengeResponseAuthentication no
# 重启 SSH 服务
sudo systemctl restart sshd⚠️ 重要:在禁用密码登录之前,请确保你已经成功测试了 SSH 密钥登录,否则可能会被锁在服务器外面!
第五步:更新系统
保持系统更新是安全的关键,让我们更新所有软件包:
sudo apt update
sudo apt upgrade -y
sudo apt autoremove -y
# 重启服务器以应用更新
sudo /sbin/reboot第六步:安全加固
配置防火墙
使用 ufw 作为防火墙,我们需要配置它只允许必要的端口:
# 安装 ufw
sudo apt install -y ufw
# 允许 SSH(必须先允许,否则可能断开连接)
sudo ufw allow ssh
# 允许 HTTP 和 HTTPS
sudo ufw allow http
sudo ufw allow https
# 启用防火墙
sudo ufw enable
# 查看状态
sudo ufw status numbered安装 Fail2ban
Fail2ban 可以防止暴力破解 SSH 登录:
sudo apt install -y fail2ban
# 创建本地配置文件
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# 编辑配置
sudo nano /etc/fail2ban/jail.local在[sshd]部分启用防护:
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600启动服务:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# 验证状态
sudo fail2ban-client status第七步:安装必要的软件
安装 Caddy 服务器
Caddy 是一款现代化的 Web 服务器,它会自动处理 SSL 证书的申请和更新,以及 HTTP 到 HTTPS 的跳转,非常适合作为反向代理:
# 添加 Caddy 官方源
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg
sudo chmod o+r /etc/apt/sources.list.d/caddy-stable.list
# 安装 Caddy
sudo apt update
sudo apt install caddy
# 启动并设置开机自启
sudo systemctl enable caddy
sudo systemctl start caddy安装 Node.js
我们使用 nvm 安装 Node.js,这样可以方便地管理多个 Node 版本:
# 安装 nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
# 加载 nvm(当前 shell 会话)
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# 安装 Node.js LTS 版本
nvm install --lts
# 安装 pnpm(更高效的包管理器)
curl -fsSL https://get.pnpm.io/install.sh | bash
# 验证安装
node -v
npm -v
pnpm -v安装 Podman
Podman 是一个无守护进程的容器运行时,比 Docker 更轻量、更安全。我们直接从 Homebrew 安装最新版本。
# 安装 Homebrew (确保 git 已安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 加载 Homebrew
echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> ~/.bashrc
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
# 安装 Podman(slirp4netns 和 fuse-overlayfs 会以依赖的形式安装)
brew install podman
# 验证安装
podman version
# 尝试运行 Podman 容器(果然失败)
podman run hello-world这里尝试启动 Podman 容器是会失败的,因为没有配置 rootless 模式。
配置 Podman Rootless 模式
Rootless 模式允许普通用户运行容器,不需要 root 权限。
第一步:安装必要依赖
sudo apt install -y uidmap # fuse-overlayfs 和 slirp4netns 之前已经安装了关于 rootlesskit:
-rootlesskit是 Podman 用于实现 rootless 模式的辅助工具
- 提供用户命名空间和网络命名空间支持
- 与
slirp4netns是替代关系,Podman 会根据版本自动选择使用哪一个 - 较新的 Podman 版本可能会优先使用
rootlesskit
如果你的系统已经安装了 Podman,这些依赖通常会被自动安装。
第二步:配置 subuid 和 subgid
为用户分配用户命名空间映射:
# 检查是否已有配置
cat /etc/subuid | grep mazeuser
cat /etc/subgid | grep mazeuser
# 如果为空,添加配置
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 mazeuser第三步:启用 unprivileged user namespaces
# 检查当前值
cat /proc/sys/kernel/unprivileged_userns_clone
# 如果为 0,启用它
sudo sysctl -w kernel.unprivileged_userns_clone=1
# 使配置永久生效
echo 'kernel.unprivileged_userns_clone=1' | sudo tee /etc/sysctl.d/00-unprivileged-userns.conf第四步:配置 Quadlet 支持
Debian 使用 systemd 管理服务,Quadlet 可以自动生成 systemd unit 文件:
# 检查 quadlet 是否已安装
which podman-system-generator || ls /usr/libexec/podman/quadlet
# 如果需要,启用 quadlet
sudo ln -s /home/linuxbrew/.linuxbrew/Cellar/podman/5.8.2/libexec/podman/quadlet /usr/lib/systemd/system-generators/podman-system-generator
sudo ln -s /home/linuxbrew/.linuxbrew/Cellar/podman/5.8.2/libexec/podman/quadlet /usr/lib/systemd/user-generators/podman-user-generator第五步:启用用户 linger
为了让容器在用户注销后继续运行,需要启用 user linger:
# 启用 user linger
sudo loginctl enable-linger $USER
# 验证 linger 状态
loginctl show-user $USER --property=Linger第六步:创建 conmon,crun 和 pasta 符号链接
执行容器的时候需要它们,所以需要创建符号链接。当然也可以把/home/linuxbrew/.linuxbrew/bin放到$PATH中。
sudo ln -s /home/linuxbrew/.linuxbrew/bin/conmon /usr/local/bin/conmon
sudo ln -s /home/linuxbrew/.linuxbrew/bin/crun /usr/local/bin/crun
sudo ln -s /home/linuxbrew/.linuxbrew/bin/pasta /usr/local/bin/pasta第七步:测试 Rootless 模式
# 以 mazeuser 身份运行测试
podman run hello-world如果成功,会看到欢迎信息。
总结:服务器已就绪
恭喜你!你已经成功完成了 Debian 服务器的初始化配置,现在你拥有了一个:
- 安全的服务器环境:SSH 密钥认证、禁用密码登录、防火墙配置、Fail2ban 防护
- 最新的软件包和系统更新
- 现代化的 Web 服务器 Caddy
- 灵活的 Node.js 环境(通过 nvm 管理)
- 轻量级的容器运行时 Podman(支持 rootless 模式)
这台服务器现在已经准备好部署你的应用了。无论是运行网站、API 服务还是容器化应用,它都能为你提供稳定、安全的运行环境。
当然,服务器管理是一个持续的过程,你还需要:
- 定期更新系统:
sudo apt update && sudo apt upgrade - 监控服务器性能:可以使用
htop、iotop等工具 - 备份重要数据
- 记录配置变更
但现在,你已经有了一个坚实的基础,可以开始构建你的应用了!
