ZNC 1.10.3 配置参数详解

详解 ZNC 1.10.3 的 znc.conf 结构与全部关键参数,实测 webadmin、controlpanel 与直接编辑加 Rehash 三种修改途径的完整闭环。

ZNCZNCIRCUbuntu 22.04即时通信2026/10/30

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 进程:

参数默认值含义
AnonIPLimit10单个 IP 允许的同时未认证连接数,超出则拒绝新连接,可压制暴力连接
AuthOnlyViaModulefalse设为 true 后登录认证完全交给认证类模块(如 imapauth),核心自带的用户密码认证停用
ConfigWriteDelay0配置写盘延迟秒数;0 表示有变更立即写盘,调大可减少频繁写盘
ConnectDelay5对同一 IRC 服务器两次连接尝试之间的最小间隔(秒),防止被服务器视为滥用
HideVersionfalse设为 true 后对外隐藏版本号(VERSION 应答与 webadmin 页脚不再显示 1.10.3)
LoadModulecorecaps / saslplainauth / webadmin全局模块;corecaps 提供 IRCv3 capability 协商,saslplainauth 支持 PLAIN SASL 认证,webadmin 提供 Web 管理界面
MaxBufferSize500单个频道/查询缓冲区行数上限(用户级的 ChanBufferSize/QueryBufferSize 不能超过它)
ProtectWebSessionstrue设为 true 后 web 会话与登录 IP 绑定,IP 变化即会话失效,防会话劫持
SSLCertFile / SSLKeyFile / SSLDHParamFile/var/lib/znc/znc.pem三个键默认指向同一个自签名 pem(znc --makepem 生成),拆分证书与私钥时才分开写
ServerThrottle30对同一 IRC 服务器的两次成功连接之间的最小间隔(秒),连接失败重试也受此约束
Version(ZNC 写入)配置格式版本标记,勿手改

💡 技术拓展:密码哈希方法(<Pass> 节的 Method)不止本文环境实际可用的 SHA256 一种。常见方法对比——

方法特点适用场景
SHA256 + SaltZNC 内建,随机盐防彩虹表通用,所有构建都支持
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
SSLfalse端口是否走 TLS;IRC 客户端连接时要勾选 SSL,浏览器要用 https://
AllowIRCtrue该端口是否接受 IRC 客户端连接
AllowWebtrue该端口是否接受 webadmin 网页访问
IPv4 / IPv6true / 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 指南》第四章
Adminfalsetrue 即 ZNC 管理员,可在 webadmin 管理全部用户与全局设置
Nick / AltNick(makeconf 问答)主昵称 / 冲突时的备选昵称;本文 admin / admin_
Ident / RealName(makeconf 问答)连接 IRC 服务器时的 ident 与真实姓名字段
MultiClientstrue允许同一用户同时挂多个 IRC 客户端,消息广播给所有在线客户端
StatusPrefix*状态虚拟用户前缀(*status、*controlpanel);若你的 IRC 服务器昵称允许 * 开头冲突时换掉
MaxNetworks1用户可建的网络数上限;管理员在 webadmin 里改大即可多网络
QuitMsg%znc%客户端全部离线后,ZNC 替你向 IRC 服务器发送的退出消息,%znc% 展开为 ZNC - https://znc.in
NoTrafficTimeout180连接无流量多久(秒)后 ZNC 主动断开重连,防止僵死连接

缓冲(Buffer)参数是 ZNC 的灵魂——它决定"你离线期间发生了什么、上线后补给你多少":

参数默认值含义
ChanBufferSize / QueryBufferSize50频道/私聊缓冲区行数,上线时回放;上限受全局 MaxBufferSize 约束
AutoClearChanBuffertrue客户端收完回放后自动清空频道缓冲;多客户端共用时建议改 false,否则最后一个客户端看完就清了
AutoClearQueryBuffertrue同上,作用于私聊缓冲
PrependTimestamp / AppendTimestamptrue / 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 管理
IRCConnectEnabledtrue该网络是否自动连接;想建好网络但暂不连接时设 false
FloodRate / FloodBurst2.00 / 9发送速率限制:每 2 秒发 1 条、突发可发 9 条;对要求宽松的网络可调大
JoinDelay0连上服务器后延迟多少秒才 join 频道,防洪水检测误伤
TrustAllCertsfalsetrue 则信任任意服务器证书(自签名 IRC 服务器调试用,生产禁用)
TrustPKItrue校验服务器证书链
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> 无任何键),代表全部默认值;显式可配置的键:

参数默认值含义
Buffer50该频道独立缓冲行数(覆盖用户级 ChanBufferSize)
Detachfalsetrue 表示暂离状态: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>

相对默认值的关键调整与理由:

调整项默认 → 建议理由
HideVersionfalse → true不对外暴露具体版本号,减少针对性攻击面
AutoClearChanBuffer / AutoClearQueryBuffertrue → false多客户端场景下保留缓冲,任何一台设备上线都能补齐离线消息
ChanBufferSize / QueryBufferSize50 → 500长期离线后仍能回放更完整的上下文(不超过全局 MaxBufferSize=500)
MaxNetworks1 → 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 时间戳。

八、参考链接