ZNC 1.10.3 配置参数详解
详解 ZNC 1.10.3 的 znc.conf 结构与全部关键参数,实测 webadmin、controlpanel 与直接编辑加 Rehash 三种修改途径的完整闭环。
ZNC 1.10.3 配置参数详解
目标:逐一讲解 ZNC 1.10.3 的核心配置文件
znc.conf的结构与全部关键参数,并给出三种参数查看与修改方式(webadmin 网页、*controlpanel模块、直接编辑 + Rehash)的实测操作闭环。全部参数取值与回显均在 Ubuntu 22.04 源码编译安装的 ZNC 1.10.3 环境实测取得,服务以 systemd 托管、数据目录/var/lib/znc、Web UI 端口 8145。
一、环境信息
本文所有操作与回显基于以下环境:
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- ZNC:1.10.3(源码编译安装,二进制
/usr/local/bin/znc,模块目录/usr/local/lib/znc) - 运行身份:系统用户
znc(由 systemd 服务托管,服务单元/etc/systemd/system/znc.service) - 数据目录:
/var/lib/znc(配置文件/var/lib/znc/configs/znc.conf,SSL 证书/var/lib/znc/znc.pem) - Web UI:
https://127.0.0.1:8145(makeconf 时设置的 SSL 监听端口) - 演示 IRC 服务器:内网自建 irc.lan 6667(《ngIRCd 28 介绍与选型指南》记录了该 IRC 服务器的搭建过程)
- 演示账号:ZNC 用户
admin/q1w2e3r4,IRC 网络local
ZNC 的安装过程见 《Ubuntu 22.04 安装 ZNC 1.10.3 指南》,本文默认已按该指南完成安装并生成初始配置。
二、前置条件
确认 ZNC 服务处于运行状态、配置文件可读,后续参数操作均围绕这两样展开:
sudo systemctl is-active znc
sudo ls -l /var/lib/znc/configs/znc.conf
实测回显:
active
-rw------- 1 znc znc 1771 Oct 29 18:05 /var/lib/znc/configs/znc.conf
配置文件属主为 znc、权限 0600(仅属主可读写,因为里面保存着密码哈希与盐值)。查看内容时用 sudo cat,直接以普通用户 cat 会报 Permission denied。
sudo head -13 /var/lib/znc/configs/znc.conf
实测回显:
// WARNING
//
// Do NOT edit this file while ZNC is running!
// Use webadmin or *controlpanel instead.
//
// Altering this file by hand will forfeit all support.
//
// But if you feel risky, you might want to read help on /znc saveconfig and /znc rehash.
// Also check https://wiki.znc.in/Configuration
AnonIPLimit = 10
AuthOnlyViaModule = false
文件头官方注释给出两条硬规则:ZNC 运行期间不要直接编辑此文件(优先用 webadmin 或 *controlpanel);确要手改,改完必须让 ZNC 重读(/znc rehash)。这两条规则连同三种修改方式的取舍,正是下一章的主题。
三、参数查看与修改方式
ZNC 的参数修改共有三条途径,各有适用场景,本章逐一实测并给出选择建议。三者最终都落到同一个文件 znc.conf,差别只在于"谁来写、什么时候写":
| 方式 | 生效时机 | 是否需要终端 | 适用场景 |
|---|---|---|---|
| webadmin 网页 | 保存即生效并自动写盘 | 仅需浏览器 | 日常调整、不熟悉命令者 |
*controlpanel 模块 | 执行即生效,需 SaveConfig 落盘 | 任意 IRC 客户端 | 客户端内顺手改、批量脚本化 |
| 直接编辑 + Rehash | 手工 Rehash 后生效 | 需要 sudo | 批量调整、恢复备份 |
日常推荐 webadmin;在 IRC 客户端里干活时用 *controlpanel;只有服务无法通过这两种途径访问(如密码找回)才直接编辑文件。
3.1 方式一:webadmin 网页
webadmin 是 ZNC 内置的 Web 管理模块(全局模块,makeconf 时默认加载),浏览器打开 https://<服务器IP>:8145 即可使用。用命令行验证其完整流程时,可以按"登录 → 取页面 → 提交修改 → 验证落盘"四步走。
第一步,登录拿到会话 Cookie(注意 1.10.3 必须带隐藏表单字段 submitted=1,端点是 /login):
curl -sk -c /tmp/cj -d "submitted=1&user=admin&pass=q1w2e3r4" \
-o /dev/null -w "%{http_code} -> %{redirect_url}\n" https://127.0.0.1:8145/login
实测回显:
302 -> https://127.0.0.1:8145/?cookie_check=true
302 跳转 cookie_check=true 说明登录成功、会话 Cookie 已写入 /tmp/cj。若回显 403 或跳回登录页,检查用户名密码以及是否漏掉 submitted=1。
第二步,打开用户编辑页,提取 CSRF 令牌。⚠️ 1.10.3 的 webadmin 全部表单都要求 _CSRF_Check 令牌(1.8.x 时代没有这一层防护),且模块页面路由挂在 /mods/global/webadmin/ 下,直接访问 /edituser 会得到 404:
PAGE=$(curl -sk -b /tmp/cj "https://127.0.0.1:8145/mods/global/webadmin/edituser?user=admin")
echo "$PAGE" | grep -oE 'name="_CSRF_Check" value="[^"]+"' | head -1
echo "$PAGE" | grep -oE 'href="[^"]+"' | sort -u | head -12
实测回显(CSRF 行与仪表盘链接节选):
name="_CSRF_Check" value="e0b2f37db9b946d7b5bd51e0b3fa86c5"
href="/"
href="/logout"
href="/mods/global/webadmin/"
href="/mods/global/webadmin/edituser"
href="/mods/global/webadmin/listusers"
href="/mods/global/webadmin/settings"
href="/mods/global/webadmin/traffic"
第三步,携带 CSRF 令牌提交修改(把 RealName 改为 admin-from-web):
CSRF=$(echo "$PAGE" | grep -oE 'name="_CSRF_Check" value="[^"]+"' \
| head -1 | sed -E 's/.*value="([^"]+)".*/\1/')
curl -sk -b /tmp/cj \
-d "submitted=1&_CSRF_Check=$CSRF&user=admin&realname=admin-from-web" \
-o /dev/null -w "POST edituser: %{http_code}\n" \
"https://127.0.0.1:8145/mods/global/webadmin/edituser?user=admin"
实测回显:
POST edituser: 302
第四步,验证修改已即时落盘(webadmin 保存后自动写配置文件,不需要再手动 SaveConfig):
sudo grep RealName /var/lib/znc/configs/znc.conf
实测回显:
RealName = admin-from-web
RealName 已从 admin 变为 admin-from-web,闭环完成。不带 CSRF 令牌直接 POST 会得到 403,这是 1.10.x 相对旧版最常踩的坑。
💡 说明:浏览器操作时无感知以上细节——登录后点用户名进入编辑页、改字段、点 Save 即可,CSRF 令牌由页面自动携带。命令行四步流主要用于自动化巡检或无人值守场景。
3.2 方式二:*controlpanel 模块
*controlpanel 是用户级模块(makeconf 时默认加载),允许在任意 IRC 客户端里通过查询窗口直接修改配置。先以 IRC 客户端身份连上 ZNC——连接密码格式为 用户名[/网络名]:密码:
timeout 25 openssl s_client -quiet -connect 127.0.0.1:8145 2>/dev/null <<'EOF'
PASS admin/local:q1w2e3r4
NICK admin
USER admin 0 * admin
PRIVMSG *controlpanel :Get Nick admin
QUIT
EOF
实测回显(节选注册与应答行):
:irc.lan 001 admin :Welcome to the Internet Relay Network admin!~admin@client.lan
:*controlpanel!controlpanel@znc.in PRIVMSG admin :Nick = admin
Get <变量> <用户名> 查询参数,Set <变量> <用户名> <值> 修改参数。漏写 <值> 会得到用法提示:
:*controlpanel!controlpanel@znc.in PRIVMSG admin :Usage: Set <variable> <username> <value>
完整改一遍(改 → 查 → 改回 → 查):
timeout 25 openssl s_client -quiet -connect 127.0.0.1:8145 2>/dev/null <<'EOF'
PASS admin/local:q1w2e3r4
NICK admin
USER admin 0 * admin
PRIVMSG *controlpanel :Set Nick admin admin2
PRIVMSG *controlpanel :Get Nick admin
PRIVMSG *controlpanel :Set Nick admin admin
PRIVMSG *controlpanel :Get Nick admin
QUIT
EOF
实测回显:
:*controlpanel!controlpanel@znc.in PRIVMSG admin :Nick = admin2
:*controlpanel!controlpanel@znc.in PRIVMSG admin :Nick = admin
Set 成功时没有应答行,必须再 Get 一次确认(上例第一次 Get 返回 admin2 证明修改已生效,第二次返回 admin 证明已改回)。*controlpanel 的修改只进内存,不自动落盘,需要执行 PRIVMSG *status :SaveConfig 持久化,实测回显:
:*status!status@znc.in PRIVMSG admin :Wrote config to /var/lib/znc/configs/znc.conf
*controlpanel 可管理的变量与 webadmin 用户编辑页一一对应(Nick、AltNick、Ident、RealName、QuitMsg、TimestampFormat 等),管理员还可以用 Set <变量> <其他用户名> <值> 管理别的用户、用 SetAdmin/CloneUser 做用户级管理。
3.3 方式三:直接编辑 + Rehash
前两种方式不可用(比如密码丢失、webadmin 模块被卸载)时,才直接编辑文件。规则只有一条:改完必须 Rehash,或干脆在 ZNC 停止时改。先停服务再编辑是最稳妥的路径:
sudo systemctl stop znc
sudo vim /var/lib/znc/configs/znc.conf
# 修改 RealName = admin(示例)
sudo systemctl start znc
如果不想停服,也可以在运行期间编辑后让 ZNC 重读配置。连上 ZNC 后对 *status 发 Rehash:
timeout 25 openssl s_client -quiet -connect 127.0.0.1:8145 2>/dev/null <<'EOF'
PASS admin/local:q1w2e3r4
NICK admin
USER admin 0 * admin
PRIVMSG *status :Rehash
QUIT
EOF
实测回显:
:*status!status@znc.in PRIVMSG admin :Rehashing succeeded!
Rehash 会重读全局设置、模块与监听端口(详见 《ZNC 1.10.3 常用 CLI 命令与工具详解》中对 Rehash 的逐条实测)。注意:手改文件后再 SaveConfig 会用内存中的旧值把你的修改覆盖回去,二者顺序不能颠倒。
⚠️ 注意:
znc.conf里的Pass段保存的是 SHA256 哈希与随机盐,不要手改密码哈希——用znc --makepass生成新哈希块再整段替换,方法见 《ZNC 1.10.3 常用 CLI 命令与工具详解》。
四、参数总览
znc.conf 采用"全局键 + 分节"结构,共四层:全局参数 → <Listener> 监听节 → <User> 用户节 → <Network> 网络节 → <Chan> 频道节。用 sudo cat 看全貌:
sudo cat /var/lib/znc/configs/znc.conf
实测回显(完整,1.10.3 首次 makeconf 后的样子):
// WARNING
//
// Do NOT edit this file while ZNC is running!
// Use webadmin or *controlpanel instead.
//
// Altering this file by hand will forfeit all support.
//
// But if you feel risky, you might want to read help on /znc saveconfig and /znc rehash.
// Also check https://wiki.znc.in/Configuration
AnonIPLimit = 10
AuthOnlyViaModule = false
ConfigWriteDelay = 0
ConnectDelay = 5
HideVersion = false
LoadModule = corecaps
LoadModule = saslplainauth
LoadModule = webadmin
MaxBufferSize = 500
ProtectWebSessions = true
SSLCertFile = /var/lib/znc/znc.pem
SSLDHParamFile = /var/lib/znc/znc.pem
SSLKeyFile = /var/lib/znc/znc.pem
ServerThrottle = 30
Version = 1.10.3
<Listener listener0>
AllowIRC = true
AllowWeb = true
IPv4 = true
IPv6 = false
Port = 8145
SSL = true
URIPrefix = /
</Listener>
<User admin>
Admin = true
AltNick = admin_
AppendTimestamp = false
AuthOnlyViaModule = false
AutoClearChanBuffer = true
AutoClearQueryBuffer = true
ChanBufferSize = 50
DenyLoadMod = false
DenySetBindHost = false
DenySetCTCPReplies = false
DenySetIdent = false
DenySetNetwork = false
DenySetQuitMsg = false
DenySetRealName = false
Ident = admin
JoinTries = 10
LoadModule = chansaver
LoadModule = controlpanel
LoadModule = log
MaxJoins = 0
MaxNetworks = 1
MaxQueryBuffers = 50
MultiClients = true
Nick = admin
NoTrafficTimeout = 180
PrependTimestamp = true
QueryBufferSize = 50
QuitMsg = %znc%
RealName = admin
StatusPrefix = *
TimestampFormat = [%H:%M:%S]
<Network local>
FloodBurst = 9
FloodRate = 2.00
IRCConnectEnabled = true
JoinDelay = 0
LoadModule = simple_away
Server = irc.lan 6667
TrustAllCerts = false
TrustPKI = true
<Chan #test>
</Chan>
</Network>
<Pass password>
Hash = 748d842210b04becbca49263aa6de78e35b209b1f001d83eb89c3aba22259a02
Method = SHA256
Salt = W7!pe;6Ze1S,QQ1g;22k
</Pass>
</User>
结构树与层级关系如下:
znc.conf
├── 全局参数(AnonIPLimit、ConnectDelay、LoadModule、SSL* 等 15 个键)
├── <Listener listener0> 监听节(可多个):Port/SSL/AllowIRC/AllowWeb/IPv4/IPv6/URIPrefix
└── <User admin> 用户节(可多个)
├── <Pass password> 密码节:Hash/Method/Salt
├── LoadModule 用户级模块:chansaver/controlpanel/log
└── <Network local> 网络节(每用户可多个)
├── Server IRC 服务器地址
├── LoadModule 网络级模块:simple_away
└── <Chan #test> 频道节(每网络可多个):Buffer/Detach/Key/Modes
两点阅读要点:其一,LoadModule 在三个层级重复出现,作用域分别是全局/用户/网络,同名模块可以在不同层级以不同参数加载;其二,Version = 1.10.3 是 ZNC 自己写入的版本标记,用于升级时识别配置代际,不要手工修改。
五、核心参数分类详解
以下逐节拆解各类参数。每个参数给出含义与实测默认值,取值参考官方 wiki(https://wiki.znc.in/Configuration)并与 1.10.3 实际生成值逐项核对。
5.1 全局参数
全局参数位于所有 <Listener>/<User> 节之前,影响整个 ZNC 进程:
| 参数 | 默认值 | 含义 |
|---|---|---|
| AnonIPLimit | 10 | 单个 IP 允许的同时未认证连接数,超出则拒绝新连接,可压制暴力连接 |
| AuthOnlyViaModule | false | 设为 true 后登录认证完全交给认证类模块(如 imapauth),核心自带的用户密码认证停用 |
| ConfigWriteDelay | 0 | 配置写盘延迟秒数;0 表示有变更立即写盘,调大可减少频繁写盘 |
| ConnectDelay | 5 | 对同一 IRC 服务器两次连接尝试之间的最小间隔(秒),防止被服务器视为滥用 |
| HideVersion | false | 设为 true 后对外隐藏版本号(VERSION 应答与 webadmin 页脚不再显示 1.10.3) |
| LoadModule | corecaps / saslplainauth / webadmin | 全局模块;corecaps 提供 IRCv3 capability 协商,saslplainauth 支持 PLAIN SASL 认证,webadmin 提供 Web 管理界面 |
| MaxBufferSize | 500 | 单个频道/查询缓冲区行数上限(用户级的 ChanBufferSize/QueryBufferSize 不能超过它) |
| ProtectWebSessions | true | 设为 true 后 web 会话与登录 IP 绑定,IP 变化即会话失效,防会话劫持 |
| SSLCertFile / SSLKeyFile / SSLDHParamFile | /var/lib/znc/znc.pem | 三个键默认指向同一个自签名 pem(znc --makepem 生成),拆分证书与私钥时才分开写 |
| ServerThrottle | 30 | 对同一 IRC 服务器的两次成功连接之间的最小间隔(秒),连接失败重试也受此约束 |
| Version | (ZNC 写入) | 配置格式版本标记,勿手改 |
💡 技术拓展:密码哈希方法(
<Pass>节的Method)不止本文环境实际可用的 SHA256 一种。常见方法对比——
方法 特点 适用场景 SHA256 + Salt ZNC 内建,随机盐防彩虹表 通用,所有构建都支持 Argon2 内存困难型,抗 GPU 暴力破解 编译时链接了 libargon2 的构建 BCrypt 经典自适应哈希 旧配置兼容 本文 1.10.3 实测构建
znc --version回显含Argon2: no(未链接 libargon2),故 makeconf 只能生成 SHA256;若需要 Argon2,编译前安装 libargon2-dev 重新构建。本方案实际采用 SHA256 + Salt,理由是源码编译环境未装 Argon2 依赖且 SHA256+盐对单机 bouncer 场景足够。
全局参数的修改走 webadmin 的「Global Settings」页(/mods/global/webadmin/settings)或 *controlpanel 的 SetGlobal 系列命令,改完记得 SaveConfig。
5.2 <Listener> 监听节
监听节定义 ZNC 对外开几个端口、走什么协议,可以有多个(名字自取,如 listener0):
| 参数 | 默认值 | 含义 |
|---|---|---|
| Port | (必填) | 监听端口号,本文为 8145 |
| SSL | false | 端口是否走 TLS;IRC 客户端连接时要勾选 SSL,浏览器要用 https:// |
| AllowIRC | true | 该端口是否接受 IRC 客户端连接 |
| AllowWeb | true | 该端口是否接受 webadmin 网页访问 |
| IPv4 / IPv6 | true / false | 双栈开关;仅监听 IPv6 时设 IPv4 = false、IPv6 = true |
| URIPrefix | / | Web 路径前缀,配反向代理按路径分流时才改(如 /znc/) |
| BindHost | (无) | 绑定的本机地址,不写则监听全部网卡 |
四个典型组合:
<Listener http>
Port = 8146
AllowIRC = false
AllowWeb = true
SSL = false
</Listener>
<Listener irc-plain>
Port = 6667
AllowIRC = true
AllowWeb = false
SSL = false
</Listener>
上面两节把网页(8146、无 TLS)与 IRC 明文端口(6667)从主 SSL 端口(8145)里拆出来,方便防火墙分别管控。运行期增删端口也可以不改文件——对 *status 执行 AddPort/DelPort/ListPorts,方法与回显见 《ZNC 1.10.3 常用 CLI 命令与工具详解》。
5.3 <User> 用户节
每个 ZNC 用户一节,一个进程可带多用户。核心身份与缓冲参数如下:
| 参数 | 默认值 | 含义 |
|---|---|---|
<Pass> 节 | (必填) | 密码哈希:Method = SHA256、Hash(64 位十六进制)、Salt(随机串)。由 znc --makeconf 或 znc --makepass 生成,见 《Ubuntu 22.04 安装 ZNC 1.10.3 指南》第四章 |
| Admin | false | true 即 ZNC 管理员,可在 webadmin 管理全部用户与全局设置 |
| Nick / AltNick | (makeconf 问答) | 主昵称 / 冲突时的备选昵称;本文 admin / admin_ |
| Ident / RealName | (makeconf 问答) | 连接 IRC 服务器时的 ident 与真实姓名字段 |
| MultiClients | true | 允许同一用户同时挂多个 IRC 客户端,消息广播给所有在线客户端 |
| StatusPrefix | * | 状态虚拟用户前缀(*status、*controlpanel);若你的 IRC 服务器昵称允许 * 开头冲突时换掉 |
| MaxNetworks | 1 | 用户可建的网络数上限;管理员在 webadmin 里改大即可多网络 |
| QuitMsg | %znc% | 客户端全部离线后,ZNC 替你向 IRC 服务器发送的退出消息,%znc% 展开为 ZNC - https://znc.in |
| NoTrafficTimeout | 180 | 连接无流量多久(秒)后 ZNC 主动断开重连,防止僵死连接 |
缓冲(Buffer)参数是 ZNC 的灵魂——它决定"你离线期间发生了什么、上线后补给你多少":
| 参数 | 默认值 | 含义 |
|---|---|---|
| ChanBufferSize / QueryBufferSize | 50 | 频道/私聊缓冲区行数,上线时回放;上限受全局 MaxBufferSize 约束 |
| AutoClearChanBuffer | true | 客户端收完回放后自动清空频道缓冲;多客户端共用时建议改 false,否则最后一个客户端看完就清了 |
| AutoClearQueryBuffer | true | 同上,作用于私聊缓冲 |
| PrependTimestamp / AppendTimestamp | true / false | 回放消息的时间戳加在消息前/后;TimestampFormat 定义格式(默认 [%H:%M:%S]) |
权限限制参数 Deny* 系列(DenyLoadMod、DenySetIdent、DenySetNetwork、DenySetRealName、DenySetQuitMsg、DenySetBindHost、DenySetCTCPReplies,全部默认 false):管理员把它们对普通用户设为 true,即可禁止该用户自行加载模块/改 ident 等,普通用户管理面板相应字段变灰。
用户级模块 LoadModule(本文实测加载了三个):
| 模块 | 作用 |
|---|---|
| chansaver | 你在客户端里 join/part 的频道自动写回配置,下次上线自动重进 |
| controlpanel | 提供客户端内配置命令(3.2 节实测的就是它) |
| log | 把聊天记录落盘到 /var/lib/znc/users/<用户>/moddata/log/<网络>/<窗口>/<日期>.log(加载时应答原文:Loaded module log: Logging to [/var/lib/znc/users/admin/moddata/log/$NETWORK/$WINDOW/%Y-%m-%d.log]. Using timestamp format '[%H:%M:%S]') |
5.4 <Network> 网络节
1.0 之后 ZNC 支持一个用户多个网络(如同时挂 Libera 与 OFTC),每个网络独立一节。客户端连接时用 用户名/网络名:密码 区分:
| 参数 | 默认值 | 含义 |
|---|---|---|
| Server | (必填) | IRC 服务器地址,格式 主机 [+]端口 [密码],端口带 + 前缀表示 TLS(如 +6697);本文 irc.lan 6667。可写多条做备用服务器,配合 *status 的 AddServer/DelServer 管理 |
| IRCConnectEnabled | true | 该网络是否自动连接;想建好网络但暂不连接时设 false |
| FloodRate / FloodBurst | 2.00 / 9 | 发送速率限制:每 2 秒发 1 条、突发可发 9 条;对要求宽松的网络可调大 |
| JoinDelay | 0 | 连上服务器后延迟多少秒才 join 频道,防洪水检测误伤 |
| TrustAllCerts | false | true 则信任任意服务器证书(自签名 IRC 服务器调试用,生产禁用) |
| TrustPKI | true | 校验服务器证书链 |
| BindHost | (无) | 出站连接绑定的本机地址 |
网络级模块 LoadModule:本文实测加载了 simple_away——客户端全部断开后自动向 IRC 服务器发送 away 状态,回来自动取消。常用网络级模块还有 sasl(用 SASL 向 IRC 服务器认证,优先于 nickserv)、keepnick(抢主昵称)、perform(连上后自动执行命令序列)、buffextras(把 join/part 等事件也写进回放缓冲)等,模块清单的实测全文见 《ZNC 1.10.3 常用 CLI 命令与工具详解》。
⚠️ 注意:1.10.x 的 makeconf 默认引导连接 irc.libera.chat(网络名默认 libera),而 1.8.x 时代默认网络名还是 freenode。两个版本生成的 znc.conf 网络节名字不同,迁移旧配置时注意
用户名/网络名:密码连接串要跟着改。
5.5 <Chan> 频道节
每个网络下挂多个 <Chan> 节。刚 makeconf 完的频道节是空的(如上总览所示 <Chan #test> 无任何键),代表全部默认值;显式可配置的键:
| 参数 | 默认值 | 含义 |
|---|---|---|
| Buffer | 50 | 该频道独立缓冲行数(覆盖用户级 ChanBufferSize) |
| Detach | false | true 表示暂离状态:ZNC 仍在频道里收消息但不转发给你,攒在缓冲里 |
| Key | (无) | 频道密钥(带密码频道用) |
| Modes | (无) | 加入时施加的频道模式 |
| AutoClearChanBuffer | (继承用户) | 频道级覆盖用户级设置 |
chansaver 模块加载时,客户端里 join/part 会自动增删频道节,无需手改。
六、生产配置模板
综合以上参数,给出一台"个人/小团队长期挂机"场景的完整 znc.conf 模板(按 2GB 内存、单机部署标定;资源占用与部署流程的完整实测见 《Ubuntu 22.04 安装 ZNC 1.10.3 指南》)。<Pass> 节的哈希务必用 znc --makepass 为你自己的口令重新生成,不要照抄:
AnonIPLimit = 10
ConnectDelay = 5
HideVersion = true
LoadModule = corecaps
LoadModule = saslplainauth
LoadModule = webadmin
MaxBufferSize = 500
ProtectWebSessions = true
SSLCertFile = /var/lib/znc/znc.pem
SSLDHParamFile = /var/lib/znc/znc.pem
SSLKeyFile = /var/lib/znc/znc.pem
ServerThrottle = 30
<Listener listener0>
AllowIRC = true
AllowWeb = true
IPv4 = true
IPv6 = false
Port = 8145
SSL = true
URIPrefix = /
</Listener>
<User admin>
Admin = true
AltNick = admin_
AutoClearChanBuffer = false
AutoClearQueryBuffer = false
ChanBufferSize = 500
Ident = admin
JoinTries = 10
LoadModule = chansaver
LoadModule = controlpanel
LoadModule = log
MaxNetworks = 3
MultiClients = true
Nick = admin
NoTrafficTimeout = 180
PrependTimestamp = true
QueryBufferSize = 500
QuitMsg = %znc%
RealName = admin
StatusPrefix = *
TimestampFormat = [%H:%M:%S]
<Network local>
FloodBurst = 9
FloodRate = 2.00
IRCConnectEnabled = true
JoinDelay = 0
LoadModule = simple_away
Server = irc.lan 6667
TrustAllCerts = false
TrustPKI = true
<Chan #test>
</Chan>
</Network>
<Pass password>
Method = SHA256
Hash = <替换为 znc --makepass 生成的 Hash>
Salt = <替换为 znc --makepass 生成的 Salt>
</Pass>
</User>
相对默认值的关键调整与理由:
| 调整项 | 默认 → 建议 | 理由 |
|---|---|---|
| HideVersion | false → true | 不对外暴露具体版本号,减少针对性攻击面 |
| AutoClearChanBuffer / AutoClearQueryBuffer | true → false | 多客户端场景下保留缓冲,任何一台设备上线都能补齐离线消息 |
| ChanBufferSize / QueryBufferSize | 50 → 500 | 长期离线后仍能回放更完整的上下文(不超过全局 MaxBufferSize=500) |
| MaxNetworks | 1 → 3 | 一个用户挂多个 IRC 网络的常见上限 |
| HideVersion + ProtectWebSessions 保持开启 | — | 前者收敛信息暴露,后者防 Web 会话劫持 |
ZNC 进程本身是单进程 C++ 服务,空载内存约 20–30MB,每用户每网络再加几 MB 缓冲,2GB 内存支撑数十用户无压力;缓冲区调大主要消耗内存(每行消息约几百字节),按用户量 × 频道数 × 行数估算即可。
七、常见问题
Q1:改了 znc.conf 但没生效?
三种方式对应三种生效路径:webadmin 保存即生效并自动写盘;*controlpanel 只改内存,必须 PRIVMSG *status :SaveConfig;手改文件必须 Rehash(或停服再改再启)。最隐蔽的坑是:运行期间手改文件后忘了 Rehash,随后任何一次 SaveConfig 都会用内存旧值覆盖你的修改。
Q2:webadmin POST 一直 403?
1.10.x 的 webadmin 所有表单都要求 CSRF 令牌 _CSRF_Check(3.1 节实测:不带令牌 POST 得 403,取令牌后 302 成功)。浏览器操作不受影响;curl 脚本要先 GET 表单页提取令牌再提交。另外注意 1.10.3 的模块页面路由在 /mods/global/webadmin/ 下,直接访问 /edituser 是 404。
Q3:连接 ZNC 报 Invalid Password?
IRC 客户端的"服务器密码"一栏要填 ZNC 的连接串而不是裸密码:用户名:密码;有多个网络时是 用户名/网络名:密码。实测用 PASS admin/local:q1w2e3r4 成功进入,写成 PASS admin:q1w2e3r4 且用户下有多个网络、或写成 PASS q1w2e3r4 都会得到 :irc.znc.in 464 admin :Invalid Password。
Q4:为什么我的配置里没有 MaxNetworks/ServerThrottle 这些键?
makeconf 只写出非默认值的键,sudo cat 看不到某键通常说明它正取默认值;要显式改它,直接在对应节里加一行(webadmin 保存后也会把改动键写出来)。反之,Version 等由 ZNC 维护的键不要动。
Q5:管理员密码忘了怎么办?
不要手编 <Pass> 哈希。在服务器上用 znc --makepass 生成新的 <Pass> 块(实测输出含 Method/Hash/Salt 三行),停掉 ZNC 后整段替换,再启动。命令与完整回显见 《ZNC 1.10.3 常用 CLI 命令与工具详解》。
Q6:Buffer 回放出来的消息带时间戳吗?
带。PrependTimestamp = true + TimestampFormat = [%H:%M:%S] 时,离线消息回放形如 alice!~alice@client.lan PRIVMSG #test :[17:56:27] replay msg one(实测回放序列全文见 《ZNC 1.10.3 介绍与选型指南》功能特性章)。时间戳由 ZNC 附加,客户端本身不需要开 IRC 时间戳。
八、参考链接
- ZNC 官方配置文档:https://wiki.znc.in/Configuration
- ZNC 官网与下载:https://znc.in
- ZNC 1.10.3 ChangeLog:https://github.com/znc/znc/blob/master/ChangeLog.md
- webadmin 模块文档:https://wiki.znc.in/Webadmin
- controlpanel 模块文档:https://wiki.znc.in/Controlpanel
- 本文配套文档:《ZNC 1.10.3 介绍与选型指南》、《Ubuntu 22.04 安装 ZNC 1.10.3 指南》、《ZNC 1.10.3 常用 CLI 命令与工具详解》
- 内网 IRC 服务器搭建:《ngIRCd 28 介绍与选型指南》
- 同类 IRC 服务器对比:《Ergo 2.19 介绍与选型指南》