惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Blog of Author Tim Ferriss
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
K
Kaspersky official blog
L
LINUX DO - 热门话题
P
Proofpoint News Feed
P
Privacy & Cybersecurity Law Blog
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
Cisco Talos Blog
Cisco Talos Blog
AI
AI
L
LINUX DO - 最新话题
H
Heimdal Security Blog
Hacker News: Ask HN
Hacker News: Ask HN
Webroot Blog
Webroot Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The GitHub Blog
The GitHub Blog
I
Intezer
Blog — PlanetScale
Blog — PlanetScale
有赞技术团队
有赞技术团队
S
Securelist
博客园_首页
IT之家
IT之家
Schneier on Security
Schneier on Security
博客园 - 叶小钗
罗磊的独立博客
WordPress大学
WordPress大学
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
MongoDB | Blog
MongoDB | Blog
P
Proofpoint News Feed
阮一峰的网络日志
阮一峰的网络日志
A
Arctic Wolf
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
W
WeLiveSecurity
The Register - Security
The Register - Security
D
DataBreaches.Net
S
Security @ Cisco Blogs
Security Archives - TechRepublic
Security Archives - TechRepublic
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
腾讯CDC
Recorded Future
Recorded Future
NISL@THU
NISL@THU
N
News and Events Feed by Topic
T
Tailwind CSS Blog
N
News and Events Feed by Topic
Cyberwarzone
Cyberwarzone
T
Tor Project blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com

钧言极客

Visual Studio Code 安装开启 中文语言包插件 Linux 安装 MediaInfo:轻松解析视频文件信息 Hugo 实现的短标签 PVE存储合并实践:整合local-lvm到local 组网工具WireGuard入门指南 Debian 安装NVIDLA显卡驱动和CUDA工具包 Linux 管理 UFW 防火墙 Alpine VNC重置密码
Alpine Linux 服务器配置指北
JunYan · 2026-04-27 · via 钧言极客

前言

Alpine Linux 以极致的轻量化和卓越的安全性著称。它选择 musl libcbusybox 作为核心组件,并非偶然,而是为了在最小资源开销下,构建一个安全、纯净、高度可控的运行环境。

受这种极简主义理念的影响,我逐步将大部分服务器环境迁移到 Alpine 之上。随着服务数量的增长,如何从基础系统配置到高效服务部署实现高效管理。

通过自定义上传 ISO 安装 (推荐)

对于追求极致纯净的用户,自定义 ISO 是首选。Alpine Linux 的 VIRTUAL 版镜像针对 KVM 虚拟化进行了深度裁剪与内核优化,能够最大限度减少不必要的驱动负载。

PS:在服务商管理面板 - 上传并挂载镜像 - 通过 VNC 进行安装

一键 DD 重装

不支持挂载自定义 ISO 的服务商,可以使用一键脚本进行安装:

使用以下大佬 DD 脚本:

bin456789/reinstall

leitbogioro/Tools

# 下载脚本
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 分别对应核心仓库与社区仓库。生产环境建议同时启用 maincommunity,以满足大部分软件需求。

如果服务器在国内可以使用国内源:

  • 清华大学镜像源:mirrors.tuna.tsinghua.edu.cn/alpine
  • 华为镜像源: https://mirrors.huaweicloud.com/alpine

配置 stable 源

以下命令将自动指向最新的稳定版 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

配置普通用户和 sudo 权限

在日常运维中,避免直接使用 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

修改 ROOT 密码

# 输入两次需要修改密码
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 算法

# 加载内核 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 加固

将公钥添加至 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

配置 ZRAM 和 Swap

根据个人习惯,可以参考的配置比例:

CPURAMZRAMSwap
1vCPU1GB512MB (50%)2GB
1vCPU4GB2GB (50%)4GB
2vCPU4GB2GB (50%)4GB
4vCPU20GB+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

配置 Nftables 防火墙

# 安装
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

# 安装 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

# 安装 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

安装 Docker

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

SSD 使用 Trism 优化

# 创建每周定时任务
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

NTP 时间同步

设置系统为 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 服务器已完成所需的基础配置。

参考:Dejavu’s Blog