Chemmy's Blog

chengming0916@outlook.com

概述

CQRS(Command Query Responsibility Segregation)是一种将命令(写操作)和查询(读操作)职责分离的架构模式。通过分离读写模型,实现系统在性能、可扩展性和安全性方面的针对性优化。

核心思想:任何方法可分为两类:

  • 命令(Command):改变系统状态,无返回值
  • 查询(Query):返回数据,不改变系统状态

一、传统CRUD的问题

1.1 主要痛点

问题 说明
粗粒度实体 读写使用同一实体,导致不必要的字段传输
资源竞争 读写混合引发锁竞争,影响吞吐量
性能瓶颈 直接数据库交互在高并发下成为瓶颈
权限复杂 同一实体需处理读写不同权限

1.2 读写频率失衡

  • 多数系统 读 >> 写(如100:1)
  • 传统架构无法针对读/写路径独立优化

二、CQRS核心架构

2.1 基础结构

1
2
3
4
5
6
7
[Command Side]          [Query Side]
│ │
▼ ▼
[Write Database] ←同步/异步→ [Read Database]
│ │
▼ ▼
[Domain Events] → [Event Handlers] → [Reporting DB]

2.2 关键组件

组件 职责
Command Bus 路由命令到对应处理器
Command Handler 执行业务逻辑,产生领域事件
Event Store 持久化领域事件(Event Sourcing)
Event Bus 分发事件到处理器
Read Model 专为查询优化的数据模型

三、适用场景

3.1 推荐使用

  • 复杂业务逻辑:需要清晰分离读写模型
  • 高性能需求:读写负载差异大,需独立扩展
  • 任务驱动UI:基于工作流的用户交互
  • 团队分工:不同团队负责读/写模块
  • 事件溯源集成:需要完整操作历史

3.2 不推荐使用

  • 简单CRUD:业务逻辑简单,增加复杂度得不偿失
  • 全系统滥用:仅特定模块适合CQRS

四、高性能实现策略

4.1 避免资源竞争

单聚合根修改原则

  • 每个Command只修改一个聚合根
  • 多聚合根操作通过Saga模式实现最终一致性

命令排队机制

1
2
3
4
5
graph LR
A[Command] --> B{路由到服务器}
B --> C[内存队列]
C --> D[单线程处理]
D --> E[持久化事件]

4.2 幂等性保障

环节 实现方式
Command CommandId主键约束
Event (AggregateId + Version)联合主键
Event消费 处理记录表 + 先查后处理

4.3 存储优化

  • 分库分表:按聚合根类型+ID哈希拆分
  • Group Commit:批量持久化事件(50-100个/批)
  • In-Memory模式:聚合根常驻内存,异步持久化

五、代码实现示例

5.1 查询侧(Q端)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 简单DTO查询
public ActionResult Index()
{
ViewBag.Model = ServiceLocator.ReportDatabase.GetItems();
return View();
}

public class ReportDatabase : IReportDatabase
{
static List<DiaryItemDto> items = new List<DiaryItemDto>();

public List<DiaryItemDto> GetItems() => items;
public void Add(DiaryItemDto item) => items.Add(item);
}

5.2 命令侧(C端)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Command发送
[HttpPost]
public ActionResult Add(DiaryItemDto item)
{
ServiceLocator.CommandBus.Send(
new CreateItemCommand(Guid.NewGuid(), item.Title, ...)
);
return RedirectToAction("Index");
}

// Command处理
public class CreateItemCommandHandler : ICommandHandler<CreateItemCommand>
{
public void Execute(CreateItemCommand command)
{
var aggregate = new DiaryItem(command.Id, ...);
_repository.Save(aggregate, aggregate.Version);
}
}

// 领域事件应用
public class DiaryItem : AggregateRoot
{
public DiaryItem(Guid id, string title, ...)
{
ApplyChange(new ItemCreatedEvent(id, title, ...));
}

public void Handle(ItemCreatedEvent e)
{
Title = e.Title;
Id = e.AggregateId;
// ...其他属性赋值
}
}

5.3 事件持久化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class InMemoryEventStorage : IEventStorage
{
public void Save(AggregateRoot aggregate)
{
foreach (var @event in aggregate.GetUncommittedChanges())
{
@event.Version = ++version;
_events.Add(@event); // 持久化事件
}

// 发布事件
foreach (var @event in aggregate.GetUncommittedChanges())
{
_eventBus.Publish(@event);
}
}
}

六、CQRS与Event Sourcing

6.1 协同关系

  • CQRS:分离读写模型
  • Event Sourcing:以事件序列作为唯一数据源
  • 组合优势
    • 完整操作审计日志
    • 时间点回溯能力
    • 简化聚合根重建

6.2 数据流

1
2
3
Command → Command Handler → Domain Events → 
→ Event Store(持久化) → Event Handlers →
→ Update Read Models

七、实施建议

7.1 架构选择

方案 特点 适用场景
共享数据库 代码分离,数据一致 中小型系统
独立数据库 读写完全分离 高并发系统

7.2 技术栈

  • 消息队列:EQueue/RabbitMQ/Kafka(确保可靠投递)
  • 存储:关系型DB(MySQL/PostgreSQL)或NoSQL
  • 监控:跟踪Command/Event处理延迟

7.3 运维要点

  • 最终一致性:接受Q端数据延迟(通常<1s)
  • 补偿机制:Saga失败时的回滚策略
  • 版本兼容:事件结构的向后兼容设计

总结

CQRS通过读写分离解决了传统CRUD架构的性能与复杂度问题,特别适合高并发、业务复杂的系统。实施时需权衡复杂度收益,结合Event Sourcing可获得完整的历史追溯能力。关键成功因素包括:严格的单聚合根修改、可靠的幂等处理、以及高效的事件分发机制。

一、 架构概述与设计目标

1.1 设计目标
  • **高可用 (HA)**:通过 Keepalived 实现 NFS 服务的 VIP (Virtual IP) 漂移,当主节点故障时,备用节点自动接管服务,客户端无感知。
  • 数据同步:通过 Rsync + Inotify 实现主备节点间共享数据的实时单向同步,确保备用节点上的数据与主节点一致。
  • 服务监控:Keepalived 监控 NFS 服务进程,异常时尝试重启,重启失败则主动放弃 VIP,触发故障转移。
1.2 核心组件与架构
  • NFS Server (主/备):提供实际的共享存储服务。
  • Keepalived:提供 VIP (172.16.60.244) 并监控 NFS 服务健康状态。
  • Rsync + Inotify:实现主备节点 /data/k8s_storage 目录的数据同步。
  • **客户端 (K8s Nodes)**:通过 VIP 挂载 NFS,不感知后端物理服务器切换。

架构示意图

二、 环境准备

2.1 服务器规划
角色 主机名 IP 地址 备注
NFS Master nfs-master 172.16.60.235 初始 VIP 持有者
NFS Slave nfs-slave 172.16.60.236 备用节点
虚拟 IP (VIP) - 172.16.60.244 供 K8s 集群挂载的地址

技术要求

  • 两台 NFS 节点服务器配置应尽可能一致。
  • 建议为 NFS 共享目录 (/data/k8s_storage) 使用独立的硬盘或分区。
2.2 基础系统配置

在两台节点服务器上执行:

1
2
3
4
5
6
7
# 1. 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 2. 关闭 SELinux (需重启生效)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0

三、 部署 NFS 服务 (主备节点相同操作)

3.1 安装与配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 安装 NFS 软件包
yum install -y nfs-utils rpcbind

# 2. 创建共享目录
mkdir -p /data/k8s_storage

# 3. 配置 NFS 导出 (`/etc/exports`)
# 允许 K8s 节点网段 (172.16.60.0/24) 挂载
echo "/data/k8s_storage 172.16.60.0/24(rw,sync,no_root_squash)" > /etc/exports

# 4. 使配置生效
exportfs -arv

# 5. 启动并设置开机自启
systemctl enable --now rpcbind nfs-server
3.2 验证 NFS 服务
1
2
3
4
5
6
7
8
# 查看本机 NFS 导出列表
showmount -e localhost
# 输出应类似:/data/k8s_storage 172.16.60.0/24

# 在 K8s 节点上测试手动挂载 (可选)
mount -t nfs 172.16.60.235:/data/k8s_storage /mnt
df -h | grep k8s_storage
umount /mnt

四、 配置 Keepalived 实现高可用

核心要点:配置为**非抢占模式 (nopreempt)**,避免 VIP 在节点恢复后频繁来回切换,可能导致数据不一致。

4.1 安装 Keepalived

在两台节点上执行:

1
yum install -y keepalived
4.2 配置 Keepalived (主备差异)
  • Master 节点 (/etc/keepalived/keepalived.conf):
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    ! Configuration File for keepalived
    global_defs {
    router_id nfs_master
    }
    vrrp_script chk_nfs {
    script "/etc/keepalived/nfs_check.sh"
    interval 2
    weight -20
    }
    vrrp_instance VI_1 {
    state BACKUP # 初始状态都设为 BACKUP
    interface eth0
    virtual_router_id 51
    priority 100 # Master 优先级更高
    advert_int 1
    nopreempt # 关键:非抢占模式
    authentication {
    auth_type PASS
    auth_pass 1111
    }
    track_script {
    chk_nfs
    }
    virtual_ipaddress {
    172.16.60.244/24
    }
    }
  • Slave 节点:配置文件与 Master 几乎相同,仅需修改两处:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    global_defs {
    router_id nfs_slave # 修改 router_id
    }
    ...
    vrrp_instance VI_1 {
    ...
    priority 80 # 降低优先级
    ...
    }
4.3 创建 NFS 健康检查脚本

在两台节点上创建 /etc/keepalived/nfs_check.sh

1
2
3
4
5
6
7
8
9
#!/bin/bash
A=`ps -C nfsd --no-header | wc -l`
if [ $A -eq 0 ]; then
systemctl restart nfs-server.service
sleep 2
if [ `ps -C nfsd --no-header | wc -l` -eq 0 ]; then
pkill keepalived # 如果重启失败,杀死 keepalived 触发 VIP 转移
fi
fi

赋予执行权限:chmod +x /etc/keepalived/nfs_check.sh

4.4 启动与验证 Keepalived
1
2
3
4
5
6
7
8
systemctl enable --now keepalived

# 查看 VIP 绑定情况
ip addr show eth0 | grep 172.16.60.244
# 输出类似:inet 172.16.60.244/32 scope global eth0

# 测试 VIP 可连通性
ping -c 3 172.16.60.244

故障转移测试

  1. 在持有 VIP 的 Master 节点上停止 keepalived:systemctl stop keepalived
  2. 观察 VIP 是否漂移到 Slave 节点 (ip addr 命令)。
  3. 注意:由于是非抢占模式,当原 Master 节点恢复后,VIP 不会自动漂回。

五、 配置 Rsync + Inotify 实现数据同步

核心逻辑只有当前持有 VIP 的节点,才启动 inotifywait 监控进程,将数据同步到对端。 避免双向同步导致数据循环和冲突。

5.1 安装软件包

在两台节点上执行:

1
yum install -y rsync inotify-tools
5.2 配置 Rsync 服务端
  • Master 节点 (/etc/rsyncd.conf):
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    uid = root
    gid = root
    use chroot = 0
    port = 873
    hosts allow = 172.16.60.0/24
    max connections = 0
    timeout = 300
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsyncd.lock
    log file = /var/log/rsyncd.log
    log format = %t %a %m %f %b
    transfer logging = yes

    [master_web]
    path = /data/k8s_storage
    comment = master_web
    ignore errors
    read only = no
    list = no
    auth users = rsync
    secrets file = /etc/rsyncd.passwd
  • Slave 节点:配置与 Master 基本相同,仅修改模块名:
    1
    2
    3
    [slave_web]  # 修改此处
    path = /data/k8s_storage
    ...
5.3 配置 Rsync 认证

在两台节点上创建密码文件:

1
2
3
4
5
6
7
# 1. 服务端密码文件 (`/etc/rsyncd.passwd`)
echo "rsync:123456" > /etc/rsyncd.passwd
chmod 600 /etc/rsyncd.passwd

# 2. 客户端密码文件 (`/opt/rsyncd.passwd`,用于同步时认证对端)
echo "123456" > /opt/rsyncd.passwd
chmod 600 /opt/rsyncd.passwd
5.4 启动 Rsync 服务
1
2
systemctl enable --now rsyncd
ss -tlnp | grep 873 # 验证端口监听
5.5 配置自动同步脚本 (核心)

原理:每个节点都运行一个监控脚本 (vip_monitor.sh),定期检查本机是否持有 VIP。如果持有,则启动数据同步进程 (rsync_inotify.sh) 同步到对端;如果不持有,则杀死本机的同步进程。

  1. 创建数据同步脚本 (/opt/rsync_inotify.sh):

    • Master 节点内容 (同步到 Slave):
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      #!/bin/bash
      host=172.16.60.236 # Slave IP
      src=/data/k8s_storage/
      des=slave_web # Slave 的 rsync 模块名
      password=/opt/rsyncd.passwd
      user=rsync
      inotifywait=/usr/bin/inotifywait

      $inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' \
      -e modify,delete,create,attrib $src \
      | while read files; do
      rsync -avzP --delete --timeout=100 --password-file=${password} $src $user@$host::$des
      echo "${files} was rsynced" >> /tmp/rsync.log 2>&1
      done
    • Slave 节点内容 (同步到 Master):只需修改 hostdes 变量为 Master 的信息。
  2. 创建 VIP 监控脚本 (/opt/vip_monitor.sh):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #!/bin/bash
    VIP_NUM=`ip addr | grep 244 | wc -l`
    RSYNC_INOTIRY_NUM=`ps -ef | grep /usr/bin/inotifywait | grep -v grep | wc -l`

    if [ ${VIP_NUM} -ne 0 ]; then
    # 本机持有 VIP
    if [ ${RSYNC_INOTIRY_NUM} -eq 0 ]; then
    # 如果同步进程未启动,则启动它
    nohup sh /opt/rsync_inotify.sh &
    fi
    else
    # 本机不持有 VIP
    if [ ${RSYNC_INOTIRY_NUM} -ne 0 ]; then
    # 如果同步进程正在运行,则杀死它
    pkill -f rsync_inotify.sh
    pkill -f inotifywait
    fi
    fi
  3. 创建持续运行脚本 (/opt/rsync_monit.sh):

    1
    2
    3
    4
    5
    6
    #!/bin/bash
    while [ "1" = "1" ]
    do
    /bin/bash /opt/vip_monitor.sh > /dev/null 2>&1
    sleep 5 # 每5秒检查一次VIP状态
    done
  4. 设置开机自启与启动

    1
    2
    3
    4
    5
    6
    7
    chmod +x /opt/*.sh
    # 将以下内容添加到 /etc/rc.local (并确保 rc.local 有执行权限)
    echo "nohup /bin/bash /opt/rsync_monit.sh &" >> /etc/rc.local
    chmod +x /etc/rc.d/rc.local

    # 立即启动
    nohup /bin/bash /opt/rsync_monit.sh &

六、 最终验证与总结

6.1 功能验证
  1. VIP 漂移与数据同步
    • 在 VIP 当前所在节点 (如 Master) 的 /data/k8s_storage 创建文件。
    • 观察文件是否自动同步到对端节点。
    • 停止当前节点的 keepalived,触发 VIP 漂移。
    • 在新的 VIP 持有节点上创建文件,观察同步是否反向进行。
  2. NFS 服务故障
    • 在 VIP 持有节点上强制停止 NFS 服务 (systemctl stop nfs-server)。
    • 观察 nfs_check.sh 脚本是否会重启 NFS,如果重启失败,VIP 是否漂移。
6.2 部署到 Kubernetes

在 K8s 的 PersistentVolume (PV) 定义中,使用 VIP (172.16.60.244) 作为 NFS 服务器地址。这样,无论后端哪台物理服务器实际提供服务,K8s 集群都能持续访问存储。

6.3 关键注意事项
  • 非抢占模式:是此架构稳定性的关键,避免脑裂和数据不一致。
  • 单向同步:确保同一时刻只有一端向另一端同步数据。
  • 网络与性能:主备节点间网络延迟会影响同步实时性。对于超大规模或IO密集型场景,需评估 rsync 性能是否满足。
  • 数据一致性rsync 不是分布式文件系统,在主备切换瞬间,如果数据未完全同步,可能存在极小时间窗口的数据不一致风险。对于极高一致性要求场景,需考虑更高级的存储方案(如 Ceph/GlusterFS)。
  • 安全:生产环境应使用更复杂的 rsync 密码,并考虑使用 SSH 隧道加密同步流量。

Obsidian Vault AI Assistant

你是Obsidian知识库的专业AI助手,专注于笔记结构化、双向链接补全、摘要生成、技术文档润色、代码注释、知识关联

核心约束

  1. 严格基于本地笔记内容:禁止幻觉、编造不存在的笔记/链接/概念
  2. 回答简洁、结构化:优先用Markdown列表/标题/代码块
  3. 每次操作:先引用原文/上下文 → 给出修改/总结 → 补充双向链接建议
  4. 技术场景:严格遵循C#/Python/Qt/Golang语法规范,代码带注释、符合工程化风格

输出格式

  • 代码:语言 代码块,带注释,符合项目规范
  • 笔记优化:标注修改点,同意修改后再修改原文
  • 问答:先直接回答,再补充相关笔记引用[[xxx]]

写作风格

  • 整体基调:纯技术运维实操风格,内容精炼去冗余,剔除客套话术
  • 行文表达:短句精简,采用运维专业口吻,规避指令类话术
  • 命令格式:操作命令统一收纳于 bash 代码块,支持直接复制运行
  • 收尾要求:结尾凝练总结,不额外延伸、不抒情发散
  • 段落分割:避免使用分割线(---)作为段落分割,段落过渡依靠空行实现

续写规范

  1. 统一沿用原文人称、文风与专业调性
  2. 篇章逻辑自然承接,衔接顺滑不生硬
  3. 单篇内容独立完整、具备专业深度,形成系列联动呼应
  4. 严格匹配原文篇幅体量,维持同系列内容统一规格

一、概述

Squid 是一款开源、高性能、高稳定性的企业级正向代理服务,广泛应用于 Linux 内网流量代理、访问权限管控、流量日志审计、网络访问加速等场景。其核心优势在于精细化 ACL 访问控制、智能流量缓存、完整日志审计、高并发稳定运行,是企业内网网关、机房统一流量出口的主流选型。

本文聚焦生产环境落地需求,提供一套完整、可直接部署的 Squid 解决方案,实现 HTTP/HTTPS + SOCKS5 双协议并行监听,支持内网白名单访问、纯净流量转发、权限安全管控、静态资源缓存加速,全面适配日常运维、业务代理、内网流量统一出口等场景。

二、Squid 核心特性

1. 核心优势

  • 双协议兼容:原生支持 HTTP/HTTPS 正向代理,同时可快速开启 SOCKS5 通用代理协议,适配绝大多数业务与客户端代理需求。

  • 精细化权限管控:内置完善的 ACL 访问控制体系,支持基于 IP 网段、本地地址、账号密码的多层访问校验,权限划分精准可控。

  • 智能缓存加速:支持内存+磁盘双重缓存机制,对静态资源进行持久化缓存,有效降低外网带宽损耗,提升重复资源访问效率。

  • 全量日志审计:完整记录所有代理访问行为与缓存运行日志,便于故障排查、流量分析与企业合规审计。

  • 企业级高可用:具备优秀的高并发处理能力,资源调度均衡,长期运行稳定,适配服务器常态化部署场景。

三、环境准备与安装

1. 适配系统

本文方案兼容 Ubuntu、Debian、CentOS、RockyLinux 等主流 Linux 发行版,适配服务器常规运行环境。

2. 安装命令

Debian/Ubuntu 系列:

Text
1
apt update && apt install -y squid

CentOS/RHEL 系列:

Text
1
yum install -y squid

3. 配置备份(关键操作)

安装完成后默认配置参数繁杂,建议提前备份原始配置文件,便于配置异常时快速恢复:

Text
1
cp /etc/squid/squid.conf /etc/squid/squid.conf.bak

四、生产级完整配置(HTTP+SOCKS5)

1. 清空默认配置

清空系统默认冗余配置,替换为极简、安全、生产适配的全新配置:

Text
1
> /etc/squid/squid.conf

2. 最终配置文件(/etc/squid/squid.conf)

本配置实现 HTTP(3128)、SOCKS5(1080) 双端口监听,默认采用内网白名单机制、优化网络超时参数、开启日志审计、隐藏代理指纹,同时预留缓存开关,支持纯转发/缓存加速双模式切换,完全适配生产环境。

Text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# ====================== 基础服务配置 ======================
# 开启HTTP/HTTPS代理端口
http_port 3128
# 开启SOCKS5代理端口
http_port 1080 socks

# ====================== 缓存服务配置(默认关闭,可按需开启) ======================
# 关闭缓存(纯转发代理,无需缓存)
# cache deny all
# cache_dir null /tmp

# 开启磁盘缓存:目录、容量(MB)、一级子目录、二级子目录
cache_dir ufs /var/spool/squid 2048 16 256
# 内存缓存大小(推荐为物理内存1/8左右,单位MB)
cache_mem 256 MB
# 最大单个缓存文件大小(超过不缓存)
maximum_object_size 50 MB
# 内存中最大缓存对象大小
maximum_object_size_in_memory 4 MB
# 缓存最小文件大小
minimum_object_size 0 KB
# 缓存超时淘汰策略
cache_replacement_policy heap LFUDA
memory_replacement_policy heap LFUDA

# 网络超时优化参数
connect_timeout 30 second
request_timeout 60 second
persistent_request_timeout 60 second

# ====================== ACL访问权限控制 ======================
# 定义本地回环地址
acl local_ip src 127.0.0.1/32
# 定义内网私有网段(适配绝大多数局域网)
acl lan_ip src 192.168.0.0/16
acl lan_ip src 10.0.0.0/8
acl lan_ip src 172.16.0.0/12

# 放行本地及内网可信流量
http_access allow local_ip
http_access allow lan_ip

# 拒绝所有外网陌生IP连接(安全加固核心规则)
http_access deny all

# ====================== 安全隐藏配置 ======================
# 关闭代理溯源头部,隐藏代理转发信息
forwarded_for off
via off
client_dst deny all

# 隐藏Squid版本指纹,规避版本漏洞探测风险
httpd_suppress_version_string on

# ====================== 日志审计配置 ======================
access_log /var/log/squid/access.log combined
cache_log /var/log/squid/cache.log
cache_store_log none
# 日志保留7天自动轮转,避免日志堆积
logfile_rotate 7

# ====================== 性能限制配置 ======================
# 最大并发连接数,防止超高并发压垮服务
max_connections 1024

五、防火墙放行与服务启动

1. 放行代理端口

需在防火墙放行 3128、1080 端口,否则外部设备无法正常连接代理服务:

UFW 防火墙(Ubuntu 默认):

Text
1
2
ufw allow 3128/tcp
ufw allow 1080/tcp

Firewalld 防火墙(CentOS 默认):

Text
1
2
3
firewall-cmd --permanent --add-port=3128/tcp
firewall-cmd --permanent --add-port=1080/tcp
firewall-cmd --reload

2. 启动并设置开机自启

重启服务加载新配置,并配置开机自启,保证服务器重启后代理服务自动运行:

Text
1
2
systemctl restart squid
systemctl enable squid

六、代理功能验证测试

通过 curl 命令分别验证 HTTP、SOCKS5 代理转发功能,确保服务正常工作:

Text
1
2
3
4
5
# 测试HTTP代理 3128端口
curl -x http://127.0.0.1:3128 ip.sb

# 测试SOCKS5代理 1080端口
curl -x socks5://127.0.0.1:1080 ip.sb

命令返回服务器公网 IP 即代表代理部署成功、流量转发正常。

七、进阶配置(实用加固方案)

1. 开放公网访问(谨慎使用)

如需临时对外开放代理访问(仅适用于测试场景,生产环境严禁使用),可修改权限规则:

注释或删除所有内网网段放行规则,替换为全局放行规则:

Text
1
http_access allow all

2. 账号密码认证(安全加固)

为避免代理被恶意扫描蹭网,可开启基础账号密码认证,提升服务安全性。

1)安装密码生成工具:

Text
1
apt install -y apache2-utils

2)创建自定义代理账号密码,并配置文件权限:

Text
1
2
3
htpasswd -bc /etc/squid/passwd proxyuser 123456
chmod 600 /etc/squid/passwd
chown squid:squid /etc/squid/passwd

3)在配置文件末尾添加认证校验规则:

Text
1
2
3
4
5
6
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic realm Squid Proxy Auth
auth_param basic credentialsttl 2 hours
acl passwd_auth proxy_auth REQUIRED
http_access allow passwd_auth

4)重启服务使认证配置生效:systemctl restart squid

认证访问方式:curl \-x http://proxyuser:123456@IP:3128 ip\.sb

八、Squid 缓存开启实战教程

缓存加速是 Squid 区别于轻量化代理工具的核心能力,在企业内网、办公场景、机房业务环境中,可大幅降低外网带宽占用,提升静态资源重复访问速度。本节详细讲解缓存开启配置、目录初始化、功能验证与最佳实践。

1. 缓存配置说明

本文采用内存缓存+磁盘缓存双层架构:内存缓存优先存储高频访问小资源,实现极速响应;磁盘缓存持久化存储大容量静态资源,兼顾加速效果与存储空间利用率。

2. 核心缓存参数详解

  • cache_dir ufs:定义磁盘缓存存储目录、最大容量与子目录分层规则,示例配置最大占用 2GB 磁盘空间。

  • cache_mem:分配系统内存作为缓存空间,专门存放高频热点资源,有效提升响应速度。

  • maximum_object_size:设置单文件最大缓存阈值,超大文件不参与缓存,避免磁盘资源被占用耗尽。

  • LFUDA缓存策略:智能资源淘汰算法,优先保留高频访问资源,自动清理低频、过期缓存,适配企业日常访问场景。

3. 缓存目录初始化(必执行)

首次开启缓存必须初始化缓存目录并授权权限,否则会出现服务启动失败、缓存失效等问题:

Text
1
2
3
4
5
6
# 初始化缓存目录
squid -z

# 授权缓存目录运行权限
chown -R squid:squid /var/spool/squid
chmod -R 755 /var/spool/squid

4. 重启服务生效

Text
1
systemctl restart squid

5. 缓存功能验证

通过访问公共静态资源,结合缓存日志判断缓存是否正常工作:

Text
1
2
3
4
5
# 访问公共静态资源测试
curl -x http://127.0.0.1:3128 https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js

# 实时查看缓存日志
tail -f /var/log/squid/cache.log

日志出现 Successful swapStored 关键字,代表资源已成功写入缓存;二次访问同一资源将直接读取本地缓存,响应速度显著提升。

6. 缓存关闭/切换纯转发模式

若业务为实时动态请求、无需缓存加速,可快速关闭缓存,切换为纯流量转发模式:

Text
1
2
3
# 关闭所有缓存功能
cache deny all
cache_dir null /tmp

7. 缓存最佳实践建议

  • 小内存服务器(2G及以下):cache_mem 配置为 128MB,磁盘缓存设置 1GB,避免缓存占用过高系统资源。

  • 企业生产服务器(4G+):cache_mem 配置 256-512MB,磁盘缓存 2-4GB,满足多设备并发缓存加速需求。

  • 动态接口场景:实时 API、动态接口、时效性请求不建议缓存,可通过 ACL 规则单独禁用动态资源缓存。

九、常见问题排查

  • 代理连接超时:检查服务器防火墙、云服务器安全组是否放行 3128、1080 端口,确认网络连通性正常。

  • 访问被拒绝:客户端 IP 未在配置的内网白名单中,需将对应网段添加至 ACL 放行规则。

  • 配置报错/服务启动失败:执行 squid \-k parse 校验配置文件语法,排查参数书写错误。

  • 服务异常退出:通过 journalctl \-u squid 查看服务运行日志,定位权限、目录、参数异常问题。

十、适用场景总结

  • 企业内网代理出口:统一局域网内所有设备上网出口,集中管控网络访问权限。

  • 机房流量审计:依托完整访问日志,实现全网代理流量记录,满足企业合规审计要求。

  • 局域网访问加速:开启缓存功能,对静态资源进行缓存,降低重复访问带宽消耗。

  • 业务固定出口IP:多台业务设备通过代理统一出口,保障外网访问 IP 固定,适配业务对接需求。

十一、总结

Squid 是 Linux 环境中兼具安全性、稳定性与可运维性的企业级正向代理解决方案,原生支持 HTTP/HTTPS、SOCKS5 双协议转发,依托精细化 ACL 权限控制、双层缓存加速、全量日志审计能力,可完美适配企业机房、办公内网、业务服务器等生产场景。相较于轻量化代理工具,Squid 更侧重流量可控、行为可审、运行稳定,是内网统一流量出口的最优选型。

本文提供的全套部署方案,覆盖安装备份、双协议配置、防火墙放行、服务自启、安全加固、缓存加速、故障排查全流程,支持纯转发与缓存加速两种运行模式,可根据业务场景灵活切换。通过白名单访问控制、账号密码认证、代理指纹隐藏等加固配置,全方位保障代理服务的安全性与稳定性,所有配置均可直接落地生产。

在实际运维工作中,纯转发模式适用于实时性要求高的动态业务请求,保障数据实时同步;缓存模式适用于办公、静态资源访问等场景,有效节省外网带宽、提升访问效率。合理运用 Squid 的管控与缓存能力,可实现内网流量标准化、规范化管理,为企业网络稳定运行提供可靠支撑。

背景与需求

设备清单

  • 移动设备:手机×2(Android/iOS)、笔记本(Windows/macOS)
  • 家庭设备:家庭电脑(Windows)、NAS(群晖/威联通)— 内网 192.168.1.x
  • 办公设备:办公电脑(Windows)— 公司网络
  • 家庭网关:RT-AX86U(梅林 388+)、GL.iNet MT3000(OpenWrt)
  • 云端:云主机(Linux,公网)— 科学上网出口

核心诉求

  • 家庭电脑和 NAS 同内网
  • 手机和笔记本为移动网络
  • 云主机可科学上网,每年可能换服务器厂商(追求价格)
  • 家庭宽带目前没有公网IP

已测试设备

设备 状态
RT-AX56U V2 刷梅林后安装失败(没有U盘插口),弃用
极路由3(HC5861) 刷机成砖(Flash只有16M),废弃
GL.iNet MT3000 采购测试 OpenWrt
RT-AX86U(二手) 采购测试梅林 388+

方案决策

1
2
3
4
5
6
7
8
9
家庭宽带是否有公网IP?

┌───┴───┐
是 否
│ │
▼ ▼
场景A 场景B
RT-AX86U 云主机
作服务端 作服务端

网段规划

1
2
3
10.6.0.0/24   WireGuard 虚拟网段(服务端 .1,客户端 .2-.8)
192.168.1.0/24 家庭内网(家庭电脑 .3、NAS .8)
192.168.2.0/24 公司内网(办公电脑 .7)

注:如公司网段与家庭内网冲突,请自行调整。

场景A:有公网IP — 家庭网关作服务端

检查是否有公网IP

方法一:对比 WAN 口 IP 与公网 IP

  1. 登录路由器 Web 管理界面(192.168.1.1
  2. 进入 外部网络 → 连接状态
  3. 记录 WAN IP 地址(如 100.x.x.x
  4. 打开手机/电脑浏览器访问 https://ip.sbhttps://ifconfig.me
  5. 对比两个 IP:
    • 相同 → 有公网IP
    • 不同(如 10.x.x.x、172.16-31.x.x、192.168.x.x) → 无公网IP(NAT)

方法二:SSH 命令检查

1
2
3
4
5
# 在路由器 SSH 执行
curl -s ifconfig.me

# 或查看 WAN 口 IP
nvram get wan0_ipaddr

方法三:查看路由器 WAN 口 IP 段

常见私网 IP 段(无公网IP):

  • 10.0.0.0 - 10.255.255.255
  • 172.16.0.0 - 172.31.255.255
  • 192.168.0.0 - 192.168.255.255

如果 WAN 口 IP 在上述范围内,说明无公网IP。

方法四:致电运营商

如果以上方法都无法确认,直接拨打运营商客服电话询问:

  • “请问我的宽带是否有公网IP?”
  • 若有,询问能否提供固定 IP(对 DDNS 更友好)

常见情况

WAN 口 IP 公网IP 说明
100.x.x.x 直接公网IP
58.x.x.x 直接公网IP
10.x.x.x 运营商大内网
172.16-31.x.x 运营商大内网
192.168.x.x 路由器 NAT

架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
                    ┌─────────────────────────┐
│ 公网 │
│ <你的公网IP>:51820 │
└───────────┬─────────────┘

┌───────────┴─────────────┐
│ 家庭网关 RT-AX86U │
│ WireGuard (10.6.0.1) │
│ LAN: 192.168.1.0/24 │
└───────────┬─────────────┘

┌───────────┴─────────────┐
│ 家庭电脑 (.3) NAS (.8)│
└───────────────────────────┘

移动网络:手机A (.4) 手机B (.5) 笔记本 (.6)
公司网络:办公电脑 (.7)
云主机(可选):科学上网出口,位于公网

梅林 388+ 配置步骤

前置条件:梅林固件 ≥ 388,已开启 SSH

Web 界面配置

  1. 登录 192.168.1.1
  2. 进入 VPN → WireGuard → 选择 作为服务器
  3. 勾选 启用 WireGuard VPN
  4. 监听端口:51820
  5. 地址:10.6.0.1/24

生成密钥(SSH)

1
2
3
4
ssh admin@192.168.1.1
cd /jffs/configs/wireguard
wg genkey | tee server_private.key | wg pubkey > server_public.key
cat server_public.key

添加客户端 Peer:Web 界面点击 添加 Peer,为每个客户端配置公钥和允许的IP(如 10.6.0.4/32),持久_keepalive 设为 25

命令行完整配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
cat > /jffs/configs/wireguard/wg0.conf << 'EOF'
[Interface]
PrivateKey = <server_private.key内容>
Address = 10.6.0.1/24
ListenPort = 51820
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -A FORWARD -o %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -o %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = <手机A公钥>
AllowedIPs = 10.6.0.4/32

[Peer]
PublicKey = <手机B公钥>
AllowedIPs = 10.6.0.5/32
# 更多 Peer...
EOF

chmod 600 /jffs/configs/wireguard/wg0.conf
wg-quick up /jffs/configs/wireguard/wg0.conf

开机自启

1
2
3
4
5
cat > /jffs/scripts/services-start << 'EOF'
#!/bin/sh
wg-quick up /jffs/configs/wireguard/wg0.conf
EOF
chmod +x /jffs/scripts/services-start

防火墙放行

1
iptables -I INPUT -p udp --dport 51820 -j ACCEPT

场景B:无公网IP — 云服务器作服务端

核心优势

现有网络完全不做改动,路由器保持原样。

  • 不需要改家庭路由器的任何配置
  • 不需要动光猫
  • 不需要申请端口映射
  • 当路由器不支持 WireGuard 时,在内网新增一个节点(工控机、旁路由、树莓派等)来跑 WireGuard

手头有什么用什么,灵活组合。

注意事项

WireGuard 默认端口 51820 容易被封,建议使用非标准端口:

  • 云主机:443、8443、53 等
  • 内网节点:任意可用的 UDP 端口

架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
                        ┌─────────────────────────┐
│ 公网 │
│ <云服务器公网IP>:51820 │
│ 云主机 │
│ WireGuard (10.6.0.1) │
│ 科学上网出口 │
└───────────┬─────────────┘

┌───────────┴─────────────┐
│ 家庭网络(无公网IP) │
│ RT-AX86U 客户端 (.2) │
│ LAN: 192.168.1.0/24 │
│ 家庭电脑 (.3) NAS (.8)│
└───────────────────────────┘

移动网络:手机A (.4) 手机B (.5) 笔记本 (.6)
公司网络:办公电脑 (.7)

云主机配置

安装 WireGuard

1
2
3
4
apt update && apt install -y wireguard
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
ufw allow 51820/udp

生成密钥

1
2
3
4
5
6
cd /etc/wireguard
wg genkey | tee server_private.key | wg pubkey > server_public.key

for i in {1..6}; do
wg genkey | tee client${i}_private.key | wg pubkey > client${i}_public.key
done

服务端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
cat > /etc/wireguard/wg0.conf << 'EOF'
[Interface]
PrivateKey = <server_private.key内容>
Address = 10.6.0.1/24
ListenPort = 51820
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -A FORWARD -o wg0 -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostUp = ip route add 192.168.1.0/24 via 10.6.0.2

PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -D FORWARD -o wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PostDown = ip route del 192.168.1.0/24 via 10.6.0.2

[Peer]
PublicKey = <RT-AX86U公钥>
AllowedIPs = 10.6.0.2/32, 192.168.1.0/24
PersistentKeepalive = 25

[Peer]
PublicKey = <办公电脑公钥>
AllowedIPs = 10.6.0.3/32
PersistentKeepalive = 25

# 手机A/B/笔记本...
EOF

systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0

梅林作为客户端

Web 界面

  1. VPN → WireGuard → 选择 作为客户端
  2. 服务器地址:<云主机IP>
  3. 服务器端口:51820
  4. 接口私钥:RT-AX86U 的客户端私钥
  5. 服务器公钥:云主机服务端公钥
  6. 地址:10.6.0.2/24
  7. AllowedIPs:0.0.0.0/0(全流量)或 10.6.0.0/24, 192.168.1.0/24(仅家庭流量)

SSH 命令行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mkdir -p /jffs/configs/wireguard
cd /jffs/configs/wireguard

wg genkey | tee client_private.key | wg pubkey > client_public.key
cat client_public.key

cat > wg0.conf << 'EOF'
[Interface]
PrivateKey = <client_private.key内容>
Address = 10.6.0.2/24
DNS = 223.5.5.5

[Peer]
PublicKey = <云主机服务端公钥>
Endpoint = <云主机IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
EOF

chmod 600 wg0.conf
wg-quick up wg0.conf

cat > /jffs/scripts/services-start << 'EOF'
#!/bin/sh
wg-quick up /jffs/configs/wireguard/wg0.conf
EOF
chmod +x /jffs/scripts/services-start

OpenWrt 配置

MT3000 作为客户端

LuCI Web 界面VPN → WireGuard → 添加新接口 wg0,配置私钥、IP 10.6.0.3/24,Peer 配置服务端公钥、端点、允许的IP 0.0.0.0/0

命令行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
ssh root@192.168.8.1

cd /etc/wireguard
wg genkey | tee private.key | wg pubkey > public.key

cat > /etc/config/network << 'EOF'
config interface 'wg0'
option proto 'wireguard'
option private_key '<MT3000私钥>'
list addresses '10.6.0.3/24'

config wireguard_wg0 'wgclient'
option public_key '<服务端公钥>'
option endpoint_host '<服务端IP>'
option endpoint_port '51820'
option route_allowed_ips '1'
option persistent_keepalive '25'
list allowed_ips '0.0.0.0/0'
EOF

uci add firewall rule
uci set firewall.@rule[-1].name='Allow-WireGuard'
uci set firewall.@rule[-1].src='wan'
uci set firewall.@rule[-1].dest_port='51820'
uci set firewall.@rule[-1].proto='udp'
uci set firewall.@rule[-1].target='ACCEPT'
uci commit firewall

/etc/init.d/network restart

Windows 客户端配置

下载:https://www.wireguard.com/install/

配置文件

1
2
3
4
5
6
7
8
9
10
[Interface]
PrivateKey = <客户端私钥>
Address = 10.6.0.4/24
DNS = 223.5.5.5

[Peer]
PublicKey = <服务端公钥>
Endpoint = <服务端地址>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

分流配置(仅访问家庭内网)

1
AllowedIPs = 10.6.0.0/24, 192.168.1.0/24

Tailscale 备用方案

梅林安装

Web 界面:体质管理 → 应用中心 → 安装 Tailscale

命令行:

1
2
3
4
ssh admin@192.168.1.1
tailscaled &
tailscale up --accept-dns=false
tailscale up --advertise-routes=192.168.1.0/24 --accept-dns=false

控制台放行路由:登录 https://login.tailscale.com/admin/machines ,找到 RT-AX86U → Edit route settings → 启用 192.168.1.0/24Approve

OpenWrt 安装

1
2
3
4
opkg update
opkg install tailscale
tailscaled &
tailscale up --advertise-routes=192.168.1.0/24 --accept-dns=false

常用命令

1
2
3
4
5
tailscale status    # 查看所有设备
tailscale ip # 查看本机虚拟IP
tailscale netcheck # 检测网络质量
tailscale up # 重新入网
tailscale down # 断开

方案对比

场景A(家庭网关) 场景B(云服务器)
公网IP 需要 不需要
延迟 中(经过云主机)
端口映射 需要 不需要
成本 无额外费用 需要云服务器费
科学上网 需额外配置 云主机作为出口

故障排查

连接问题

  • 服务端:wg show 检查是否运行
  • 客户端:检查防火墙 UDP 51820 是否开放
  • 内网访问:检查服务端 AllowedIPs 是否包含内网段

梅林排查

1
2
3
4
5
wg show
ip addr show
ip route show
iptables -L -n -v | grep wg0
logread | grep -i wireguard

OpenWrt 排查

1
2
3
/etc/init.d/network restart
wg show
iptables -t nat -L -n -v

云主机更换流程

每年换厂商时,客户端只需更新 [Peer] 中的 Endpoint

1
2
3
4
5
[Peer]
PublicKey = <服务端公钥>
Endpoint = <新服务器IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Peer 公钥保持不变。

实施路径

场景A(有公网IP)

  1. 检查公网IP:curl -s ifconfig.me
  2. 配置梅林 DDNS(如需要)
  3. 启用 WireGuard 服务端
  4. 添加所有客户端 Peer
  5. 各设备安装 WireGuard 客户端连接

场景B(无公网IP)

  1. 购买云服务器,部署 WireGuard 服务端
  2. RT-AX86U 部署 WireGuard 客户端
  3. 各设备安装 WireGuard 客户端
  4. (可选)配置云服务器科学上网

云服务器推荐

按需选择,注意线路质量(CN2/BGP 对 WireGuard 性能影响较大)

Ubuntu Snap 影响范围

一、Snap 影响软件范围

Ubuntu 19.10 及以上版本默认将部分桌面应用迁移至 Snap 分发,官方 APT 源内多款软件为 Snap 占位包,安装后会默认部署 Snap 版本而非原生 DEB 程序。

受影响的常用系统及桌面软件如下:

  • 浏览器:Firefox、Chromium

  • 办公系统工具:LibreOffice、GNOME 文本编辑器、计算器、系统监视器

  • 多媒体工具:VLC

  • 开发工具:VS Code

系统默认常驻 snapd 后台服务,占用内存、磁盘资源,增加系统开机启动耗时。

查询系统已安装所有 Snap 应用:

1
snap list

二、Snap 对 APT 与 DEB 包的影响

2.1 无冲突场景

系统底层组件、内核、硬件驱动、服务端程序(Nginx、MySQL)、基础命令行工具(Git、Vim)均基于 DEB 分发,APT 核心依赖管理、安装更新逻辑不受 Snap 影响。手动下载的独立 DEB 包、第三方 PPA 软件可通过 aptdpkg 正常安装运行,与 Snap 体系相互独立、互不干扰。

2.2 干扰兼容场景

Ubuntu 官方源内的 Firefox、Chromium 等软件仅为空占位 DEB 包。通过 APT 执行安装命令时,系统会自动触发 Snap 部署流程,无法安装原生 DEB 版本。

2.3 底层运行逻辑

APT 仅负责 DEB 格式软件的依赖解析、安装与管理,不兼容、不接管 Snap 程序。Snap 由独立的 snapd 服务全权管控,二者为系统并行运行的两套包管理体系。

三、Ubuntu 一键彻底禁用 Snap 脚本

3.1 脚本核心能力

停止并锁定 snapd 服务、卸载系统全部 Snap 应用、彻底清理 snapd 组件、锁定禁止系统自动重装、配置 APT 规则屏蔽 Snap 占位包,强制系统优先使用原生 DEB 分发机制。

3.2 完整禁用脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash
set -e

# 停止、禁用并锁定 snapd 相关服务
sudo systemctl stop snapd || true
sudo systemctl disable --now snapd.socket snapd.service snapd.seeded.service || true
sudo systemctl mask snapd || true

# 批量卸载系统所有已安装 snap 应用
sudo snap list | awk 'NR>1 {print $1}' | xargs -I {} sudo snap remove {} || true

# 彻底卸载 snapd 主程序
sudo apt purge -y snapd || true

# 锁定 snapd,防止系统自动更新重装
sudo apt-mark hold snapd || true

# 配置APT规则,屏蔽浏览器类Snap占位包
sudo tee /etc/apt/preferences.d/nosnap <<EOF
Package: firefox chromium-browser chromium
Pin: release a=*
Pin-Priority: -10
EOF

# 优化APT依赖推荐策略,减少冗余安装
sudo tee /etc/apt/apt.conf.d/20nosnap <<EOF
APT::AutoRemove::RecommendsImportant "false";
APT::AutoRemove::SuggestsImportant "false";
EOF

# 清理系统残留依赖与缓存
sudo apt autoremove -y
sudo apt clean

3.3 脚本执行方式

1
2
chmod +x disable-snap.sh
sudo ./disable-snap.sh

3.4 执行效果

Snap 命令完全失效,系统无法部署运行 Snap 应用;APT 安装浏览器不再跳转 Snap 版本;系统升级、更新流程不会自动重装 snapd 服务,彻底固化 DEB 包管理模式。

四、安装原生 DEB 版 Firefox

禁用 Snap 后,Ubuntu 官方源无原生 DEB 版 Firefox,可通过 Mozilla 官方 PPA 安装正版原生 DEB 版本:

1
2
3
sudo add-apt-repository ppa:mozillateam/ppa
sudo apt update
sudo apt install firefox

五、Snap 环境恢复方案

如需恢复系统默认 Snap 运行环境,执行以下命令解除锁定、恢复配置并重装服务:

1
2
3
4
5
6
sudo apt-mark unhold snapd
sudo rm /etc/apt/preferences.d/nosnap
sudo rm /etc/apt/apt.conf.d/20nosnap
sudo apt install snapd
sudo systemctl unmask snapd
sudo systemctl enable --now snapd

六、总结

Snap 仅作用于 Ubuntu 默认桌面应用,不会破坏系统底层及 APT、DEB 核心运行机制。通过专属脚本可彻底关停 Snap 整套体系,屏蔽 APT 占位包跳转逻辑,全程保留原生 DEB 包管理模式,适配 Ubuntu 20.04、22.04、24.04 主流版本,适用于生产环境运维标准化部署。

一、生成私钥和证书请求

1
openssl req -new -newkey rsa:2048 -nodes -keyout private.key -out request.csr
参数 说明
private.key 生成的私钥文件
request.csr 证书签名请求文件

执行命令时会提示输入国家代码、省份、组织名称等信息。

二、签发证书

使用自签名方式签发:

1
openssl x509 -req -days 365 -in request.csr -signkey private.key -out certificate.crt
参数 说明
certificate.crt 生成的自签名证书
-days 365 证书有效期 365 天

若使用第三方 CA 签发,将 request.csr 提交给 CA 机构即可。

三、打包为 PFX 文件

1
openssl pkcs12 -export -out certificate.pfx -inkey private.key -in certificate.crt
参数 说明
certificate.pfx 生成的 PFX 文件

执行时会提示设置导出密码,用于保护 PFX 文件。

四、验证 PFX 文件

1
openssl pkcs12 -info -in certificate.pfx

输入导出密码后,可查看 PFX 文件中的证书链和私钥信息。

五、包含证书链

如需包含中间证书或根证书:

1
openssl pkcs12 -export -out certificate.pfx -inkey private.key -in certificate.crt -certfile ca_bundle.crt

六、注意事项

  • 私钥文件务必妥善保管,切勿泄露
  • 生产环境建议使用受信任 CA 签发的证书
  • OpenSSL 安装参考:https://www.openssl.org/

在日常运维或开发工作中,频繁通过SSH登录多台Linux服务器时,反复输入IP、用户名和密码会极大降低效率。本文将详细介绍SSH免密登录的完整配置流程,以及多服务器别名优化方案,适配主流Linux发行版(包括Ubuntu、CentOS、Debian等),帮助大家实现“一键登录”,提升操作便捷性,同时兼顾安全性。

一、前置准备

在开始配置前,请确认以下条件已满足,避免后续踩坑:

  • 本地客户端:需为Linux、macOS或Windows Subsystem for Linux(WSL),自带SSH客户端(大部分系统默认预装);

  • 目标服务器:主流Linux发行版(Ubuntu、CentOS、Debian等),已安装并启动openssh-server(不同发行版安装命令略有差异:Ubuntu/Debian执行sudo apt install openssh\-server,CentOS执行sudo yum install openssh\-server;启动命令通用:sudo systemctl start sshsudo systemctl start sshd);

  • 基础信息:掌握每台服务器的「用户名」「IP地址/域名」「登录密码」,若服务器修改过SSH端口,需记录对应端口号。

二、单服务器SSH免密登录配置(基础步骤)

SSH免密登录的核心原理是「密钥对验证」:本地生成一对密钥(私钥+公钥),将公钥上传至服务器,后续登录时,服务器通过公钥验证本地私钥的合法性,无需输入密码即可完成登录。该流程适用于所有支持SSH的Linux发行版,操作一致。

2.1 本地客户端生成密钥对

推荐使用ed25519算法生成密钥(比传统RSA算法更安全、高效),操作如下:

1
2
# 生成ed25519密钥对,一路回车即可(无需设置passphrase,留空才是真正免密)
ssh-keygen -t ed25519

执行完成后,密钥对会默认保存到本地\~/\.ssh/目录下:

  • 私钥:\~/\.ssh/id\_ed25519(核心文件,请勿泄露、删除或修改权限);

  • 公钥:\~/\.ssh/id\_ed25519\.pub(需上传至目标服务器)。

注意:若提示“ssh-keygen: command not found”,说明本地未安装SSH客户端,Linux/macOS可通过系统包管理器安装(Ubuntu/Debian执行sudo apt install openssh\-client,CentOS执行sudo yum install openssh\-clients)。

2.2 将公钥上传至Linux服务器

提供两种上传方法,优先推荐自动上传法(一键搞定,避免手动配置权限出错),自动失败时再用手动上传法,适用于所有Linux发行版。

方法A:自动上传(推荐)

使用ssh\-copy\-id命令,自动将本地公钥上传至服务器,并完成\.ssh目录、authorized\_keys文件的创建和权限配置:

1
2
3
4
5
# 格式:ssh-copy-id 服务器用户名@服务器IP
# 示例:服务器用户为ubuntu(Ubuntu系统)或root(CentOS系统),IP为192.168.1.100
ssh-copy-id ubuntu@192.168.1.100
# 或
ssh-copy-id root@192.168.1.100

执行后,输入一次服务器登录密码,系统会自动完成后续操作,无需额外干预。

方法B:手动上传(自动失败时使用)

若服务器禁用了ssh\-copy\-id相关功能,可通过以下两步手动上传公钥,重点注意权限配置(SSH对权限要求极严格,权限错误会导致免密失败),操作适用于所有Linux发行版:

1
2
3
4
5
# 第一步:登录服务器,创建.ssh目录并设置权限(700,仅当前用户可读写执行)
ssh 服务器用户名@服务器IP "mkdir -p ~/.ssh && chmod 700 ~/.ssh"

# 第二步:将本地公钥追加到服务器的authorized_keys文件,并设置权限(600,仅当前用户可读写)
cat ~/.ssh/id_ed25519.pub | ssh 服务器用户名@服务器IP "cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

执行过程中需输入一次服务器密码,完成后公钥即上传成功。

2.3 测试免密登录

上传公钥后,在本地终端执行以下命令,若无需输入密码直接进入服务器终端,说明免密登录配置成功,该操作适用于所有Linux发行版:

1
2
3
4
# 格式:ssh 服务器用户名@服务器IP
ssh ubuntu@192.168.1.100
# 或
ssh root@192.168.1.100

2.4 常见问题:免密登录失败(权限问题)

SSH免密登录失败,80%以上是权限配置错误导致,服务器端需保证以下权限(若失败,在服务器上执行修复命令),适用于所有Linux发行版:

  • 服务器\~/\.ssh目录权限:必须为700(chmod 700 \~/\.ssh);

  • 服务器\~/\.ssh/authorized\_keys文件权限:必须为600(chmod 600 \~/\.ssh/authorized\_keys);

  • 服务器用户家目录(\~)权限:不能过于宽松(默认权限一般为755,无需修改)。

2.5 可选优化:禁用密码登录(提升安全性)

若确认免密登录稳定可用,可禁用服务器的密码登录功能,避免暴力破解风险,操作如下(谨慎操作,若密钥丢失会无法登录),适用于所有Linux发行版:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. 编辑SSH配置文件(不同发行版路径一致)
sudo nano /etc/ssh/sshd_config

# 2. 找到并修改以下3项(若没有则添加)
PubkeyAuthentication yes # 启用公钥验证
PasswordAuthentication no # 关闭密码登录
ChallengeResponseAuthentication no # 关闭挑战响应验证

# 3. 重启SSH服务,使配置生效(不同发行版命令略有差异)
# Ubuntu/Debian
sudo systemctl restart ssh
# CentOS
sudo systemctl restart sshd

三、多服务器免密+别名一键登录配置(核心优化)

若需要管理多台Linux服务器(无论何种发行版),每次输入ssh 用户名@IP仍显繁琐。通过配置SSH别名,可实现“ssh 别名”一键登录,大幅提升效率,该配置仅在本地客户端操作,与服务器发行版无关。

3.1 前提:完成所有服务器的免密基础配置

先将本地公钥分发到每台需要管理的服务器(重复2.2步骤),示例如下(3台不同发行版服务器):

1
2
3
4
5
6
7
8
# 服务器1:Ubuntu系统,用户root,IP192.168.1.10
ssh-copy-id root@192.168.1.10

# 服务器2:CentOS系统,用户root,IP192.168.1.11
ssh-copy-id root@192.168.1.11

# 服务器3:Debian系统,用户debian,IP192.168.1.12
ssh-copy-id debian@192.168.1.12

3.2 编辑本地SSH配置文件,设置别名

本地SSH配置文件为\~/\.ssh/config(若不存在,直接创建即可),通过编辑该文件,为每台服务器设置别名和对应配置,与服务器发行版无关:

1
2
# 编辑配置文件(使用nano编辑器,新手友好)
nano ~/.ssh/config

粘贴以下模板,按自己的服务器信息修改(别名、IP、用户名、端口按需调整):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 全局配置(所有服务器生效,可选,推荐添加)
Host *
ServerAliveInterval 30 # 每30秒发送一次心跳,防止SSH空闲断开
ServerAliveCountMax 3 # 心跳失败3次后断开连接
StrictHostKeyChecking no # 自动信任主机指纹,避免首次登录提示确认

# 服务器1:别名s1(Ubuntu系统,可自定义,如web、db等)
Host s1
HostName 192.168.1.10 # 服务器IP/域名
User root # 服务器登录用户名
Port 22 # SSH端口(默认22,修改过则替换)
IdentityFile ~/.ssh/id_ed25519 # 本地私钥路径(默认无需修改)

# 服务器2:别名s2(CentOS系统)
Host s2
HostName 192.168.1.11
User root
Port 22
IdentityFile ~/.ssh/id_ed25519

# 服务器3:别名s3(Debian系统,不同用户名示例)
Host s3
HostName 192.168.1.12
User debian
Port 22
IdentityFile ~/.ssh/id_ed25519

保存退出:按Ctrl\+O,回车确认保存,再按Ctrl\+X退出编辑器。

3.3 配置文件权限修复

SSH配置文件config的权限也需严格控制,否则会导致配置失效,本地执行以下命令修复:

1
2
chmod 600 ~/.ssh/config  # 仅当前用户可读写
chmod 700 ~/.ssh # 仅当前用户可读写执行

3.4 一键登录使用方法

配置完成后,无需输入复杂的IP和用户名,直接输入别名即可免密登录对应服务器,无论服务器是何种Linux发行版:

1
2
3
4
5
6
7
8
# 登录服务器1(别名s1,Ubuntu系统)
ssh s1

# 登录服务器2(别名s2,CentOS系统)
ssh s2

# 登录服务器3(别名s3,Debian系统)
ssh s3

四、扩展配置(适配特殊场景)

4.1 自定义SSH端口的服务器配置

若部分服务器修改了SSH端口(如2222),只需在对应别名配置中修改Port参数即可,适用于所有Linux发行版:

1
2
3
4
5
6
# 服务器4:别名s4,SSH端口2222(任意Linux发行版)
Host s4
HostName 192.168.1.13
User root
Port 2222
IdentityFile ~/.ssh/id_ed25519

4.2 后续新增服务器

新增服务器时,无论其为哪种Linux发行版,无需重新生成密钥对,只需两步即可加入别名管理:

  1. 分发公钥:ssh\-copy\-id 服务器用户名@服务器IP(输入一次密码);

  2. 添加别名:编辑\~/\.ssh/config,新增一段Host配置,填写别名、IP、用户名等信息。

五、总结

本文详细介绍了SSH免密登录的完整流程,以及多服务器别名配置方法,适配所有主流Linux发行版(Ubuntu、CentOS、Debian等),核心要点如下:

  • 免密登录核心:本地生成ed25519密钥对,将公钥上传至服务器,严格控制权限,操作适用于所有支持SSH的Linux发行版;

  • 多服务器优化:通过\~/\.ssh/config配置别名,实现一键登录,配置仅在本地操作,与服务器发行版无关,大幅提升运维效率;

  • 安全性提升:配置完成后可禁用密码登录,避免暴力破解风险,不同发行版仅重启SSH服务命令略有差异。

配置完成后,后续登录多台不同发行版的Linux服务器只需输入简单别名,彻底摆脱重复输入IP、密码的繁琐操作,适合日常运维、开发调试等场景。

在家庭组网与远程访问场景中,WireGuard凭借轻量、高效、安全的特性,成为VPN组网的首选方案。本文结合家用核心需求——稳定访问内网NAS/家庭电脑、云服务器可自由替换(哪家便宜用哪家),设计一套以家庭软路由为核心的WireGuard组网方案,配置简单可落地,兼顾访问稳定性与云服务器灵活性。

方案核心目标:以家庭软路由为WireGuard服务端,构建稳定的家庭组网,云服务器仅作为普通客户端提供代理服务,可随时替换厂商、重建机器,不影响整体组网,实现内网低延迟访问与云服务灵活选用。

一、方案核心设计理念

本次方案的核心是“解耦”与“便捷”,将家庭内网组网与云服务器角色彻底分离,确保组网稳定且维护成本低,具体设计理念如下:

  • 固定家庭组网根基:以家庭软路由作为WireGuard服务端,家庭内网、NAS、家庭电脑IP永久固定,一次配置终身不动,避免频繁调整。

  • 云服务器自由化:所有云服务器(不限厂商,阿里云、腾讯云等均可)均作为WireGuard普通客户端,仅负责代理服务,换云机时无需改动家庭路由、终端任何配置,仅需重新部署客户端接入即可。

  • 统一网段规划:固定内网与虚拟网段,终端配置永久不变,换云机或切换场景时无需修改IP,操作便捷。

二、统一网段规划(终身不变,便于维护)

网段规划是组网稳定的核心,提前固定IP段,避免后期调整导致的配置混乱,贴合家用场景、易记无冲突,具体规划如下:

设备/网段类型 IP地址/网段 说明
家庭物理内网 192.168.123.0/24 固定家庭内网网段,包含所有内网设备
家庭路由器(网关) 192.168.123.1 家庭内网网关,同时作为WireGuard服务端
家庭电脑 192.168.123.2 固定内网IP,便于远程访问
NAS存储设备 192.168.123.200 NAS设备固定IP段,避免IP变动导致访问失败
WireGuard虚拟网段 10.100.100.0/24 虚拟隧道网段,确保组网无冲突
WireGuard服务端(路由) 10.100.100.1 路由作为WireGuard服务端的虚拟IP
云服务器(WG客户端) 10.100.100.2 所有云机统一分配此虚拟IP,代理服务监听该IP
终端设备(手机/办公电脑/笔记本) 10.100.100.3~5 每台终端固定虚拟IP,无需频繁改动

三、详细配置(可直接复制部署)

本方案配置围绕“简单可落地”设计,无需复杂命令,适合家用用户与入门级技术爱好者,全程确保内网访问低延迟、云服务器可自由替换。

1. 适用场景

家庭宽带拥有公网IP(或可通过DDNS解析)、运营商未封锁WireGuard默认端口(51820),适合日常远程访问内网、搭配云服务器使用代理服务的场景。

2. 组网拓扑

text
1
2
3
4
5
6
终端设备(手机/办公电脑/笔记本)
↓ WireGuard公网隧道(直连家庭路由)
家庭软路由(WG Server:10.100.100.1 / 内网网关:192.168.123.1)
├─ 家庭内网(192.168.123.0/24)→ 家庭电脑(192.168.123.2)、NAS(192.168.123.200+)
↓ WireGuard客户端接入
任意云服务器(WG Client:10.100.100.2,仅提供代理服务)

3. 核心配置

重点:路由开启IP转发与流量放行,云服务器仅作为普通客户端接入,终端配置永久固定,换云机时无需改动路由与终端设置。

(1)家庭软路由(WG服务端)配置

以主流家用软路由系统(ImmortalWrt/iStoreOS/OpenWrt)为例,配置文件(/etc/wireguard/wg0.conf)如下,可直接复制替换密钥:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[Interface]
PrivateKey = 家庭路由WG私钥(自行生成)
Address = 10.100.100.1/24
ListenPort = 51820
# 开启IP转发,允许虚拟网段访问家庭内网(核心配置,不可省略)
PostUp = iptables -A FORWARD -s 10.100.100.0/24 -d 192.168.123.0/24 -j ACCEPT
PostDown = iptables -D FORWARD -s 10.100.100.0/24 -d 192.168.123.0/24 -j ACCEPT

# 客户端:云服务器(可随时新增/删除,换云机仅改公钥)
[Peer]
PublicKey = 云服务器WG公钥
AllowedIPs = 10.100.100.2/32

# 客户端:办公电脑
[Peer]
PublicKey = 办公电脑WG公钥
AllowedIPs = 10.100.100.3/32

# 客户端:手机
[Peer]
PublicKey = 手机WG公钥
AllowedIPs = 10.100.100.4/32

# 客户端:笔记本
[Peer]
PublicKey = 笔记本WG公钥
AllowedIPs = 10.100.100.5/32

(2)云服务器(WG客户端)配置

云服务器无需复杂配置,仅作为客户端接入家庭路由,配置文件如下,替换密钥与路由公网IP/DDNS即可,换云机时直接复用此模板:

1
2
3
4
5
6
7
8
9
[Interface]
PrivateKey = 云服务器WG私钥
Address = 10.100.100.2/32

[Peer]
PublicKey = 家庭路由WG公钥
Endpoint = 家庭路由公网IP:51820 或 DDNS域名:51820
AllowedIPs = 10.100.100.0/24,192.168.123.0/24
PersistentKeepalive = 25

说明:云服务器部署完成后,仅需在其上搭建代理服务(如V2Ray、Clash等),监听虚拟IP 10.100.100.2,终端切换代理即可使用。换云机时,仅需在新云机上部署此配置与代理服务,删除旧云机的WG Peer配置,其他设备无需任何改动。

(3)终端设备(手机/电脑)配置

所有终端配置永久固定,无需随云机替换而改动,配置文件如下,手机、笔记本仅需替换对应虚拟IP即可:

1
2
3
4
5
6
7
8
9
[Interface]
PrivateKey = 终端WG私钥
Address = 10.100.100.3/32(办公电脑,手机/笔记本替换对应IP)

[Peer]
PublicKey = 家庭路由WG公钥
Endpoint = 家庭路由公网IP:51820 或 DDNS域名:51820
AllowedIPs = 10.100.100.0/24,192.168.123.0/24
PersistentKeepalive = 25

4. 访问逻辑与实操要点

  • 远程访问内网:终端连入WG后,直接用内网IP访问(如ping 192.168.123.2、访问NAS地址192.168.123.200),无需云服务器中转,延迟最低。

  • 代理使用:终端手动切换代理至云服务器虚拟IP(10.100.100.2),流量通过云服务器代理,内网流量与代理流量分离,互不冲突。

  • 云机替换流程:① 新云机部署WG客户端配置(复用模板,替换密钥);② 新云机搭建代理服务,监听10.100.100.2;③ 家庭路由添加新云机Peer配置,删除旧云机Peer;④ 终端代理切换至新云机(IP不变),全程无需改动终端与路由核心配置。

四、软路由系统与硬件选型

方案的稳定运行依赖软路由对WireGuard的良好支持,按“易用性+稳定性”排序,推荐以下系统与硬件,适合家用场景:

1. 软路由系统推荐

  • 首选(零门槛):ImmortalWrt、iStoreOS,均为中文界面,预集成WireGuard,一键安装,开箱即用,适合新手。

  • 次选(可定制):OpenWrt官方原版、Padavan(老毛子),适合喜欢折腾、有自定义需求或使用老路由的用户。

  • 进阶(专业级):OPNsense、RouterOS(ROS),稳定性强、性能高,适合有进阶需求的用户,新手不推荐。

2. 硬件建议

  • x86架构(N100/J4125):性能强劲,适合千兆及以上宽带,可同时运行WG与代理服务,升级无压力。

  • ARM架构(RK3568/MT7621):性价比高、功耗低,适合百兆/千兆宽带,满足日常组网需求。

五、方案优势与实操建议

1. 核心优势

  • 云机灵活替换:不绑定组网中枢,可灵活选择云服务器厂商,切换过程丝滑顺畅,无需担心云厂商变动影响组网,大幅降低使用成本。

  • 访问稳定低延迟:内网直连无中转,远程访问NAS、家庭电脑体验与本地一致。

  • 配置简单易维护:一次部署终身可用,换云机、升级设备无需频繁调整配置。

  • 安全性更强:云服务器仅作为WireGuard客户端接入家庭组网,无需放通防火墙端口,减少端口暴露带来的安全风险,提升整体组网安全性。

2. 实操建议

  • 优先完成软路由配置,测试内网访问与云服务器接入,确保日常使用稳定。

  • 备份所有配置文件,避免换设备或重装系统后重新配置。

  • 访问异常时,优先检查IP转发、AllowedIPs配置、51820端口放行情况。

六、总结

本文介绍的家用WireGuard组网方案,以家庭软路由为核心服务端,彻底实现云服务器与组网中枢的解耦,既保证了远程访问内网的稳定性与低延迟,还能实现云服务器的灵活选择与丝滑切换,无需绑定固定厂商,且云服务器无需放通防火墙端口,安全性更强,配置简单、维护成本低,适合大多数家用场景。

作为补充,若家庭宽带无公网IP、运营商封端口等场景无法使用本方案,可将任意云服务器作为WireGuard服务端,终端与路由仅需切换配置即可正常组网,进一步提升方案的适配性。整体而言,该方案兼顾实用性与灵活性,新手与进阶用户均可快速落地使用。

概述

WireGuard 是一种轻量级VPN协议,通过UDP传输,具备以下特性:

特性 说明
高性能 比IPsec/OpenVPN更快的传输速度
现代化 代码简洁,攻击面小
安全性 采用现代加密算法

适用条件:公网IP环境(腾讯云/阿里云等购买)


一、环境要求

要求 说明
公网IP 服务端需具备公网IP
内核版本 ≥5.6(低于此版本需升级内核)
依赖包 内核、内核源码、内核头文件版本一致

二、安装步骤

2.1 安装WireGuard

1
sudo apt-get install wireguard

2.2 开启IPv4转发

1
2
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

2.3 生成密钥对

1
2
3
4
5
6
7
8
9
mkdir -p /etc/wireguard && chmod 0777 /etc/wireguard
cd /etc/wireguard
umask 077

# 生成服务端密钥
wg genkey | tee server_privatekey | wg pubkey > server_publickey

# 生成客户端密钥
wg genkey | tee client_privatekey | wg pubkey > client_publickey

三、服务端配置

3.1 生成配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
echo "
[Interface]
PrivateKey = $(cat server_privatekey)
Address = 10.0.8.1/24
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -A FORWARD -o wg0 -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -D FORWARD -o wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 50814
DNS = 8.8.8.8
MTU = 1420

[Peer]
PublicKey = $(cat client_publickey)
AllowedIPs = 10.0.8.10/24" > wg0.conf

注意eth0 替换为实际网卡名,50814 为UDP端口号

3.2 设置开机启动

1
systemctl enable wg-quick@wg0

3.3 启动与停止

操作 命令
启动 wg-quick up wg0
停止 wg-quick down wg0
查看状态 wg

四、客户端配置

4.1 生成配置文件

1
2
3
4
5
6
7
8
9
10
11
12
echo "
[Interface]
PrivateKey = $(cat client_privatekey)
Address = 10.0.8.10/24
DNS = 8.8.8.8
MTU = 1420

[Peer]
PublicKey = $(cat server_publickey)
Endpoint = 服务端公网IP:50814
AllowedIPs = 0.0.0.0/0, ::0/0
PersistentKeepalive = 25" > client.conf

4.2 启动方式

  • GUI方式:下载 WireGuard客户端,导入配置文件
  • 命令行方式
    1
    2
    wg-quick up client
    wg-quick down client

4.3 路由配置(可选)

1
2
3
4
5
# 添加特定IP路由
ip route add 103.52.188.136 via 192.168.1.2

# 所有流量走VPN
ip route add 0.0.0.0/0 via 10.0.8.1

五、测试验证

5.1 连通性测试

1
ping 10.0.8.1

5.2 数据包抓取

服务端安装 tcpdump 监听VPN接口:

1
2
apt -y install tcpdump
tcpdump -i wg0

六、高级命令

场景 命令
创建接口 ip link add dev wg0 type wireguard
分配IP ip address add dev wg0 192.168.2.1/24
点对点模式 ip address add dev wg0 192.168.2.1 peer 192.168.2.2
配置密钥 wg setconf wg0 myconfig.conf
手动配置 wg set wg0 listen-port 51820 private-key /path/to/private-key peer ABCDEF... allowed-ips 192.168.88.0/24 endpoint 209.202.254.14:8172
启用接口 ip link set up dev wg0
查看配置 wgwg showconf

七、密钥生成(补充)

1
2
3
4
5
6
7
8
# 生成私钥
umask 077 && wg genkey > privatekey

# 导出公钥
wg pubkey < privatekey > publickey

# 一步完成
wg genkey | tee privatekey | wg pubkey > publickey

附录

0%