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 防护等安全最佳实践。