302013
 

1.什么是IRC

IRC(Internet Relay Chat)是一种即时的网上聊天论坛。它可以支持用户进行一对一或者多对多的网上通信,以及文件的传输。一个IRC服务器还可以加入到其他的IRC服务器当中从而不断扩充IRC服务器的数量和连接(当然我自己的实验只是构造一个在局域网中使用的IRC,所以这一点不加以讨论)

2.服务器的选择和安装

因为我自己是Debian的用户,所以我就选择了在发行版中自带的ircu (The Undernet Internet Relay Chat Daemon)(当然还有其他很不错的server比如UnrealIRCd和ircd-hybrid)

以”root”用户登录执行以下命令就可以了

# apt-get install ircd-ircu

如果想查看一下具体安装了哪些文件可以使用dpkg命令

# dpkg -c ircd-ircu_<release number>.deb

或者你也可以去到官方网站下载源码包然后自己编译http://coder-com.undernet.org/

3.服务器的配置

安装完毕后我们就应该可以在/etc/ircd目录中找到ircu的配置文件了,其中包括了:

ircd.conf (主要的配置文件)
ircd.motd
oper.motd
remote.motd

这应该是最关键的一步了。和其他的IRC服务器比较起来我觉得ircu的配置文件是最难读懂的,因为里面几乎没有任何注释,连man page也没有。我想这是Undernet以后应该改进的地方。不过没关系,在/usr/share/doc/ircd-ircu这个目录中它还是给出了很多example的配置文件,里面的注释就比较详尽。这里再指出一点就是我是建立一个只供局域网内部用户使用的IRC服务器,所以任何涉及连接到外部服务器的配置都会不加以讨论。好了,那我们来看一下如何配置ircd.conf文件吧。

打开这个文件后你会看到很多以子母打头的line,每一个子母都代表了对服务器不同功能的配置,我们来逐一分析一下。

名称: M line
格式: M:[server name]:[virtual host]:[description]::[numeric]
注释: M line主要是用来定义服务器的信息
[server name]服务器的名字
[virtual host]连接外部的IP地址(可以设置成服务器主网卡的IP地址)
[description]对服务器的介绍
[numeric]定义服务器的数字ID,应用于服务器与服务器之间的连接。必须是唯一的
举例: M:leonard.home:192.168.1.7:Leonard’s first IRC server::1

名称: A line
格式: A:[line 1]:[line 2]:[line 3]
注释: A line主要定义服务器的管理信息(也就是你登录IRC之后输入/Admin看到的信息)。
举例: A:Administrator is Leonard:Please contact me using the following email:leonard@hotmail.com

名称: Y lines
格式: Y:[class]:[ping frequency]:[connect frequency]:[maximum links]:[maximum sendq]
注释: Y lines是来定义连接的类别,也就是说给每个到我们服务器的连接分配不同的资源和设置
[ping frequency]服务器ping客户端的频率(以测试其是否alive),单位为秒
[class]这项类别的数字ID
[connect frequency]对于外部服务器的连接频率,单位为秒
[maximum links]外来的最大连接数
[maximum sendq]外来的最大可以被积压的传输数据,单位为bytes
举例: # A class for very welcome clients (users in LAN, for example)
Y:10:90:0:200:65536
# A class that will allow only a limited number of connections
Y:20:90:0:50:32768

名称: I lines
格式: I:[address/hostmask]:[password/limit]:[hostmask]::[class]
注释: I lines是用来对于每个试图连接服务器的客户进行验证,并把他们归入到Y lines的类别中去。验证方法如下:
1.对于任何试图连接的IP,服务器会先做一个reverse lookup
2.如果得到了其hostname,那么将会去找对应的hostmask
3.如果没有找到hostname,那么将会去找对应的ip mask
4.如果没有一行I line与之相对应那么连接将会被拒绝
[address/hostmask]客户端的地址或域名。可以使用wild card e.g. ?, *
[password/limit]设置密码或者是连接数量。如果设为0的那话那么就是指没有连接限制
[class]在Y lines中定义的class
举例:这里需要指出的是I line中的配置文件都是倒过来验证的。所以我们应该先定义gerneral rules再来定义more specific rules
#我将所有局域网的用户归为class 10,其他的归为20
I:*@*::Unresolved::20
I:Resolved::*@*::20
I:*@192.168.1.*:2:Unresolved::10

名称: K lines
格式: K:[mask]:["reason"]:[username]
注释:虽然在I lines中也可以做到限制用户的登录,但是K lines才是真正用来屏蔽用户登录的
[mask]可以是IP地址或域名。注意如果使用IP的话需要用小写的k.支持wild cards e.g. * 还可以使用$R来屏蔽用户的real name
[reason]给出一个拒绝用户登录的理由。注意需要用双引号。如果以!开头,那么后面应该跟文件名
[username]客户端的用户名
举例:K:*.com:”Please leave us with peace”:*
k:147.197.*”No connection from my uni”:* #屏蔽IP的话需要用小写的k
K:$R*sub7*:”You are infected with a Trojan”:*

名称: O lines
格式: O|o:[host|ip mask]:[password]:[nick]::[class]
注释: O lines是用来使连接的用户获得管理员的权限。大写的O使用来指定global operator也就是所有连接服务器的管理员。小写的o是用来指定本地管理员
[host|ip mask] IP地址或者域名
[password]管理员密码。使用tools/mkpasswd来生成(在新版本中已换成umkpasswd)
[nick]用户连接使用的昵称
[class]把用户归为此class
举例: #只有在局域网中以leonard昵称登录并正确输入密码后才可以成为管理员
o:192.168.1.*:5rxV6zRJ8FgHE:leonard::1

名称: P lines
格式: P:[IP-mask]:[address]:[status]:[port]
注释: P lines是用来定义服务器绑定的端口以及其接受连接的类型
[IP-mask]定义了哪些IP地址可以连接到这个端口
[address]可以绑定端口的服务器本地IP address
[status] 客户端为”C”,服务器为”S”.同时你还可以在后加上H用来代表status为隐藏
[port]服务器绑定的端口。必须大于1024。通常为6667
举例: #设定一个只有局域网客户可以连接的端口
P:192.168.1.*:192.168.1.7:CH:6667

名称: T lines
格式: T:[hostmask|class]:[motd-file]
注释:根据不同用户的地址或者类别来决定显示哪个motd(message of today)文件
[hostmaks] IP地址或者域名
[class] Y lines中的类别
[motd-file]指定motd文件
举例: T:192.168.1.*:local.motd
T:20:external.motd

名称: F lines
格式: F:[feature]:[value]
注释:设置服务器的附加属性。以前ircu需要你把很多的附加属性在compile的时候就指定编译,为了方便起见这里提供了F lines
举例:由于可以指定的属性比较多,这里就不一一列数了,可以参考/usr/share/doc/ircd-ircu/readme.features.gz

到此为止我罗列了一些需要搭建一个standalone IRC Server所需要的最基本的配置。还有很多line的用法这里没有提到,因为他们中大多书都是涉及到连接其他的服务器


4.启动IRC Server

如果你是用apt安装的话,那么在ircu的包中应该已经包括了一个rc script。你只需以”root”来执行以下命令就可以了

# /etc/init.d/ircd-ircu start

如果改变了ircd.conf后想重载设置文件的话可以用

# /etc/init.d/ircd-ircu reload

如果你是用源代码编译的话,可以找到ircd的binary文件然后运行。一定要注意的是千万不要用root来执行ircd程序,这样会给你的系统造成很大的安全隐患。在安装的过程中ircu一般会在系统中建立一个名为irc的用户,可以先su irc,然后再执行ircd。(上面用rc script的时候会自动以irc用户来运行服务器,所以没有问题)

5.安全设置

总的来说IRC不是一个自身带有很强安全性的service,所以我列举几条自己认为需要注意的问题:

1.刚才已经提到过了用root启动ircu是不安全的,好在现在大多数的IRC服务器都不允许你直接以root来运行,它会自行中止程序并给出提示。
2.另外尽量隐藏你服务器和客户端的信息也是一个增强安全设置的好方法。Undernet自己就曾经被DDos攻击过。同时你也可以修改指定的端口(6667)
3.用Y lines和I lines来对用户进行严格分类
4.用P lines来限制用户的连接
5.用K lines来屏蔽不信任的用户
6.谨慎地给与用户管理员的权利。把可以成为管理员的[hostmask]设置到越精确越好
7.安装带有SSL支持的IRC服务器
8.另外永远不要只依赖一项工具来保证你的安全性。我们还可以用iptables来禁止局域网以外的用户来登陆IRC服务器
# iptables -A INPUT -s ! 192.168.1.0 -p tcp –dport 6667 -j DROP

6.日志文件

日志文件始终是我们监测一个服务器运行状况的好工具。ircu提供了多种日志的方式,包括常规的syslog,自己设置的日志文件以及可以把日志记录在另一台服务器上。同时在F lines里我们也可以设置不同日志文件的名称以及日志的级别。Default的日志文件都储存在/var/log/ircd目录下

7. IRC客户端软件

终于设置好了服务器,那么就找一些客户端来测试以下吧

ircII (http://www.eterna.com.au/ircii/)
这个是linux下的终端样式的IRC client.有着比较强大的命令行功能。还有就是也这是Debian发行版里有的软件,所以偷懒一下的话又是apt就可以了

xchat (http://www.xchat.org)
老牌的linux下的IRC client,据说功能十分强大,不过我没有用过就不多加评论了

gaim (http://www.pidgin.im/)
我个人十分喜欢这个软件,原因是因为gaim可以支持很多种protocol,这样就可以同时运行很多种不同的聊天工具。试想一下一款可以让你同时开着msn, qq, google talk, yahoo messenger, icq and IRC的软件会是多好啊(呵呵,当然如果你开那么多的话一定忙死)。还有就是我感觉gaim在Windows下的稳定性也很好

ChatZilla (http://www.mozilla.org/projects/rt-messaging/chatzilla/)
这是一款基于浏览器的IRC插件,用firefox的朋友可以轻松地安装上它,这样开着网页的时候就可以和IRC上的朋友们交谈了

至于IRC的命令我看论坛里很多好的贴子都介绍过了,我在这里就不重复了

8.参考资料

The Linux Documentation Project(IRC mini-HOWTO): http://tldp.org/HOWTO/IRC/index.html
Undernet: http://coder-com.undernet.org/
IRC Wiki: http://en.wikipedia.org/wiki/Internet_Relay_Chat

对不起,评论功能目前被关闭。