IRC 服务器搭建完全指南 / 第 4 章:频道管理
第 4 章:频道管理
频道(Channel)是 IRC 社区的核心载体。本章系统讲解频道的创建、模式、管理技巧和最佳实践。
4.1 频道基础
4.1.1 频道命名规则
| 规则 |
说明 |
| 前缀 |
# 为标准频道,& 为本地频道(不跨服务器传播) |
| 长度 |
通常限制为 50-64 个字符 |
| 字符集 |
a-z, A-Z, 0-9, -, _(IRC 历史上支持更多,但推荐使用安全字符) |
| 大小写 |
通常大小写不敏感(取决于 casemapping 设置) |
| 禁止字符 |
空格、逗号、冒号(:)、ASCII 7(响铃符 \x07) |
合法频道名示例:
#general
#dev-chat
#project_alpha
#技术支持
非法频道名:
#hello world ← 包含空格
#hello,world ← 包含逗号
4.1.2 创建频道
IRC 频道采用惰性创建模式——当第一个用户加入时自动创建:
/* 加入一个不存在的频道,即自动创建 */
/join #new-channel
/* 你将自动获得频道创建者(Founder)状态 */
/* 你将看到: +o (operator) 标志 */
/* 设置频道主题 */
/topic #new-channel :欢迎来到 #new-channel!这是一个新频道。
4.1.3 频道类型
| 类型 |
前缀 |
特点 |
| 标准频道 |
# |
全网可见,跨服务器传播 |
| 本地频道 |
& |
仅本服务器可见,不传播到其他服务器 |
| 安全频道 |
! |
UnrealIRCd 特有,具有唯一 ID |
4.2 频道模式详解
频道模式(Channel Modes)控制频道的可见性、访问权限和行为。
4.2.1 基本模式
/* 设置模式 */
/mode #channel +<mode> [<parameters>]
/* 取消模式 */
/mode #channel -<mode>
4.2.2 模式分类
核心模式表
| 模式 |
名称 |
需要参数 |
说明 |
+n |
No External |
❌ |
禁止非成员发送消息 |
+t |
Topic Lock |
❌ |
仅操作员可更改主题 |
+s |
Secret |
❌ |
频道不出现在 LIST 中 |
+p |
Private |
❌ |
频道在 LIST 中隐藏,但 WHO 可见 |
+i |
Invite Only |
❌ |
仅受邀用户可加入 |
+k |
Key |
密钥 |
设置频道密码 |
+l |
User Limit |
数字 |
限制最大用户数 |
+o |
Operator |
昵称 |
授予频道操作员权限 |
+v |
Voice |
昵称 |
授予发言权(在 +m 频道中) |
+h |
Half-Operator |
昵称 |
授予半操作员权限 |
+b |
Ban |
用户掩码 |
封禁用户 |
+e |
Except |
用户掩码 |
封禁例外(豁免) |
+I |
Invite Except |
用户掩码 |
邀请例外(自动受邀) |
+m |
Moderated |
❌ |
仅 +v 及以上可发言 |
+r |
Registered |
❌ |
仅注册用户可加入(Ergo) |
+R |
RegNick |
❌ |
仅注册昵称可加入 |
+c |
No Colors |
❌ |
禁止 ANSI 颜色代码 |
+C |
No CTCPs |
❌ |
禁止 CTCP 消息 |
+q |
Owner |
昵称 |
频道所有者权限 |
+a |
Admin |
昵称 |
频道管理员权限 |
+f |
Flood |
参数 |
防刷屏设置 |
+j |
Join Throttle |
参数 |
加入频率限制 |
+G |
Censor |
❌ |
启用内容过滤 |
+z |
Secure |
❌ |
仅 TLS 连接用户可见消息 |
4.2.3 常见模式组合
/* 公开讨论频道(标准设置) */
/mode #general +nt
/* 半公开频道(需密码) */
/mode #vip +ntk secretpassword
/* 完全私密频道(仅邀请) */
/mode #private +ntsi
/* 只读公告频道 */
/mode #announcements +ntm
/* 然后给特定人 +v 以允许发言 */
/* 安全频道(仅 TLS) */
/mode #secure +ntz
/* 受限频道(仅注册用户) */
/mode #registered +ntr
/* 带人数限制的频道 */
/mode #limited +ntl 50
/* 完整的防刷屏配置 */
/mode #protected +ntf [10j#R5]:5
/* 解释: 10 秒内最多 10 次加入, 消息速率 5 条/5 秒 */
4.2.4 模式实际操作
/* 授予操作员权限 */
/mode #channel +o alice
/* 同时授予多个权限 */
/mode #channel +ovv bob charlie dave
/* 踢出用户(比 +b 更温和) */
/kick #channel bob :请遵守频道规则
/* 封禁用户 */
/mode #channel +b *!*@host.example.com
/* 封禁并踢出 */
/mode #channel +b *!*@host.example.com
/kick #channel bob :已封禁
/* 解封 */
/mode #channel -b *!*@host.example.com
/* 设置封禁例外(被封禁但某些掩码豁免) */
/mode #channel +e *!*@trusted.example.com
/* 邀请例外(自动受邀) */
/mode #channel +I *!*@vip.example.com
4.3 频道主题
4.3.1 设置主题
/* 设置频道主题 */
/topic #channel :新主题内容
/* 带时间戳的主题(某些客户端支持) */
/topic #channel :[2026-05-10] 欢迎!今日议题: 项目进度
4.3.2 主题长度限制
| 服务端 |
默认限制 |
| UnrealIRCd |
307 字符 |
| InspIRCd |
307 字符 |
| Ergo |
390 字符 |
4.3.3 主题保护
/* 锁定主题(仅操作员可改) */
/mode #channel +t
/* 解锁主题(所有人可改) */
/mode #channel -t
4.3.4 主题最佳实践
推荐的频道主题格式:
#项目频道
[项目名称 v2.0 | 文档: https://docs.example.com | Wiki: https://wiki.example.com] 欢迎讨论
#支持频道
[请先阅读 FAQ: https://example.com/faq] 发问前请使用 paste 服务粘贴日志
#公告频道
[公告] 🔴 2026-05-10: v3.0 发布!请升级。
4.4 频道密钥(Key)
4.4.1 设置频道密码
/* 设置密码 */
/mode #channel +k mysecretpassword
/* 使用密码加入频道 */
/join #channel mysecretpassword
/* 取消密码 */
/mode #channel -k mysecretpassword
4.4.2 密钥安全建议
| 建议 |
说明 |
| 长度 |
至少 12 个字符 |
| 复杂度 |
包含字母、数字、符号 |
| 轮换 |
定期更换密钥 |
| 分享 |
通过私信分享,不要在公开频道发送 |
| 临时密钥 |
使用完后及时取消 |
4.5 用户限制
4.5.1 人数限制
/* 设置最大用户数 */
/mode #channel +l 100
/* 取消人数限制 */
/mode #channel -l
/* 动态人数限制(当人数减少时自动调整) */
/* 需要脚本或 Bot 支持 */
4.5.2 仅邀请模式
/* 开启邀请模式 */
/mode #channel +i
/* 邀请用户 */
/invite alice #channel
/* 关闭邀请模式 */
/mode #channel -i
4.5.3 邀请列表
/* 查看邀请列表 */
/mode #channel I
/* 添加永久邀请例外 */
/mode #channel +I *!*@vip.example.com
/* 移除邀请例外 */
/mode #channel -I *!*@vip.example.com
4.6 封禁管理
4.6.1 封禁掩码格式
| 掩码格式 |
示例 |
说明 |
*!*@host |
*!*@example.com |
封禁整个域名 |
nick!*@* |
troll!*@* |
封禁昵称 |
*!user@* |
*!baduser@* |
封禁用户名 |
nick!user@host |
[email protected] |
精确封禁 |
*!*@192.168.1.* |
*!*@192.168.1.* |
封禁 IP 段 |
$a:account |
$a:troll_account |
按账户封禁(需要服务包) |
$x:nick!user@host#realname |
精确匹配 |
按完整信息封禁 |
4.6.2 临时封禁
/* 封禁 1 小时(使用 +b + 时间戳) */
/mode #channel +b *!*@troll.example.com 3600
/* 或使用 KICKBAN */
/kick #channel troll :违反规则
/mode #channel +b *!*@troll.example.com
4.6.3 封禁列表管理
/* 查看封禁列表 */
/mode #channel b
/* 输出示例 */
/* *!*@bad.com (set by alice, 2026-05-10 12:00:00) */
/* troll!*@* (set by bob, 2026-05-10 13:00:00) */
/* 移除特定封禁 */
/mode #channel -b *!*@bad.com
4.6.4 封禁策略
行为升级策略:
1. 第一次违规 → 口头警告
2. 第二次违规 → 临时封禁 (1 小时)
3. 第三次违规 → 长期封禁 (1 天)
4. 第四次违规 → 永久封禁
封禁掩码选择:
- 临时违规者 → 精确掩码 (nick!user@host)
- 使用代理的骚扰者 → 宽泛掩码 (*!*@host)
- 持续骚扰者 → 账户封禁 ($a:account)
4.7 频道权限层级
4.7.1 权限层级表
| 权限 |
符号 |
UnrealIRCd |
InspIRCd |
Ergo |
| 创始人 |
~q / +q |
✅ |
✅ |
❌(通过服务包) |
| 管理员 |
&a / +a |
✅ |
✅ |
❌ |
| 操作员 |
@o / +o |
✅ |
✅ |
✅ |
| 半操作员 |
%h / +h |
✅ |
✅ |
✅ |
| 发言权 |
+v / +v |
✅ |
✅ |
✅ |
| 普通成员 |
无 |
— |
— |
— |
4.7.2 权限矩阵
| 操作 |
成员 |
+v |
+h |
+o |
+a |
+q |
| 发言(+m) |
❌ |
✅ |
✅ |
✅ |
✅ |
✅ |
| 发言(+n) |
❌ |
❌ |
❌ |
✅ |
✅ |
✅ |
| 修改主题(+t) |
❌ |
❌ |
✅ |
✅ |
✅ |
✅ |
| 踢出用户 |
❌ |
❌ |
✅ |
✅ |
✅ |
✅ |
| 设置 +o |
❌ |
❌ |
❌ |
✅ |
✅ |
✅ |
| 设置 +b |
❌ |
❌ |
✅ |
✅ |
✅ |
✅ |
| 设置 +k |
❌ |
❌ |
❌ |
✅ |
✅ |
✅ |
| 设置 +i/+s |
❌ |
❌ |
❌ |
✅ |
✅ |
✅ |
| 取消 +q |
❌ |
❌ |
❌ |
❌ |
❌ |
✅ |
4.8 频道管理实用命令
/* 查看频道信息 */
/info #channel
/* 查看频道用户列表 */
/names #channel
/who #channel
/* 查看频道模式 */
/mode #channel
/* 设置频道限制 */
/mode #channel +nt /* 标准安全设置 */
/mode #channel +snt /* 秘密 + 安全 */
/mode #channel +ntk secret /* 带密码 */
/* 批量操作(需要 Oper 权限) */
/* 批量封禁 */
/mode #channel +bbbb *!*@spam1.com *!*@spam2.com *!*@spam3.com *!*@spam4.com
/* 清除所有封禁(谨慎使用) */
/* 需要逐个移除或使用服务包命令 */
/* 频道日志(通过服务包) */
/ChanServ SET #channel LOG on
4.9 频道管理脚本示例
4.9.1 自动频道创建脚本
#!/usr/bin/env python3
"""自动创建和配置频道的脚本"""
import socket
import ssl
import time
class IRCChannelManager:
def __init__(self, server, port, nickname, password):
self.server = server
self.port = port
self.nickname = nickname
self.password = password
self.sock = None
def connect(self):
"""连接到 IRC 服务器"""
context = ssl.create_default_context()
raw_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock = context.wrap_socket(raw_sock, server_hostname=self.server)
self.sock.connect((self.server, self.port))
self.send(f"NICK {self.nickname}")
self.send(f"USER {self.nickname} 0 * :Channel Manager")
def send(self, message):
"""发送 IRC 消息"""
self.sock.send(f"{message}\r\n".encode())
time.sleep(0.2)
def create_channel(self, channel, modes="+nt", topic="", password=None):
"""创建并配置频道"""
# 加入频道
if password:
self.send(f"JOIN {channel} {password}")
else:
self.send(f"JOIN {channel}")
time.sleep(1)
# 设置模式
self.send(f"MODE {channel} {modes}")
# 设置主题
if topic:
self.send(f"TOPIC {channel} :{topic}")
print(f"[+] 频道 {channel} 已创建并配置")
def batch_create(self, config_file):
"""批量创建频道"""
channels = [
("#general", "+nt", "公共讨论频道"),
("#dev", "+ntm", "开发者频道 - 需要发言权"),
("#announcements", "+ntm", "公告频道"),
("#help", "+nt", "帮助与支持"),
]
for channel, modes, topic in channels:
self.create_channel(channel, modes, topic)
time.sleep(0.5)
# 使用示例
if __name__ == "__main__":
manager = IRCChannelManager("irc.example.com", 6697, "ChannelBot", None)
manager.connect()
time.sleep(5) # 等待连接建立
manager.batch_create("channels.conf")
4.10 ⚠️ 注意事项
| 事项 |
说明 |
| 频道所有权 |
没有服务包时,频道创建者离开即失去控制权 |
| 密钥泄露 |
频道密钥一旦泄露,需要立即更换 |
| 模式限制 |
部分模式需要 Oper 权限才能设置(如 +z 安全模式) |
| 封禁过度 |
过宽的掩码可能误伤正常用户 |
| 频道名称 |
避免使用过于相似的频道名(如 #dev 和 #dev-) |
| 人数限制 |
设置过低的限制可能导致合法用户无法加入 |
扩展阅读
下一章: 第 5 章:用户管理 — 用户模式、认证机制、昵称服务和主机掩码的详细讲解。