强曰为道

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

第 5 章:用户管理

第 5 章:用户管理

用户是 IRC 网络的核心。本章详解用户模式、身份认证、昵称注册和隐私保护等关键主题。


5.1 用户标识体系

5.1.1 完整用户标识

IRC 中一个用户的完整标识格式为:

昵称!用户名@主机名
[email protected]
部分英文说明示例
昵称Nickname用户的显示名称alice
用户名Username连接时的用户名(ident)alice
主机名Hostname用户的 IP 或掩码后主机名host.example.com

5.1.2 三种标识来源

原始连接标识:
  [email protected]
         ↑       ↑
         ~前缀   真实 IP
         (无 ident)

有 ident 服务:
  [email protected]
        ↑
        无 ~ 前缀(已通过 ident 验证)

掩码后标识:
  [email protected]
               ↑
               Cloaking 后的主机名

SASL 登录后:
  [email protected] (已认证为 alice)

5.1.3 用户信息查询

/* WHOIS 查询 */
/WHOIS alice

/* 输出示例 */
:irc.example.com 311 yournick alice alice host.example.com * :Alice Wonderland
:irc.example.com 312 yournick alice irc.example.com :My IRC Server
:irc.example.com 307 yournick alice :has identified for this nick
:irc.example.com 317 yournick alice 3600 1620000000 :seconds idle, signon time
:irc.example.com 318 yournick alice :End of /WHOIS list.

/* WHO 查询(获取频道中的用户列表) */
/WHO #channel

/* WHOWAS 查询(历史记录) */
/WHOWAS alice

5.2 用户模式详解

5.2.1 设置用户模式

/* 设置模式 */
/MODE yournick +<mode>

/* 取消模式 */
/MODE yournick -<mode>

/* 查看当前模式 */
/MODE yournick

5.2.2 用户模式参考表

模式名称说明
+iInvisible不可见模式,不出现在 WHO 和 NAMES 中
+wWallops接收服务器管理员广播
+sServer Notices接收服务器通知(Oper 专用)
+gCaller ID仅接受白名单用户的私信(UnrealIRCd)
+RRegistered Only仅接受已注册用户的私信
+xCloaked启用主机掩码
+pPrivateWHOIS 时隐藏频道列表
+BBot标识为 Bot
+zSecure标识为 TLS 安全连接
+GCensor启用内容过滤
+WWHOIS接收 WHOIS 通知(Oper)
+HHide Oper隐藏 Oper 状态

5.2.3 典型模式组合

/* 普通用户推荐设置 */
/MODE yournick +ix

/* 普通用户(高隐私) */
/MODE yournick +ixR

/* Bot 设置 */
/MODE yournick +Bix

/* Oper 设置 */
/MODE yournick +iwsgx

5.3 身份认证机制

5.3.1 认证方式总览

方式说明安全性IRCv3 支持
NickServ 密码/NS IDENTIFY password
SASL PLAIN用户名+密码中高
SASL EXTERNALTLS 证书认证
SASL SCRAM-SHA-256挑战-响应
CertFPTLS 证书指纹❌(传统方式)

5.3.2 SASL 认证详解

SASL(Simple Authentication and Security Layer)是 IRCv3 标准化的认证机制。

SASL 认证流程:

┌──────────┐                    ┌──────────┐
│  Client  │                    │  Server  │
└────┬─────┘                    └────┬─────┘
     │                               │
     │ CAP LS 302                    │
     │──────────────────────────────►│
     │                               │
     │ CAP * LS :sasl=PLAIN,EXTERNAL │
     │◄──────────────────────────────│
     │                               │
     │ CAP REQ :sasl=PLAIN           │
     │──────────────────────────────►│
     │                               │
     │ CAP * ACK :sasl=PLAIN         │
     │◄──────────────────────────────│
     │                               │
     │ AUTHENTICATE PLAIN            │
     │──────────────────────────────►│
     │                               │
     │ AUTHENTICATE +                │
     │◄──────────────────────────────│
     │                               │
     │ AUTHENTICATE <base64>         │
     │──────────────────────────────►│
     │                               │
     │ 900 <nick> :You are now logged in
     │◄──────────────────────────────│
     │                               │
     │ 903 :SASL authentication successful
     │◄──────────────────────────────│
     │                               │
     │ CAP END                       │
     │──────────────────────────────►│

5.3.3 SASL PLAIN 认证

SASL PLAIN 的认证数据格式:

\0username\0password

Base64 编码:

# 生成 SASL PLAIN 认证字符串
echo -ne '\0alice\0mypassword' | base64
# 输出: AGFsaWNlAG15cGFzc3dvcmQ=

客户端配置示例(Weechat):

# Weechat SASL 配置
/set irc.server.example.sasl_mechanism plain
/set irc.server.example.sasl_username "alice"
/set irc.server.example.sasl_password "mypassword"
/set irc.server.example.sasl_timeout 30

5.3.4 SASL EXTERNAL(证书认证)

SASL EXTERNAL 使用 TLS 客户端证书进行认证,无需密码:

步骤 1:生成客户端证书:

# 生成客户端私钥
openssl genrsa -out client.key 4096

# 生成证书签名请求(CSR)
openssl req -new -key client.key -out client.csr \
  -subj "/CN=alice/O=MyIRCNet"

# 自签名生成证书
openssl x509 -req -in client.csr -signkey client.key \
  -out client.crt -days 365

# 合并为 PEM 格式
cat client.key client.crt > client.pem

步骤 2:在 NickServ 中注册证书指纹:

/* 首先用其他方式登录 */
/NICK alice
/NS IDENTIFY mypassword

/* 添加当前 TLS 证书的指纹 */
/NS CERT ADD

/* 或者手动添加指纹 */
/NS CERT ADD <SHA-512 指纹>

步骤 3:配置客户端使用证书:

# Weechat 配置
/set irc.server.example.ssl_cert "%h/ssl/client.pem"
/set irc.server.example.sasl_mechanism external

5.3.5 CertFP(证书指纹认证)

CertFP 是传统(非 IRCv3 SASL)的证书认证方式:

/* 连接时自动使用证书 */
/* 服务器将你的证书指纹与 NickServ 中的记录比对 */

/* 在 NickServ 中添加证书 */
/NS CERT ADD <SHA-512 指纹>

/* 查看当前证书指纹 */
/NS CERT LIST

5.4 昵称注册(NickServ)

5.4.1 NickServ 基本命令

/* 注册昵称 */
/NS REGISTER <password> <email>

/* 示例 */
/NS REGISTER MySecurePass [email protected]

/* 登录(标识身份) */
/NS IDENTIFY <password>

/* 更改密码 */
/NS SET PASSWORD <new_password>

/* 设置邮箱 */
/NS SET EMAIL <new_email>

/* 释放昵称(放弃注册) */
/NS DROP <password>

/* 查看账户信息 */
/NS INFO <nick>

/* 获取验证码(某些服务包要求邮箱验证) */
/NS VERIFY REGISTER <nick> <code>

5.4.2 昵称保护策略

策略说明设置命令
Kill强制占用者改名/NS SET KILL QUICK
Secure仅认证用户可使用/NS SET SECURE ON
NoExpire昵称永不过期/NS SET NOEXPIRE ON
Private隐藏在 INFO 中/NS SET PRIVATE ON
URL设置个人网站/NS SET URL https://example.com
Email设置联系邮箱/NS SET EMAIL [email protected]

5.4.3 昵称组(Group)

昵称组允许将多个昵称关联到同一账户:

/* 注册主昵称 */
/NICK alice
/NS REGISTER password [email protected]

/* 切换到关联昵称 */
/NICK alice_dev
/NS GROUP alice password

/* 现在 alice 和 alice_dev 共享同一账户 */

/* 查看组内所有昵称 */
/NS ALIST

/* 取消关联 */
/NS UNGROUP alice_dev

5.4.4 昵称找回

/* 发送找回邮件 */
/NS RECOVER <nick> <password>

/* 临时恢复昵称 */
/NS REGAIN <nick> <password>

/* 发送密码重置邮件 */
/NS SENDPASS <nick>

/* 通过验证码重置(某些服务包) */
/NS RESETPASS <nick>

5.5 主机掩码与隐私

5.5.1 主机掩码的作用

无掩码:    [email protected]          ← IP 暴露
有掩码:    [email protected]  ← IP 隐藏

5.5.2 虚拟主机(vhost)

Oper 可以为用户设置虚拟主机:

/* Oper 为用户设置 vhost */
/CHGHOST alice staff.example.com

/* 效果 */
/* 之前: [email protected] */
/* 之后: [email protected] */

5.5.3 HostServ

HostServ 是管理虚拟主机的服务:

/* 请求 vhost */
/HS REQUEST staff.example.com

/* Oper 批准 */
/HS APPROVE <nick>

/* 拒绝 */
/HS REJECT <nick> :原因

/* 激活已分配的 vhost */
/HS ON

/* 停用 vhost */
/HS OFF

/* 查看 vhost 状态 */
/HS STATUS <nick>

5.5.4 HostServ 配置

/* UnrealIRCd - 配置 HostServ */

/* 启用 HostServ */
set {
    /* 允许的 vhost 前缀(需要 Anope 支持) */
}

/* 定义 vhost 掩码格式 */
/* 通常通过 Anope/Atheme 的 hostserv 模块配置 */

5.6 账户信息管理

5.6.1 账户设置

/* 设置个人 URL */
/NS SET URL https://example.com

/* 设置个人头像(IRCv3 标准中可能被弃用) */
/NS SET AVATAR https://example.com/avatar.png

/* 设置时区 */
/NS SET TIMEZONE Asia/Shanghai

/* 设置语言 */
/NS SET LANGUAGE zh-CN

/* 设置自动加入频道列表 */
/NS AJOIN ADD #welcome
/NS AJOIN ADD #general
/NS AJOIN DEL #welcome
/NS AJOIN LIST

/* 隐藏账户信息 */
/NS SET HIDE EMAIL ON
/NS SET HIDE USERMASK ON

5.6.2 账户关联

/* 将当前昵称关联到已有账户 */
/NS GROUP main_account password

/* 查看关联的昵称 */
/NS ALIST

/* 设置账户名(某些服务包) */
/NS SET ACCOUNTNAME myaccount

5.7 用户限制配置

5.7.1 服务器端限制

# Ergo 用户限制配置
limits:
  max-nick-len: 32       # 昵称最大长度
  ident-len: 20          # 用户名最大长度
  away-len: 390          # 离开消息最大长度
  kick-reason-len: 390   # 踢出原因最大长度
  topic-len: 390         # 主题最大长度
  away-count: 5          # 离开消息历史数
  whowas-entries: 10     # WHOWAS 记录数
  monitor-entries: 100   # 监控列表数
  channels-per-client: 100  # 每用户最大频道数

accounts:
  registration:
    enabled: true
    cooldown: "24h"       # 注册冷却时间
    max-name-length: 32   # 账户名最大长度

5.7.2 用户速率限制

/* UnrealIRCd 速率限制 */
set {
    /* 消息速率限制 */
    flood {
        boot-delay 30;          /* 启动后延迟 30 秒 */
        message-rate 5;         /* 每 5 秒最多 5 条消息 */
        target-rate 3;          /* 目标速率限制 */
    }
}

5.8 用户监控与管理

5.8.1 WHO 查询

/* 查询频道中的所有用户 */
/WHO #channel

/* 按主机名查询 */
/WHO *.example.com

/* 按状态查询(已登录用户) */
/WHO * m

/* WHOX 格式(更详细的查询) */
/WHO #channel %uhnr

5.8.2 ISON / MONITOR

/* 检查用户是否在线(简单方式) */
/ISON alice bob charlie

/* 使用 MONITOR 服务(更强大) */
/MONITOR + alice bob charlie  /* 添加监控 */
/MONITOR - alice              /* 移除监控 */
/MONITOR S                    /* 查看监控列表 */
/MONITOR L                    /* 查看在线状态 */

5.8.3 用户管理操作

/* 踢出频道用户 */
/kick #channel bob :请遵守规则

/* 封禁频道用户 */
/mode #channel +b *!*@host.example.com

/* 服务器级封禁(需要 Oper 权限) */
/KLINE user@host :1d :违规行为      /* 临时封禁 */
/GLINE user@host :7d :严重违规      /* 全局封禁 */
/ZLINE *@192.168.1.100 :永久封禁    /* 按 IP 封禁 */
/SHUN user@host :静默忽略           /* 静默用户 */

/* 解封 */
/UNKLINE user@host
/UNGLINE user@host
/UNZLINE *@192.168.1.100
/UNSHUN user@host

5.9 ⚠️ 注意事项

事项说明
昵称安全使用强密码注册昵称,开启 Kill 和 Secure 保护
SASL 优先推荐使用 SASL 认证而非简单的 NickServ 密码
证书认证生产环境建议使用 EXTERNAL(证书)认证
隐私保护开启 +x 模式隐藏真实 IP
昵称过期注意 NickServ 的昵称过期策略,定期标识身份
多设备使用昵称组管理多个设备上的身份

扩展阅读


下一章: 第 6 章:服务包集成 — Atheme/Anope 服务框架、NickServ/ChanServ/HostServ 详解。