建立-IRC-服务器

UnrealIRCd 官网

介绍

这里用 UnrealIRCd 来搭建.

UnrealIRCd 是一个开源的 IRC Server 软件, 其模块化以及安全做得比较好, 可以用配置文件深度配置.

安装

从源码编译安装

官网上的详细步骤

至少需要编译器以及 OpenSSL library, 以 Ubuntu 为例:

1
sudo apt-get install build-essential pkg-config gdb libssl-dev libpcre2-dev libargon2-dev libsodium-dev libc-ares-dev libcurl4-openssl-dev

注意不要用 root 编译和运行 IRCd.

具体步骤如下:

1
2
3
4
5
6
wget --trust-server-names https://www.unrealircd.org/downloads/unrealircd-latest.tar.gz
tar xzvf unrealircd-6.1.X.tar.gz
cd unrealircd-6.1.X
./Config
make
make install

也可以用 git 拉取:

1
2
git clone https://github.com/unrealircd/unrealircd.git
cd unrealircd

包管理器

比如在 Archlinux 上可直接用 pacman 安装:

1
sudo pacman -S unrealircd

Docker 安装

1
docker pull ircd/unrealircd

配置

创建配置文件

1
2
cd ~/unrealircd
cp conf/examples/example.conf conf/unrealircd.conf

(~/unrealircd 为前面编译的目录)

配置语法

官方配置语法文档
UnrealIRCd 都使用 block-based-format (也就是基于 “块”), 比如:

1
2
3
<block-name> <block-value> {
<block-directive> <directive-value>;
}
  • <block-value> 有些不需要设置
  • <block-directive> 行需要以 ; 结尾
  • <directive-value> 也可以是一个 block

比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
me {
name "irc.something.net";
sid 001;
info "Some nice server";
}

log ircd.log {
flags {
errors;
}
}

set {
maxchannelsperuser 10;

options {
hide-ulines;
}

anti-flood {
connect-flood 3:60;
nick-flood 3:60;
}
}

上述的定义可以用一种特殊的 notation 来引用, 比如第一个 block 中的 name, 可以记为 me::name

注释可以为:

1
2
3
4
5
# This is a single line comment (type 1)
// This is also a single line comment (type 2)
/* This is a
multi line
comment */

基本使用

启动服务

1
./unrealircd start

特性

unrealircd 官网详细说明

模块化

比如一些 channel modes, user modes 都在模块里可以自己添加.

加载模块

unrealircd.conf 中添加:

1
include "modules.default.conf";

查找可用的模块

可以查看 modules.default.conf 文件, 其他的可以查看下面链接:

第三方模块, 可在 这里查找.

如何使用第三方模块可查看 How to install 3rd party modules.

认证

比如可以限制连接的 IP, 具体可以看 这里.

SSL/TLS

几乎所有 IRC 客户端都支持 SSL/TLS, 但需要在连接时指定启用了 SSL 的端口 (具体配置可见 官方文档), 默认是 6697.

比如用 irssi 连接时:

1
/connect -tls name.of.server 6697

默认情况, UnrealIRCd 会创建一个自签名证书, 但大多情况下 client 会将其标记为 untrusted 导致 refuse to connect. 可以用 Let's Encrypt 自己申请.

Oper block

官网具体内容

可以在 oper block 中定义 IRC Operator 账号. 之后则可以用 /OPER 切换到 IRCOp 账号.

定义语法为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
oper <name> {
/* Required items: */
mask <hostmask>;
class <class-name>;
operclass <operclass-name>;
/* Optional items to further limit who can /OPER */
password <password>;
auto-login <yes|no>;
require-modes <modes>
maxlogins <num>;
/* Optional items to define what will be set upon successful /OPER */
vhost <new virtual hostname>;
swhois <whois info>;
modes <modes>;
snomask <snomask>;
server-notice-colors yes|no;
server-notice-show-event yes|no;
};
  • <name><password> 用于切换到 OPER 用户时的认证, 如 /OPER name password
  • mask 指定哪些 host/IP 可以登录到 OPER, 比如 mask *; 表示允许所有, mask { 192.168.0.0/16; *.example.net; } 指定 host/IP
  • class, 用于管理用户权限, 定义 class 的语法后头讲
  • operclass, 用于配置 IRCOp 权限, 默认 list of operclasses 可以在 这里查看, 权限最高的为 netadminnetadmin-with-override
  • auto-login, 对于满足 mask 的 host/IP 可以免密登录
  • maxlogins, 限制同时从 host/IP 登录的用户数
  • vhost, “virtual host”, 在登录成功后会设置成 hostname
  • swhois, 添加信息到 /WHOIS 的输出, 比如 swhois "a Network Administrator";
  • modes, 用于设置 user modes
  • snomask, “server notice mask”, 即设置一个 mask, 控制给用户的通知信息, 默认使用 set::snomask-on-oper 设置的值
  • auto-join, 设置登录到 OPER 时加入的 channel, 如 auto-join "#opers,#staff";. 默认情况下登录到 set::oper-auto-join 的值

示例:

1
2
3
4
5
6
7
oper bobsmith {
class opers;
mask { smithco.com; *.somedialupisp.com; };
password "f00";
operclass netadmin;
swhois "a Network Administrator";
};

IRC Operator Guide

具体内容可见官网

IRC Operator 的一些权限包括:

  • 可以加入任何 channel
  • 可以获取任何 channel 的管理员权限
  • 可以 kick or ban a user

踢出一个 user

即让一个 user 断开连接:

1
/KILL nickname reason

(用户可以尝试重新连接)

Ban 掉一个用户

可以指定 ban 的时间, 即这段时间内无法连接上当前服务器:

1
/KLINE *@blah.example.org 3600 please go away for at least an hour

也可以让用户无法连接到整个网络中的所有服务器, 如:

1
/GLINE *@blah.example.org 7200 please go away for at least two hours

若用 /ZLINE/GZLINE, 可以让用户不产生 handshake.

解除一个用户的 ban 状态

/ELINE 如:

1
/ELINE *@198.51.100.1 kGzZ 0 Trusted user

也可以用 /KLINE:

1
/KLINE -user@host

之后用户就可以重新连接到服务器.

防止部分用户被 ban 掉

1
2
3
4
except ban {
mask *@198.51.100.1;
type all;
};

这样来自 198.51.100.1 的所有主机都不会被 ban.

查看信息

用户列表

1
/WHO

可以查看连接到 network 的所有用户.

1
/WHO +R

可以查看所有 real hosts.

1
/WHO +I

可以查看所有 IP addresses.

查看用户详细信息

1
/WHOIS nickname

查看 channel 列表

1
/LIST

查看 ban list

1
/MODE #channel b

查看 channel members

1
/NAMES #channel

或:

1
/WHO #channel

加入本不可加入的 channel

如果加入一个 channel 时报错 Channel is invite only (+i), 则可:

1
2
/INVITE myself #drones
/JOIN #drones

若有 override 权限, 则可用:

1
/SAJOIN myself #drones

更换 modes

如果有 override 权限, 则可改变 channel 的权限:

1
/MODE #channel -i

让自己无法被 ban

1
/MODE yournick +q

Linking Servers

如果想让 IRC network 跑在多个 server 上, 则需要 “link”.

具体搭建方式可见官网.

负载均衡

可见 官网.

永久设置选项

默认情况下对 channel 的设置是临时的, 需要加上 +P “Permanent” 选项 (会写入数据库文件).

网页管理页面

UnrealIRCd 提供了一个网页可查看服务, 用户信息. (需要额外配置和安装)

JSON-RPC

JSON-RPC 提供了一些 API 与 UnrealIRCd 交互, 可获取/修改/添加, 包括 user/channel/severs/bans 等信息. (需要额外配置)


建立-IRC-服务器
http://example.com/2024/10/02/建立-IRC-服务器/
作者
Jie
发布于
2024年10月2日
许可协议