强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

IRC 服务器搭建完全指南 / 第 6 章:服务包集成

第 6 章:服务包集成

服务包(Services)为 IRC 网络提供账户管理、频道所有权和辅助管理功能。本章详解 Atheme 和 Anope 两大服务框架。


6.1 服务包概述

6.1.1 什么是服务包?

服务包是一组伪客户端(Pseudo-clients),它们伪装成普通用户连接到 IRC 服务器,提供账户管理等附加功能:

┌─────────────────────────────────────────┐
│              IRC 网络                    │
│                                         │
│  ┌──────────┐    ┌──────────────┐       │
│  │  Server  │◄──►│   Services   │       │
│  │  (主)    │    │   (服务包)   │       │
│  └────┬─────┘    └──────┬───────┘       │
│       │                 │               │
│  ┌────┴────┐    ┌───────┴────────┐      │
│  │         │    │ NickServ       │      │
│  │ 用户    │    │ ChanServ       │      │
│  │ Alice   │    │ HostServ       │      │
│  │ Bob     │    │ OperServ       │      │
│  │ Charlie │    │ BotServ        │      │
│  └─────────┘    │ MemoServ       │      │
│                 │ StatServ       │      │
│                 └────────────────┘      │
└─────────────────────────────────────────┘

6.1.2 核心服务一览

服务 功能 说明
NickServ 昵称注册与管理 用户账户系统的核心
ChanServ 频道注册与管理 频道所有权和权限管理
HostServ 虚拟主机管理 用户主机掩码服务
OperServ 管理员操作 服务器管理命令
BotServ Bot 管理 频道内置 Bot
MemoServ 离线消息 给离线用户发送消息
StatServ 统计服务 网络使用统计
Global 全局消息 向全网发送通知

6.1.3 服务框架对比

特性 Anope 2.x Atheme 7.x
开发语言 C/C++ C
配置格式 自定义格式 YAML
数据库 MySQL/SQLite/PostgreSQL Flat File/MySQL
模块系统 C++ 模块 C 模块
IRCv3 支持 良好 中等
维护状态 活跃 维护模式
文档质量 ⭐⭐⭐⭐ ⭐⭐⭐
安装难度 中等 中等
推荐场景 新部署 现有部署升级

6.2 Anope 安装与配置

6.2.1 安装 Anope

# 安装依赖
sudo apt install -y build-essential cmake libssl-dev \
  libmysqlclient-dev libsqlite3-dev libtre-dev

# 下载 Anope
VERSION="2.1.2"
cd /tmp
wget "https://github.com/anope/anope/archive/refs/tags/${VERSION}.tar.gz"
tar xzf ${VERSION}.tar.gz
cd anope-${VERSION}

# 编译
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/opt/anope \
      -DINSTYPE=production ..
make -j$(nproc)
make install

6.2.2 Anope 配置

cd /opt/anope/conf
cp example.conf services.conf
nano services.conf

核心配置 (services.conf):

/* === 服务包基本信息 === */
service
{
    nick "NickServ"
    user "services"
    host "services.example.com"
    realname "Nickname Registration Service"
}

service
{
    nick "ChanServ"
    user "services"
    host "services.example.com"
    realname "Channel Registration Service"
}

service
{
    nick "HostServ"
    user "services"
    host "services.example.com"
    realname "Virtual Host Service"
}

service
{
    nick "OperServ"
    user "services"
    host "services.example.com"
    realname "Operator Service"
}

service
{
    nick "MemoServ"
    user "services"
    host "services.example.com"
    realname "Memo Service"
}

service
{
    nick "Global"
    user "services"
    host "services.example.com"
    realname "Global Noticer"
}

/* === 连接到 IRC 服务器 === */
uplink
{
    host "127.0.0.1"
    port 6900
    ipv4 yes
    ipv6 no
    ssl yes
    password "services_link_password"
}

/* === 数据库 === */
/*
 * 使用 MySQL
 */
mysql
{
    name "anope"
    host "127.0.0.1"
    port 3306
    user "anope"
    pass "anope_db_password"
    dbname "anope"
    prefix "anope_"
}

/* 或使用 SQLite */
/*
 * sqlite
 * {
 *     name "anope"
 *     dbname "anope.db"
 *     prefix "anope_"
 * }
 */

/* === NickServ 配置 === */
module { name = "nickserv/main" }
module { name = "nickserv/register" }
module { name = "nickserv/identify" }
module { name = "nickserv/group" }
module { name = "nickserv/recover" }
module { name = "nickserv/sasl" }
module { name = "nickserv/cert" }

nickserv
{
    nick "NickServ"
    emailregistration yes
    forceemail yes
    maxaliases 5
    expire 90d
    displaytimeout 30s
    passlen 32
    /* 强制 SASL 登录 */
    forcesasl yes
}

/* === ChanServ 配置 === */
module { name = "chanserv/main" }
module { name = "chanserv/register" }
module { name = "chanserv/akick" }
module { name = "chanserv/autovoice" }
module { name = "chanserv/flags" }
module { name = "chanserv/log" }
module { name = "chanserv/set" }

chanserv
{
    nick "ChanServ"
    expire 14d
    maxregistered 20
    fantasy yes
    /* 快捷命令前缀 */
    fantasycharacter "!"
}

/* === OperServ 配置 === */
module { name = "operserv/main" }
module { name = "operserv/akill" }
module { name = "operserv/news" }
module { name = "operserv/stats" }
module { name = "operserv/jupe" }
module { name = "operserv/session" }
module { name = "operserv/sxline" }

/* === 日志配置 === */
log
{
    source { *; }
    target "/opt/anope/logs/services.log"
    logage 7d
    loguser yes
}

6.2.3 连接 Anope 到 IRC 服务器

UnrealIRCd 端配置

/* 在 UnrealIRCd 中添加服务链接 */
link services.example.com {
    incoming {
        mask 127.0.0.1;
    }
    password "services_link_password";  /* 与 Anope 配置一致 */
    class servers;
}

/* 定义服务伪客户端的 uline(信任) */
ulines {
    services.example.com;
}

启动 Anope:

cd /opt/anope
./services

# 或使用 systemd
sudo systemctl start anope
sudo systemctl status anope

6.3 Atheme 安装与配置

6.3.1 安装 Atheme

# 安装依赖
sudo apt install -y build-essential git libssl-dev \
  libcurl4-openssl-dev libtre-dev pkg-config

# 克隆源码
git clone https://github.com/atheme/atheme.git
cd atheme
git checkout v7.3.0  # 使用稳定版本

# 编译
./configure --prefix=/opt/atheme --enable-contrib
make -j$(nproc)
make install

6.3.2 Atheme 配置

cd /opt/atheme/etc
cp atheme.conf.example atheme.conf
nano atheme.conf

核心配置 (atheme.conf):

# Atheme YAML 配置

# 服务器信息
serverinfo:
  name: "services.example.com"
  desc: "Channel Services"
  # 连接到主服务器
  uplink: "127.0.0.1"
  vhost: "services.example.com"
  netname: "MyIRCNet"
  adminname: "Alice"
  adminemail: "alice@example.com"
  loglevel: "info"
  # 数据库
  datastore:
    type: "flatfile"        # 或 "mysql"
    # mysql:
    #   host: "127.0.0.1"
    #   port: 3306
    #   user: "atheme"
    #   pass: "atheme_password"
    #   name: "atheme"
  # SASL
  sasl: "yes"

# 连接信息
uplink "irc.example.com":
  host: "127.0.0.1"
  port: 6900
  password: "services_link_password"

# 模块加载
loadmodule "nickserv/main"
loadmodule "nickserv/register"
loadmodule "nickserv/identify"
loadmodule "nickserv/group"
loadmodule "nickserv/cert"
loadmodule "nickserv/sasl"
loadmodule "chanserv/main"
loadmodule "chanserv/register"
loadmodule "chanserv/flags"
loadmodule "chanserv/akick"
loadmodule "hostserv/main"
loadmodule "hostserv/request"
loadmodule "operserv/main"
loadmodule "operserv/akill"
loadmodule "operserv/clones"
loadmodule "memoserv/main"

# NickServ 设置
nickserv:
  expire: 90d
  maxaliases: 5
  enforce: "strict"

# ChanServ 设置
chanserv:
  expire: 14d
  maxchans: 20
  fantasy: "yes"

# 日志
log:
  source: "*"
  target: "/opt/atheme/var/atheme.log"

6.3.3 启动 Atheme

/opt/atheme/bin/atheme -d /opt/atheme/var -f /opt/atheme/etc/atheme.conf

# systemd 服务
sudo systemctl start atheme

6.4 服务命令详解

6.4.1 NickServ 命令

/* ===== 注册 ===== */
/NS REGISTER <password> <email>
/NS VERIFY REGISTER <nick> <code>

/* ===== 身份 ===== */
/NS IDENTIFY <password>
/NS LOGOUT
/NS GHOST <nick> <password>
/NS RELEASE <nick> <password>
/NS RECOVER <nick> <password>

/* ===== 账户信息 ===== */
/NS INFO <nick>
/NS INFO <nick> ALL         /* 详细信息 */
/NS SET <option> <value>
/NS SET PASSWORD <new_pass>
/NS SET EMAIL <new_email>
/NS SET URL <url>
/NS SET LANGUAGE <lang>
/NS SET KILL <ON|OFF|QUICK>
/NS SET SECURE <ON|OFF>
/NS SET PRIVATE <ON|OFF>

/* ===== 高级 ===== */
/NS GROUP <main_account> <password>
/NS UNGROUP <nick>
/NS ALIST                   /* 列出关联账户 */
/NS CERT ADD <fingerprint>
/NS CERT DEL <fingerprint>
/NS CERT LIST
/NS SENDPASS <nick>         /* 发送重置邮件 */
/NS RETURN <nick> <new_email> /* 恢复账户 */
/NS SASET <nick> <option> <value> /* 管理员设置 */

6.4.2 ChanServ 命令

/* ===== 注册 ===== */
/CS REGISTER <#channel> <password> <description>
/CS DROP <#channel>

/* ===== 信息 ===== */
/CS INFO <#channel>
/CS FLAGS <#channel>
/CS LEVELS <#channel>

/* ===== 权限管理 ===== */
/CS FLAGS <#channel> ADD <account> <flags>
/CS FLAGS <#channel> DEL <account> <flags>
/CS FLAGS <#channel> LIST

/* 示例: 授予自动操作员 */
/CS FLAGS #mychannel ADD alice +AO     /* Auto-Op */
/CS FLAGS #mychannel ADD bob +V        /* Auto-Voice */
/CS FLAGS #mychannel ADD charlie +F    /* Founder */

/* ===== 封禁管理 ===== */
/CS AKICK <#channel> ADD <mask> [reason]
/CS AKICK <#channel> DEL <mask>
/CS AKICK <#channel> LIST
/CS AKICK <#channel> ENFORCE

/* ===== 模式管理 ===== */
/CS MODE <#channel> <mode>
/CS SET <#channel> <option> <value>
/CS SET <#channel> TOPIC <new_topic>
/CS SET <#channel> MLOCK +ntk secret   /* 锁定模式 */
/CS SET <#channel> MLOCK +nt           /* 仅锁定核心模式 */
/CS SET <#channel> RESTRICTED ON       /* 限制模式 */
/CS SET <#channel> SECURE ON           /* 安全模式 */
/CS SET <#channel> OPERS ONLY          /* 仅 Oper 可注册 */

/* ===== 转让 ===== */
/CS FOUNDER <#channel> <new_founder>
/CS SUCCESSOR <#channel> <new_successor>

/* ===== 日志 ===== */
/CS LOG <#channel> ADD <target> <type>

6.4.3 OperServ 命令

/* ===== 统计 ===== */
/OS STATS ALL
/OS STATS UPLINKS
/OS STATS SESSIONS

/* ===== 全局封禁(AKILL) ===== */
/OS AKILL ADD <user@host> <duration> :<reason>
/OS AKILL DEL <user@host>
/OS AKILL LIST

/* ===== 新闻 ===== */
/OS NEWS ADD <type> :<message>
/OS NEWS DEL <id>
/OS NEWS LIST

/* ===== 其他管理 ===== */
/OS JUPE <server> :<reason>     /* 临时隔离服务器 */
/OS SESSION LIST <host>
/OS CLONES LIST
/OS IGNORE ADD <user> <duration>

6.4.4 HostServ 命令

/HS REQUEST <vhost>
/HS REJECT <nick> :<reason>
/HS APPROVE <nick>
/HS ON
/HS OFF
/HS STATUS <nick>
/HS GROUP                   /* 将 vhost 关联到组 */

6.4.5 MemoServ 命令

/MS SEND <nick> :<message>
/MS SEND <#channel> :<message>
/MS READ <id>
/MS DEL <id>
/MS LIST
/MS CHECK                   /* 检查未读 */

6.5 服务包权限体系

6.5.1 ChanServ 权限级别

Founders (+F)    ← 频道创始人(最高权限)
    ↓
Ops (+O)         ← 自动授予操作员
    ↓
Halfops (+H)     ← 自动授予半操作员
    ↓
Voices (+V)      ← 自动授予发言权
    ↓
普通成员          ← 无特殊权限

6.5.2 权限设置示例

/* 设置权限级别 */
/CS SET #channel SECURE ON
/CS FLAGS #channel ADD alice +FO          /* 创始人 + 自动操作员 */
/CS FLAGS #channel ADD bob +A             /* 自动操作员 */
/CS FLAGS #channel ADD charlie +V         /* 自动发言权 */
/CS FLAGS #channel ADD dave +i            /* 邀请权限 */
/CS FLAGS #channel ADD eve +b             /* 封禁权限 */

/* 查看权限列表 */
/CS FLAGS #channel LIST

6.5.3 权限标志参考表

标志 含义
+F 创始人(Founder)
+f 受让人(Successor)
+O 自动操作员(Auto-Op)
+H 自动半操作员(Auto-Halfop)
+V 自动发言权(Auto-Voice)
+v 语音(Voice)
+h 半操作员(Halfop)
+o 操作员(Op)
+A 管理员(Admin)
+i 自动邀请(Invite)
+r 可以恢复频道(Recover)
+R 可以设置主题(Topic)
+b 可以封禁(Ban)
+t 可以使用 SAY/ACT(Bot 发言)
+s 可以查看状态(Status)
+e 可以编辑 AKICK

6.6 Ergo 内置服务

Ergo 内置了服务功能,无需外部服务包:

# Ergo 内置的账户系统
accounts:
  enabled: true
  # 注册
  registration:
    enabled: true
    cooldown: "24h"
    max-name-length: 32
    # 需要邮箱验证
    # email-verification: true

  # 登录
  login-throttling:
    enabled: true
    # 速率限制
    max-attempts: 5
    duration: "1m"

  # 密码策略
  bcrypt:
    enabled: true
    cost: 10

# NickServ 等效命令(在 Ergo 中直接使用)
# /NS REGISTER <password> <email>
# /NS IDENTIFY <password>
# /NS INFO <account>
# /NS GROUP <main_account>

6.7 服务包运维

6.7.1 数据库备份

#!/bin/bash
# backup_services.sh

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/opt/backups/services"

mkdir -p $BACKUP_DIR

# Anope 备份
cp /opt/anope/data/anope.db $BACKUP_DIR/anope_${DATE}.db

# 或 MySQL 备份
mysqldump -u anope -p anope > $BACKUP_DIR/anope_${DATE}.sql

# 保留最近 30 天
find $BACKUP_DIR -name "*.db" -mtime +30 -delete
find $BACKUP_DIR -name "*.sql" -mtime +30 -delete

echo "[${DATE}] 服务包备份完成"

6.7.2 数据库恢复

# Anope 恢复
sudo systemctl stop anope
cp /opt/backups/services/anope_latest.db /opt/anope/data/anope.db
sudo systemctl start anope

# MySQL 恢复
mysql -u anope -p anope < /opt/backups/services/anope_latest.sql
sudo systemctl restart anope

6.8 ⚠️ 注意事项

事项 说明
密码安全 使用强密码,开启双因素认证(如可用)
数据库备份 定期备份服务包数据库
服务重启 服务包崩溃不会影响主 IRC 服务器运行
版本兼容 确保服务包版本与 IRC 服务端版本兼容
U:line 必须在 IRC 服务端配置中信任服务服务器(ulines)
邮箱验证 生产环境应强制邮箱注册验证
过期策略 合理设置昵称和频道过期时间

扩展阅读


下一章: 第 7 章:安全加固 — TLS 配置、SASL 认证、审计日志、DDoS 防护等安全最佳实践。