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

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
S
Securelist
J
Java Code Geeks
Recorded Future
Recorded Future
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
M
MIT News - Artificial intelligence
S
Secure Thoughts
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Docker
Martin Fowler
Martin Fowler
The Last Watchdog
The Last Watchdog
WordPress大学
WordPress大学
The GitHub Blog
The GitHub Blog
Vercel News
Vercel News
O
OpenAI News
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园_首页
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
PCI Perspectives
PCI Perspectives
N
News and Events Feed by Topic
H
Heimdal Security Blog
SecWiki News
SecWiki News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园 - 【当耐特】
T
Troy Hunt's Blog
L
LINUX DO - 最新话题
Hacker News: Ask HN
Hacker News: Ask HN
Hacker News - Newest:
Hacker News - Newest: "LLM"
N
Netflix TechBlog - Medium
A
Arctic Wolf
The Hacker News
The Hacker News
I
Intezer
S
Schneier on Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Apple Machine Learning Research
Apple Machine Learning Research
L
Lohrmann on Cybersecurity
宝玉的分享
宝玉的分享
P
Privacy & Cybersecurity Law Blog
Stack Overflow Blog
Stack Overflow Blog
T
Tor Project blog
小众软件
小众软件
Simon Willison's Weblog
Simon Willison's Weblog
The Cloudflare Blog
Jina AI
Jina AI

Dejavu's Blog

甲骨文 ARM 实例部署 Gemma 4 模型 Headscale + Tailscale 组建虚拟专用网 在 Linux 上使用 Yubikey OpenPGP 应用 BuyVM VPS 块存储挂载教程 Alpine Linux 安装 Cloudflared Docker 多容器共享中心数据库 安装 Komari 服务器监控工具 Scaleway VPS 安装 Debian Linux Debian 13 下部署 AsmBB 论坛 使用 Kopia 自动化备份服务器数据 给 Docker 启用 IPv6 支持 Netcup 服务器安装自定义 ISO 镜像 烽火 HG5582A 光猫开启桥接模式 Docker 自托管 Shlink 短链服务 部署 Obsidian LiveSync 实时同步服务指南 我的 2025 年不完全回顾 Linux 下 Intel 核显驱动配置与硬件加速 Fedora Linux 安装配置记录 2025 年优雅地自托管 RSS 服务 Woodpecker CI 和 Gitea 实现 Hugo 自动部署 Gitea/Forgejo 集成 Woodpecker CI/CD 在 Blinko 中使用 Ollama 作为 AI 供应商 Docker 部署 Gitea/Forgejo Plausible CE 启用城市级地理位置识别 Blinko 开源 AI 知识库 Docker 部署指南 Netcup 免税账号注册及购买服务器全记录 Docker 自托管 Cloudreve Pro 私有网盘服务 GiffGaff SIM 卡使用体验和注意事项 简体中文互联网在变得糟糕吗? 如何低成本申请 S/MIME 证书用于个人邮件服务 迁移到 NameCrane Mail 域名邮箱套件服务 香烟与咖啡 在 Windows 中使用 Yubikey 的 OpenPGP 应用 Windows 11 IoT LTSC 养老指南 巧用浏览器生成 HAR 文件批量下载所需网页资源 聊聊静态网站的评论系统 在 Hugo 站点中优雅地展示实况照片 使用 snac 部署一个简洁优雅的 ActivityPub 实例 当 25 岁来临的时候 断网的这两年 从 Bitwarden/Vaultwarden 到 KeePassXC 也许是 Android 上最好的本地播放器 - 椒盐音乐 2023 半年小结 写一个好玩的 Hugo 货币汇率转换短代码 写一个 Hugo 短代码将不同类别的总字数统计转换为书名显示 海信 Touch Lite 墨水屏音乐阅读器的简单体验 从 Debian 11(bullseye) 无感升级到 Debian 12(bookworm) 使用 GitHub Actions 自动提交 URL 到 IndexNow 批量重写 Git 历史提交记录 使用 cgit 托管小小的也很可爱的 Git 服务器 在 Debian 上使用 stagit 和 Nginx 的简单 Git 服务器 托管简单 Git 服务器的一些尝试 使用 stagit 自托管纯静态 Git 存储库 使用 Docker 快速部署单人 Fediverse 实例 我是如何建立自己的个人博客的? 简单、隐私友好的谷歌分析替代品,Plausible 自托管部署指南 服务器使用 Cloudflare CDN 的最佳实践 甲骨文服务器分配并启用 IPv6 地址 Git 版本控制学习笔记(二) Cloudflare WAF 防护策略简易指南 Mastodon 服务器批量导入自定义表情 低成本自托管 Mastodon 实例简明指南 自托管服务指南──有了服务器可以做什么? 使用 Miniflux + RSSHub 打造个人 RSS 阅读器 构建支持多种 CPU 架构的 Docker 镜像 一个可自托管的静态短链接应用 别了,二〇二二! Duplicacy CLI 进阶使用指南 Duplicacy CLI 备份工具的基本使用 初探 Cloudflare 零信任 - 通过 Docker 部署 Bitwarden 密码管理器 Yubikey 转运日志及上手指南 初探 Cloudflare 零信任 — 通过 Cloudflare Tunnel 搭建 SSH 聊天室 初探 Cloudflare 零信任 - 通过 Cloudflare Tunnel 访问服务 某科学的 PGP 算号指南 2022 年的 MacBook Air M1 使用体验及应用推荐 使用 Vercel 和 Supabase 自托管 Cusdis 评论系统 为什么你的搜索引擎不好用? 个人在 Windows 上常用软件清单 macOS 基础开发环境设置指南 在 macOS 上使用 Canokey 的 OpenPGP 应用 提取 Windows UWP 应用商店的安装包以供离线安装 Git 版本控制学习笔记(一) 使用 Notion 管理 GitHub Star 项目 使用 Vercel 免费部署 Giscus 评论系统 将博客评论从 Utterances 无缝迁移到 Giscus Canokey 签名和认证应用指南 Canokey 的基本使用指南 Canokey Pigeon 揽件日志及简单开箱 关于 Google Play 保护机制和 DRM 安全等级的那些事 记录一次捡垃圾装机 GitHub 使用 GPG 密钥提交签名认证 使用 Scoop 管理 Windows 下的软件和开发环境 Windows Terminal+PowerShell 7 打造 Windows 下最好用的终端 一个好用的 Telegram 文件批量上传/下载工具 Clash for Windows 优雅地使用 TUN 模式接管系统流量 全平台搭建 Hexo 静态博客指南 尝试将 Manjaro 作为主力操作系统使用 Hexo 进行 SEO 优化的基本指南 使用本地代理给 Git 和 NPM 加速 使用 flowerss 部署 Telegram RSS 订阅机器人
Alpine Linux 服务器配置指南
Dejavu Moe · 2026-03-17 · via Dejavu's Blog

前言

本文针对 Alpine Linux 整理了一套标准作业程序 (SOP),是 新到手的 Linux 服务器,我这样设置 的姊妹篇。

通过自定义 ISO 安装

若服务商(如 Netcup、BuyVM、BeroHost)支持上传自定义 ISO,建议使用 Alpine Linux VIRTUAL 版 ISO,其针对 KVM 虚拟化进行了精简与优化。

virtual-iso.webp

一键 DD 脚本重装

对于不支持挂载自定义 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 登录新服务器系统,下面开始我们的配置。

修改主机名

hostname <主机名>
# 永久生效
echo "主机名" > /etc/hostname

配置普通用户和 sudo 权限

日常操作中,避免直接使用 root 账户:

# 安装 sudo 软件包
apk add sudo
# 创建用户
adduser dejavu
# 将 dejavu 添加到 wheel 组
addgroup dejavu wheel
# 开启 wheel 组免密 sudo 权限
sed -i 's/# %wheel ALL=(ALL:ALL) NOPASSWD: ALL/%wheel ALL=(ALL:ALL) NOPASSWD: ALL/' /etc/sudoers

安装基础软件包

# 更新并升级系统现有包
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 服务器已完成所需的基础配置。