建立-IRC-服务器
介绍
这里用 UnrealIRCd 来搭建.
UnrealIRCd 是一个开源的 IRC Server 软件, 其模块化以及安全做得比较好, 可以用配置文件深度配置.
安装
从源码编译安装
至少需要编译器以及 OpenSSL library, 以 Ubuntu 为例:
1 |
|
在 Fedora 上可能为:
1 |
|
注意不要用 root 编译和运行 IRCd.
具体步骤如下:
1 |
|
也可以用 git
拉取:
1 |
|
包管理器
比如在 Archlinux 上可直接用 pacman
安装:
1 |
|
Docker 安装
1 |
|
(似乎拉不下来?)
相关概念
cloak key
cloak 原义 “斗篷, 披风”, cloak key 也可以称 vhost key, 主要用于为用户提供虚拟主机名 (virtual host).
使用 cloak key, 可以让用户在连接到 IRCC 服务器时使用虚拟主机名 (用户的), 从而隐藏真实的 IP 地址.
配置
创建配置文件
1 |
|
(~/unrealircd
为前面编译的目录)
配置语法
官方配置语法文档
UnrealIRCd 都使用 block-based-format (也就是基于 “块”), 比如:
1 |
|
<block-value>
有些不需要设置<block-directive>
行需要以;
结尾<directive-value>
也可以是一个 block
比如:
1 |
|
上述的定义可以用一种特殊的 notation 来引用, 比如第一个 block 中的 name, 可以记为 me::name
注释可以为:
1 |
|
基本使用
启动服务
1 |
|
可能会遇到下面报错:
先修改 OPER 用户及其密码:
密码注意用 hash 值.
对于 cloak-keys
报错, 先运行:
1 |
|
将输出的 keys 粘贴到配置文件即可.
之后修改 kline-address
为一个邮箱地址即可.
特性
模块化
比如一些 channel modes, user modes 都在模块里可以自己添加.
加载模块
在 unrealircd.conf
中添加:
1 |
|
查找可用的模块
可以查看 modules.default.conf
文件, 其他的可以查看下面链接:
第三方模块, 可在 这里查找.
如何使用第三方模块可查看 How to install 3rd party modules.
认证
比如可以限制连接的 IP, 具体可以看 这里.
SSL/TLS
几乎所有 IRC 客户端都支持 SSL/TLS, 但需要在连接时指定启用了 SSL 的端口 (具体配置可见 官方文档), 默认是 6697
.
比如用 irssi
连接时:
1 |
|
默认情况, UnrealIRCd 会创建一个自签名证书, 但大多情况下 client 会将其标记为 untrusted 导致 refuse to connect. 可以用 Let's Encrypt
自己申请.
Oper block
可以在 oper block 中定义 IRC Operator 账号. 之后则可以用 /OPER
切换到 IRCOp 账号.
定义语法为:
1 |
|
<name>
和<password>
用于切换到 OPER 用户时的认证, 如/OPER name password
mask
指定哪些 host/IP 可以登录到 OPER, 比如mask *;
表示允许所有,mask { 192.168.0.0/16; *.example.net; }
指定 host/IPclass
, 用于管理用户权限, 定义class
的语法后头讲operclass
, 用于配置 IRCOp 权限, 默认 list of operclasses 可以在 这里查看, 权限最高的为netadmin
和netadmin-with-override
auto-login
, 对于满足 mask 的 host/IP 可以免密登录maxlogins
, 限制同时从 host/IP 登录的用户数vhost
, “virtual host”, 在登录成功后会设置成 hostnameswhois
, 添加信息到/WHOIS
的输出, 比如swhois "a Network Administrator";
modes
, 用于设置 user modessnomask
, “server notice mask”, 即设置一个 mask, 控制给用户的通知信息, 默认使用set::snomask-on-oper
设置的值auto-join
, 设置登录到 OPER 时加入的 channel, 如auto-join "#opers,#staff";
. 默认情况下登录到set::oper-auto-join
的值
示例:
1 |
|
IRC Operator Guide
IRC Operator 的一些权限包括:
- 可以加入任何 channel
- 可以获取任何 channel 的管理员权限
- 可以 kick or ban a user
踢出一个 user
即让一个 user 断开连接:
1 |
|
(用户可以尝试重新连接)
Ban 掉一个用户
可以指定 ban 的时间, 即这段时间内无法连接上当前服务器:
1 |
|
也可以让用户无法连接到整个网络中的所有服务器, 如:
1 |
|
若用 /ZLINE
和 /GZLINE
, 可以让用户不产生 handshake.
解除一个用户的 ban 状态
用 /ELINE
如:
1 |
|
也可以用 /KLINE
:
1 |
|
之后用户就可以重新连接到服务器.
防止部分用户被 ban 掉
1 |
|
这样来自 198.51.100.1
的所有主机都不会被 ban.
查看信息
用户列表
1 |
|
可以查看连接到 network 的所有用户.
1 |
|
可以查看所有 real hosts.
1 |
|
可以查看所有 IP addresses.
查看用户详细信息
1 |
|
查看 channel 列表
1 |
|
查看 ban list
1 |
|
查看 channel members
1 |
|
或:
1 |
|
加入本不可加入的 channel
如果加入一个 channel 时报错 Channel is invite only (+i)
, 则可:
1 |
|
若有 override 权限, 则可用:
1 |
|
更换 modes
如果有 override 权限, 则可改变 channel 的权限:
1 |
|
让自己无法被 ban
1 |
|
Linking Servers
如果想让 IRC network 跑在多个 server 上, 则需要 “link”.
同一个 network 下的 server 可以:
- 共享同一个网络名称
- 无论连接哪个服务器都能看到整个网络中的其他用户和频道
- 消息在各服务器都是同步的
主要用 link
block 来定义 (步骤比较靠后才用到).
需要注意的是 server id 的设置需要不同才行.
单独开一个 server 间交流的 ssl 端口
在各 servers 上的配置中添加:
1 |
|
serveronly
表明仅用于 server 间交流
创建一个单独的 class 管理 servers 的设置
1 |
|
pingfreq 60
, 指的是服务器间每 60s 发送一次心跳 (ping) 请求以确认连接是否仍然有效connfreq 30
, 指的是在两台服务器之间尝试重新连接的时间间隔. 如果一台服务器断开了与另一台服务器的连接, 它将在 30 秒后尝试重新连接maxclients 10
, 是每台服务器允许的最大客户端连接数sendq 20M
, 是服务器的发送队列大小, 单位为兆字节 (MB). 它定义了服务器可以在内存中为待发送消息保留的最大空间
获取 servers 的 SPKI fingerprint
SPKI (Subject Public Key Info) 指纹是一个与 SSL/TLS 证书相关的唯一哈希值 (用于区分不同的证书). 它是通过对证书中的公钥部分进行哈希计算生成的, 通常使用 SHA-256 或 SHA-1 算法.
可以通过:
1 |
|
获取.
输出如:
1 |
|
这个输出用到后续的 link
block 中.
link block 设置
比如有两台 servers, 一台为 alpha.test.net
, 另一台为 beta.test.net
.
在 alpha.test.net
上的 unrealircd.conf
, 添加:
1 |
|
link beta.test.net
定义一个 link block, 名字需要与对方服务器的me
block 中的 name 相同incoming
定义了哪些其他服务器可以连接到当前服务器的设置outgoing
定义了当前服务器要连接到哪个其他服务器的设置bind-ip
指定用哪个本地接口连接hotsname
指定要连接的远程服务器的主机名, 可以是域名或 ip
hub *;
将该服务器设置为一个 hub 服务器, 表示它可以连接到其他服务器并转发消息class servers;
, 用servers
类中定义的行为
在 beta.test.net
上的 unrealircd.conf
中添加:
1 |
|
重新加载配置
用客户端连接上 IRC 服务器, 然后用:
1 |
|
登录到 IRCOp, 之后:
1 |
|
即可.
查看 link 的状态
connect 到 network 之后:
1 |
|
即可查看.
负载均衡
可见 官网相关内容.
DNS round robin
比如现在的组网如果为:
irc1.example.net
, IP 为1.1.1.1
irc2.example.net
, IP 为2.2.2.2
irc.example.net
的 DNS 记录指向上述两个 server
此时对 irc.example.net
的访问就会 50%/50% 分配到后端服务器.
永久设置选项
默认情况下对 channel 的设置是临时的, 需要加上 +P
“Permanent” 选项 (会写入数据库文件).
网页管理页面
UnrealIRCd 提供了一个网页可查看服务, 用户信息. (需要额外配置和安装)
安装
这里以 fedora 以及 apache 为例:
1 |
|
之后需要让 unrealircd 加载 JSON-RPC 模块, 在 unrealircd.conf
文件中加入:
1 |
|
之后添加监听的端口以及用户:
1 |
|
配置
假设:
- Webroot 为
/var/www/html
- panel 相关位于 Webroot 下的
unrealircd-webpanel
目录 - Webuser 为
www-data
或nobody
(或http
等)
1 |
|
之后就能用 http://localhost/unrealircd-webpanel/
来访问.
注意配置好 apache 的 php 模块. 这里是一些可能遇到的问题.
打开页面是 php 源码
安装相关包, 以 Archlinux 为例:
1 |
|
在 httpd.conf
中添加:
1 |
|
也要修改线程类型:
1 |
|
之后:
1 |
|
未启用 sodium 扩展
安装 php-sodium
:
1 |
|
配置, 修改 /etc/php/php.ini
文件, 添加:
1 |
|
之后:
1 |
|
unrealircd-webpanel 目录权限有误
如:
这里的提示命令其实是错误的, 可以查看运行 httpd
的用户是谁, 然后重新修改:
1 |
|
因此需要运行:
1 |
|
JSON-RPC
JSON-RPC 提供了一些 API 与 UnrealIRCd 交互, 可获取/修改/添加, 包括 user/channel/severs/bans 等信息. (需要额外配置)
添加 channel history 功能
默认情况下, channel 不会记录历史消息, 可以通过修改 channel mode 来 enable (也需要 client 支持才行).
用 Channel 创建者或者具有 override 权限的 OPER 用户运行:
1 |
|
+H
表明开启 history 记录15:1440
记录最近 1440 分钟内的 15 条消息
History 可以在 server 端具体配置, 如:
1 |
|
其中 set::history::channel::playback-on-join
定义了 +H
的行为.
添加 channel 持久化
需要加载 channeldb.so
模块, 在 unrealircd.conf
文件中加入:
1 |
|
让一个 channel 持久化需要给其加上 +P
mode. 先创建一个 channel:
1 |
|
之后切换到另一个 window, 需要一个具有 override 的 OPER 用户来修改其 mode (channel 的创建者也不行):
1 |
|
此时 channel 即为持续的.