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

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管理员操作服务器管理命令
BotServBot 管理频道内置 Bot
MemoServ离线消息给离线用户发送消息
StatServ统计服务网络使用统计
Global全局消息向全网发送通知

6.1.3 服务框架对比

特性Anope 2.xAtheme 7.x
开发语言C/C++C
配置格式自定义格式YAML
数据库MySQL/SQLite/PostgreSQLFlat 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 防护等安全最佳实践。