ZNC with TOR

遇到的坑

配置了半天,终于把 ZNC with TOR 配置好了,原来如果要用 EXTERNAL 加密,就必须用 SSL 连接。

Connecting using SASL EXTERNAL requires that you connect using SSL encryption.

znc的官方wiki[1]的 .onion Resolution 章节已经过时,目前 tor 使用的是 socks5,已经内置远程 DNS,所以这个已经过时了。

正文

安装 TOR 以及 Proxychains:

# pacman -S tor proxychains

启动 TOR 并且开机自启:

# systemctl {start,enable} tor

编辑下 /etc/proxychains.conf 这个文件,把 socks4 改成 socks5。
然后改 /usr/lib/systemd/system/znc.service 文件(如果从 arch 源里装的 znc),ExecStart后面加个 /usr/bin/proxychains4 -q
保存之,刷新缓存:systemctl daemon-reload
先别急着启动 znc,改下 znc 的配置文件,把 Freenode 的 Server 改成 Server = freenodeok2gncmy.onion +6697
然后启动 znc,systemctl start znc
应该会无法连接到 Freenode,提示要求让你用 SASL,这个时候打开你的 web 端(直接用浏览器打开你的 znc 的服务器),登录进去,找到 Your Settings,把 cert 选勾,保存,重启下 znc。
然后用你的 Weechat 先连接到你的 znc 服务器,然后再连接到原版的 Freenode。
在 Network 里输入 /query *status,跟 *status '私聊',输入 loadmod sasl 加载 sasl 插件。
进到你的服务器里,生成下 pem 文件:openssl req -nodes -newkey rsa:2048 -keyout user.pem -x509 -days 3650 -out user.pem -subj "/CN=YourNickname"
把 YourNickname 替换成你在 irc 里的 nick,然后再生成指纹:openssl x509 -sha1 -noout -fingerprint -in user.pem | sed -e 's/^.*=//;s/://g;y/ABCDEF/abcdef/',把这个返回的值记录下来,先登录到 Freenode 上,输入 /msg NickServ cert add <fingerprint>,<fingerprint> 是刚才返回的那个值。
然后把这个 user.pem 拷贝到 /var/lib/znc/.znc/users/<Nickname>/moddata/cert/user.pem,同样,<Nickname> 是你的 irc nick。
再跟 *sasl 私聊:/query *sasl,私聊内容如下:

mechanism external

这个是让加密协议用 EXTERNAL。
这样就设置完成了,跟 *status 说一声 jump 来重新连接:/msg *status jump
Done。

参考

[1] https://wiki.znc.in/Tor
https://freenode.net/kb/answer/chat