























Alpine Linux 以极致的轻量化和卓越的安全性著称。它选择 musl libc 与 busybox 作为核心组件,并非偶然,而是为了在最小资源开销下,构建一个安全、纯净、高度可控的运行环境。
受这种极简主义理念的影响,我逐步将大部分服务器环境迁移到 Alpine 之上。随着服务数量的增长,如何从基础系统配置到高效服务部署实现高效管理。
对于追求极致纯净的用户,自定义 ISO 是首选。Alpine Linux 的 VIRTUAL 版镜像针对 KVM 虚拟化进行了深度裁剪与内核优化,能够最大限度减少不必要的驱动负载。
PS:在服务商管理面板 - 上传并挂载镜像 - 通过 VNC 进行安装
不支持挂载自定义 ISO 的服务商,可以使用一键脚本进行安装:
使用以下大佬 DD 脚本:
# 下载脚本
curl -O https://raw.githubusercontent.com/bin456789/reinstall/main/reinstall.sh || wget -O ${_##*/} $_
# 重装 Alpine Linux
# ⚠️ 注意:请务必替换为高强度密码
bash reinstall.sh alpine 3.23 --password '强密码'
# 重启服务器
reboot
安装完成后,使用SSH登陆服务器,进行配置。
Alpine Linux 的软件源配置非常灵活,你可以根据对稳定性和新软件的需求,选择不同类型的仓库。下表整理了三种常用源的特点与适用场景:
| 源类型 | 仓库路径 | 稳定性 | 适用场景 |
|---|---|---|---|
| 固定版本 | /alpine/v3.23/main | 最高 | 生产服务器 |
| stable | /alpine/stable/main | 高 | 想自动追大版本的服务器 |
| edge | /alpine/edge/main | 低 | 个人测试、尝鲜 |
💡 提示:路径中的
/main和/community分别对应核心仓库与社区仓库。生产环境建议同时启用main与community,以满足大部分软件需求。
如果服务器在国内可以使用国内源:
mirrors.tuna.tsinghua.edu.cn/alpinehttps://mirrors.huaweicloud.com/alpine以下命令将自动指向最新的稳定版 Alpine(未来升级版本无需手动改配置)。
# 备份文件
cp /etc/apk/repositories /etc/apk/repositories.bak
# 稳定版本
echo "https://dl-cdn.alpinelinux.org/alpine/stable/main" > /etc/apk/repositories
echo "https://dl-cdn.alpinelinux.org/alpine/stable/community" >> /etc/apk/repositories
# 更新包引索
apk update
执行 apk update 后,系统就会从新的源拉取软件包列表,之后即可正常安装或升级软件。
hostname <主机名>
# 永久生效
echo "主机名" > /etc/hostname
在日常运维中,避免直接使用 root 账户是一项基本的安全实践。
# 安装 sudo 软件包
apk add sudo
# 创建用户
adduser zhang
# 将 zhang 添加到 wheel 组
addgroup zhang wheel
# 开启 wheel 组免密 sudo 权限
sed -i 's/# %wheel ALL=(ALL:ALL) NOPASSWD: ALL/%wheel ALL=(ALL:ALL) NOPASSWD: ALL/' /etc/sudoers
# 输入两次需要修改密码
sudo passwd root
# 更新并升级系统现有包
sudo apk update && sudo apk upgrade
# 常用工具
sudo apk add \
ca-certificates \
tzdata \
git \
curl \
wget \
unzip \
tmux \
btop \
bind-tools \
tree \
vim
# 加载内核 BBR 模块
sudo modprobe tcp_bbr
# 写入配置文件,确保开机自动加载
echo "tcp_bbr" | sudo tee /etc/modules-load.d/bbr.conf
# 确保 modules 服务开机自启
sudo rc-update add modules boot
# 写入内核参数
sudo cat > /etc/sysctl.d/99-bbr.conf <<'EOF'
net.core.default_qdisc = fq_codel
net.ipv4.tcp_congestion_control = bbr
EOF
# 应用配置
sudo service sysctl restart
# 验证
lsmod | grep bbr
sysctl net.ipv4.tcp_congestion_control
将公钥添加至 SSH 服务器,替代传统密码登录方式:
# 切换到普通用户
su dejavu
# 创建公钥目录
mkdir -p ~/.ssh
# 手动编辑 SSH 公钥
vim ~/.ssh/authorized_keys
# 或者上传 SSH 公钥
# ssh -i /path/to/your/ed25519_key username@<IP> -p <port>
# 设置权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
参考 SSH 配置 ,进行基础 SSH 加固:
# 编辑 SSH 服务器配置
sudo vim /etc/ssh/sshd_config
# 检查配置
sudo sshd -t
# 重启 SSH 服务
sudo rc-service sshd restart
根据个人习惯,可以参考的配置比例:
| CPU | RAM | ZRAM | Swap |
|---|---|---|---|
| 1vCPU | 1GB | 512MB (50%) | 2GB |
| 1vCPU | 4GB | 2GB (50%) | 4GB |
| 2vCPU | 4GB | 2GB (50%) | 4GB |
| 4vCPU | 20GB+ | 4GB (20%) | 0~2GB |
对于小内存服务器 (RAM ≤ 4GB),我一般开启 ZRAM 配合磁盘 Swap 以使用。
# 1. 创建 4GB 的 Swap 文件
sudo fallocate -l 4G /swapfile
# 上面命令也可以使用 dd 代替
# sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
# 设置权限与格式化
sudo chmod 600 /swapfile
sudo mkswap /swapfile
# 开机自动挂载配置(pri=10 是优先级设置)
echo '/swapfile none swap sw,pri=10 0 0' | sudo tee -a /etc/fstab
# 启动服务
sudo rc-update add swap boot
sudo service swap start
配置 ZRAM,优先级应高于 Swap 交换空间:
# 安装 ZRAM 初始化工具
sudo apk update && sudo apk add zram-init
# 编辑 ZRAM 配置文件
sudo vim /etc/conf.d/zram-init
注意以下字段:
# /etc/conf.d/zram-init
load_on_start=yes
unload_on_stop=yes
num_devices=1
type0=swap
# 根据需求调整 (MB)
size0=2048
# 使用 zstd 压缩算法
algo0=zstd
启动服务:
sudo rc-update add zram-init default
sudo service zram-init start
优化内核内存调度:
sudo cat >> /etc/sysctl.conf <<'EOF'
vm.swappiness = 80
vm.watermark_scale_factor = 125
vm.page-cluster = 0
EOF
应用内核参数:
验证效果:
sudo zramctl
sudo cat /proc/swaps
sudo swapon --show
# 安装
sudo apk update && sudo apk add nftables
# 编辑规则
sudo vim /etc/nftables.nft
示例配置:
#!/usr/sbin/nft -f
# 清空所有规则
flush ruleset
table inet filter {
# ============================================================
# Cloudflare CDN IP 集合 (Sets)
# ============================================================
set cloudflare_v4 {
type ipv4_addr; flags interval;
elements = {
173.245.48.0/20, 103.21.244.0/22, 103.22.200.0/22, 103.31.4.0/22,
141.101.64.0/18, 108.162.192.0/18, 190.93.240.0/20, 188.114.96.0/20,
197.234.240.0/22, 198.41.128.0/17, 162.158.0.0/15, 104.16.0.0/13,
104.24.0.0/14, 172.64.0.0/13, 131.0.72.0/22
}
}
set cloudflare_v6 {
type ipv6_addr; flags interval;
elements = {
2400:cb00::/32, 2606:4700::/32, 2803:f800::/32, 2405:b500::/32,
2405:8100::/32, 2a06:98c0::/29, 2c0f:f248::/32
}
}
# ============================================================
# INPUT 链 (入站)
# ============================================================
chain input {
type filter hook input priority filter; policy drop;
# 放行回环接口和已建立的连接
iif "lo" accept
ct state { established, related } accept
ct state invalid drop
# 合并 Alpine 默认的关键 ICMPv4 规则,防止 PMTU 黑洞
ip protocol icmp icmp type { echo-reply, destination-unreachable, echo-request, time-exceeded, parameter-problem } accept
# 合并 Alpine 默认的关键 ICMPv6 规则
icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, parameter-problem, echo-request, echo-reply } accept
# 允许 IPv6 SLAAC 和邻居发现
icmpv6 type { nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert } ip6 hoplimit 255 accept
# 允许 SSH 服务
tcp dport 22122 accept
# 仅限 Cloudflare IP 段访问 80/443
ip saddr @cloudflare_v4 tcp dport { 80, 443 } accept
ip6 saddr @cloudflare_v6 tcp dport { 80, 443 } accept
}
# ============================================================
# FORWARD 链 (转发)
# ============================================================
chain forward {
type filter hook forward priority filter; policy drop;
ct state { established, related } accept
ct state invalid drop
# qBitTorrent Docker 端口放行
# tcp dport 10880 accept
# udp dport 10880 accept
# 允许 Docker 容器出站及互通
iifname "docker0" accept
iifname "br-*" accept
iifname "docker0" oifname "docker0" accept
iifname "br-*" oifname "br-*" accept
}
# ============================================================
# OUTPUT 链 (出站)
# ============================================================
chain output {
type filter hook output priority filter; policy accept;
}
}
# 引入外部依赖配置
include "/var/lib/nftables/*.nft"
include "/etc/nftables.d/*.nft"
应用并启动服务:
# 验证配置
sudo nft -c -f /etc/nftables.nft
# 启动服务
sudo rc-update add nftables default
sudo service nftables start
# 检查生效规则
sudo nft list ruleset
# 后续修改应用规则
sudo nft -f /etc/nftables.nft
sudo service nftables restart
# Docker 和 Fail2ban 在 nftables 后重启
sudo service fail2ban restart && sudo service docker restart
# 安装 Fail2ban
sudo apk update && sudo apk add fail2ban
sudo vim /etc/fail2ban/jail.local
保护 SSH 服务器:
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1
bantime = 1d
findtime = 10m
maxretry = 3
banaction = nftables-multiport
banaction_allports = nftables-allports
[sshd]
enabled = true
# SSH 服务的监听端口(务必正确匹配)
port = 22122
backend = auto
logpath = /var/log/messages
mode = aggressive
启动服务:
sudo rc-update add fail2ban default
sudo service fail2ban start
# 查看服务状态
sudo service fail2ban status
测试封禁:
# 模拟封禁 IP
sudo fail2ban-client set sshd banip 2400:6180:0:d2:0:2:9699:d000
# 检查 nftables 规则中是否存在 f2b 动态表
sudo nft list ruleset | grep f2b
巡查规则:
# 查看哪些 jail 正在运行
sudo fail2ban-client status
# 查看 sshd 具体封禁情况
sudo fail2ban-client status sshd
# 测试完毕,解封测试 IP
sudo fail2ban-client set sshd unbanip 2400:6180:0:d2:0:2:9699:d000
# 重启服务
sudo service fail2ban restart
# 安装 Nginx 软件包
sudo apk add nginx openssl
# 加入开机启动项
sudo rc-update add nginx default
# 立即启动服务
sudo service nginx start
生成自签 TLS/SSL 证书,设置默认站点拒绝未匹配域名的扫描流量。
# 存放证书目录
sudo mkdir -p /etc/nginx/cert
sudo chmod 700 /etc/nginx/cert
# 生成自签证书
sudo openssl req -x509 -new -nodes -newkey rsa:2048 \
-sha256 \
-days 3650 \
-keyout /etc/nginx/cert/deny.key \
-out /etc/nginx/cert/deny.pem \
-subj "/C=XX/ST=Denied/L=Denied/O=Denied/CN=invalid.local" \
-addext "subjectAltName=DNS:invalid.local"
# 设置权限
sudo chmod 600 /etc/nginx/cert/deny.key
sudo chmod 644 /etc/nginx/cert/deny.pem
# 备份默认配置
sudo mv /etc/nginx/http.d/default.conf /etc/nginx/http.d/default.conf.bak
# 新建默认虚拟主机配置
sudo vim /etc/nginx/http.d/00-default.conf
修改内容如下:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444;
}
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name _;
ssl_certificate /etc/nginx/cert/deny.pem;
ssl_certificate_key /etc/nginx/cert/deny.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
error_page 497 =444 /dev/null;
return 444;
}
如果仅限 Cloudflare CDN 回源,服务端获取真实客户端 IP 地址:
sudo vim /etc/nginx/nginx.conf
在 http 部分加入:
# ...
# ...
http {
# ...
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;
real_ip_header CF-Connecting-IP;
# ...
}
重载 Nginx 配置使生效:
# 验证配置
sudo nginx -t
# 重载 Nginx 配置
sudo nginx -s reload
# 或者重启 Nginx 服务
sudo service nginx reload
sudo apk update && sudo apk add docker docker-cli-compose
可选添加IPv6 支持,daemon.json 内容参考可 Docker IPv6 配置
sudo mkdir -p /etc/docker
# 编辑配置文件
sudo vim /etc/docker/daemon.json
启动 Docker 服务:
sudo rc-update add docker boot
sudo service docker start
# 可选测试 IPv6 出网
sudo docker run --rm curlimages/curl curl -s -I -6 https://blog.zsh.moe
# 创建每周定时任务
sudo tee /etc/periodic/weekly/fstrim <<'EOF'
#!/bin/sh
/sbin/fstrim -v / >> /var/log/fstrim.log 2>&1
EOF
# 赋予可执行权限
sudo chmod +x /etc/periodic/weekly/fstrim
设置系统为 UTC 时区:
sudo setup-timezone -z UTC
# 验证
date
Alpine 默认使用 ntpd 进行时间同步,推荐精度更高、收敛更快的 chrony 服务:
sudo apk add chrony
# 编辑配置
sudo vim /etc/chrony/chrony.conf
示例配置文件:
# default config
#pool pool.ntp.org iburst
server time.cloudflare.com iburst
#initstepslew 10 pool.ntp.org
initstepslew 10 time.cloudflare.com
driftfile /var/lib/chrony/chrony.drift
rtcsync
#cmdport 0
启动 Chony 服务:
# 停止 ntpd 服务
sudo service ntpd stop
sudo rc-update del ntpd default
# 启动 chrony 服务
sudo rc-update add chronyd default
sudo service chronyd start
# 验证时间同步状态
chronyc sources -v
至此,这台 Alpine Linux 服务器已完成所需的基础配置。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。