RHEL9で作る自宅サーバ:ircサーバの構築

RHEL9パソコン自宅サーバ

また古いサーバの構築です。昔に使われていたチャットサーバですね。今でいうところのslackに近いのかな。

パッケージがあるかどうか確認します。

[root@ace ~]# dnf info ngircd
サブスクリプション管理リポジトリーを更新しています。
メタデータの期限切れの最終確認: 2:44:32 前の 2024年02月07日 05時09分27秒 に実施 しました。
利用可能なパッケージ
名前         : ngircd
バージョン   : 26.1
リリース     : 8.el9
Arch         : x86_64
サイズ       : 202 k
ソース       : ngircd-26.1-8.el9.src.rpm
リポジトリー : epel
概要         : Next Generation IRC Daemon
URL          : http://ngircd.barton.de/
ライセンス   : GPLv2+
説明         : ngIRCd is a free open source daemon for Internet Relay Chat
             : (IRC), developed under the GNU General Public License (GPL). It's
             : written from scratch and is not based upon the original IRCd like
             : many others.

[root@ace ~]#

ngircdのパッケージがありました。

パッケージからインストール

[root@ace ~]# dnf install ngircd
サブスクリプション管理リポジトリーを更新しています。
メタデータの期限切れの最終確認: 2:46:35 前の 2024年02月07日 05時09分27秒 に実施 しました。
依存関係が解決しました。
================================================================================
 パッケージ       アーキテクチャー バージョン              リポジトリー   サイズ
================================================================================
インストール:
 ngircd           x86_64           26.1-8.el9              epel           202 k

トランザクションの概要
================================================================================
インストール  1 パッケージ

ダウンロードサイズの合計: 202 k
インストール後のサイズ: 580 k
これでよろしいですか? [y/N]: y
:
略
:
インストール済み:
  ngircd-26.1-8.el9.x86_64

完了しました!
[root@ace ~]#

完了!コンパイルするよりすごい楽です。

テキトーに環境設定

ircサーバは通常、他のサーバと接続してサーバ間でもチャットができるようにするのですが、ここでは他のサーバと連携しないので、誰にも迷惑をかけないということで、適当に設定しておきます。

[root@ace ~]# ls -l /etc/ngircd.conf
-rw-rw---- 1 root ngircd 15335  6月 12  2023 /etc/ngircd.conf
[root@ace ~]# cp -p /etc/ngircd.conf /etc/ngircd.conf.orig
[root@ace ~]# vi /etc/ngircd.conf
[root@ace ~]# diff /etc/ngircd.conf /etc/ngircd.conf.orig
28c28
<       Name = irc.zeke.ne.jp
---
>       Name = irc.example.net
32c32
<       AdminInfo1 = ZEKE Network
---
>       ;AdminInfo1 = Description
34c34
<       AdminEMail = zeke@mail.zeke.ne.jp
---
>       ;AdminEMail = admin@irc.server
42c42
<       Info = ZEKE Network
---
>       Info = Server Info Text
48c48
<       Listen = ::,0.0.0.0
---
>       Listen = 127.0.0.1
52c52
<       MotdFile = /etc/ngircd.motd
---
>       ;MotdFile = /etc/ngircd.motd
61c61
<       Network = ZEKE_Network
---
>       ;Network = aIRCnetwork
186c186
<       DNS = no
---
>       ;DNS = yes
191c191
<       Ident = no
---
>       ;Ident = yes
[root@ace ~]#

「/etc/ngircd.conf」が設定ファイルなので、これを書き換えます。替えたのは名前の部分と、外部からの受付許可(IPv6を含む)と、「MotdFile」(ユーザが接続したときに表示するメッセージ)と、DNSによる逆引きとIdent(ユーザ名の調査)を無効にしたことです。Identはconfigureで無効にしていますが、現行の記述をそのまま引き継いでます。

[root@ace ~]# id ngircd
uid=990(ngircd) gid=990(ngircd) groups=990(ngircd)
[root@ace ~]# scp -p ns.zeke.ne.jp:/etc/ngircd.motd /etc/ngircd.motd
root@ns.zeke.ne.jp's password:
ngircd.motd                                   100%  556   381.2KB/s   00:00
[root@ace ~]# cat /etc/ngircd.motd
  このIRCサーバーはZEKE Networkにて動いています。
  サーバーの管理上の都合などにより予告なく停止や再立ち上げ
などを行なうことがあります。
  channelやnicknameに関するトラブルなどは一切関知しません。
  システムへの悪影響を与えること及びその他の理由などにより
管理上の判断によって種々の接続制限を行なうことがあります。

IRC関係のファイルについては、
  ftp://ftp.kyoto.wide.ad.jp/IRC/
  などをご参考下さい。
IRC関係のweb pageとして、次のものがあります。
  http://irc.kyoto-u.ac.jp/
[root@ace ~]# ls -l /etc/ngircd.motd
-rw-r--r-- 1 root root 556  6月 11  2017 /etc/ngircd.motd
[root@ace ~]# ls -l /etc/ngircd.conf
-rw-rw---- 1 root ngircd 15328  2月  7 08:05 /etc/ngircd.conf
[root@ace ~]# chgrp ngircd /etc/ngircd.motd
[root@ace ~]# chmod 660 /etc/ngircd.motd
[root@ace ~]# ls -l /etc/ngircd.motd
-rw-rw---- 1 root ngircd 556  6月 11  2017 /etc/ngircd.motd
[root@ace ~]#

ngircdのユーザ、グループがあることを確認します。

「/etc/ngircd.motd」は現行のサーバからコピーしました。日本語メッセージの文字コードはISO-2022-JP(JIS)コードになってます。権限はngircd.motdと合わせておきました。

試しに動作確認

[root@ace ~]# systemctl status ngircd
○ ngircd.service - Next Generation IRC Daemon
     Loaded: loaded (/usr/lib/systemd/system/ngircd.service; disabled; preset: >
     Active: inactive (dead)
       Docs: man:ngircd(8)
             man:ngircd.conf(5)
             http://ngircd.barton.de/documentation.php.en
[root@ace ~]# systemctl enable ngircd
Created symlink /etc/systemd/system/multi-user.target.wants/ngircd.service → /usr/lib/systemd/system/ngircd.service.
[root@ace ~]# systemctl start ngircd
[root@ace ~]# systemctl status ngircd
● ngircd.service - Next Generation IRC Daemon
     Loaded: loaded (/usr/lib/systemd/system/ngircd.service; enabled; preset: d>
     Active: active (running) since Wed 2024-02-07 08:28:31 JST; 25s ago
       Docs: man:ngircd(8)
             man:ngircd.conf(5)
             http://ngircd.barton.de/documentation.php.en
   Main PID: 1674 (ngircd)
      Tasks: 1 (limit: 23114)
     Memory: 856.0K
        CPU: 7ms
     CGroup: /system.slice/ngircd.service
             mq1674 /usr/sbin/ngircd -n

 2月 07 08:28:31 ace.zeke.ne.jp systemd[1]: Started Next Generation IRC Daemon.
 2月 07 08:28:31 ace.zeke.ne.jp ngircd[1674]: [1674:5    0] ngIRCd 26.1-IPv6+IR>
 2月 07 08:28:31 ace.zeke.ne.jp ngircd[1674]: [1674:6    0] Using configuration>
 2月 07 08:28:31 ace.zeke.ne.jp ngircd[1674]: [1674:6    0] Running as user ngi>
 2月 07 08:28:31 ace.zeke.ne.jp ngircd[1674]: [1674:6    0] Not running with ch>
 2月 07 08:28:31 ace.zeke.ne.jp ngircd[1674]: [1674:6    0] IO subsystem: epoll>
 2月 07 08:28:31 ace.zeke.ne.jp ngircd[1674]: [1674:6    0] Now listening on [0>
 2月 07 08:28:31 ace.zeke.ne.jp ngircd[1674]: [1674:6    0] Now listening on [0>
 2月 07 08:28:31 ace.zeke.ne.jp ngircd[1674]: [1674:5    0] Server "irc.zeke.ne>
[root@ace ~]#

とりあえず「systemctl enable ngircd」で自動起動を有効にし、「systemctl start ngircd」コマンドで立ち上げてみて、動作確認です。

ちゃんとつながって、日本語メッセージも正しく表示されるようですね。

こんな感じで、自動起動設定を書きました。

Firewallの穴あけ

[root@ace ~]# ss -natup|grep ircd
tcp   LISTEN 0      10                               0.0.0.0:6667                                  0.0.0.0:*     users:(("ngircd",pid=1674,fd=7))
tcp   ESTAB  0      0                            192.168.1.1:6667                             192.168.1.88:1074  users:(("ngircd",pid=1674,fd=8))
tcp   LISTEN 0      10                                  [::]:6667                                     [::]:*     users:(("ngircd",pid=1674,fd=6))
[root@ace ~]#

で、ポートの確認をして

[root@ace ~]# firewall-cmd --zone=public --permanent --add-service=irc
success
[root@ace ~]# firewall-cmd --reload
success
[root@ace ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: dns irc ssh
  ports: 5500-5501/tcp
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
[root@ace ~]#
[root@ace ~]# cat /usr/lib/firewalld/services/irc.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>IRC</short>
  <description>An IRCd, short for Internet Relay Chat daemon, is server software that implements the IRC protocol.</description>
  <port protocol="tcp" port="6667"/>
</service>
[root@ace ~]#

で、バッチリです。

おまけ

ircのbotとして、c言語で書かれている1995年製の

   _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
   _/               HOFBOT IS DEDICATED TO DREAM DELTA GROUP               _/
   _/THIS HOFBOT V1.03F DOES NOT CONTAIN ANY BACKDOORS OR WHAT SO EVER.    _/
   _/THERE ARE TWO WAYS TO GET THE NEWEST HOFBOT VERSION OR OTHER HOFBOT   _/
   _/RELATED INFORMATION:                                                  _/
   _/1. VIA BOT(S) IN #HOF OR #HOFBOT ON IRC(efnet or undernet)            _/
   _/2. HTTP://WWW.UG.CS.SUNYSB.EDU/~POONJ/HOFBOT.HTML            -*HOF*-  _/
   _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

を使っているのだけど、RHEL9でコンパイルすると

hofbot.c: 関数 ‘add_bot’ 内:
hofbot.c:113:36: エラー: expected identifier before ‘restrict’
  113 |                         thebots[i].restrict = 0;
      |                                    ^~~~~~~~

こんなエラーが出るようになりました。CentOS 7では大丈夫だったので、gccの仕様が変わった模様。

[zeke@ace source]$ grep hof_restrict *
commands.c:     if (current->hof_restrict)
commands.c:                              current->hof_restrict);
commands.c:             if (current->hof_restrict)
commands.c:                                       current->hof_restrict);
commands.c:      current->hof_restrict = newlevel;
hof-ons.c:                      if ((max_userlevel(from) < current->hof_restric ) &&
hof-ons.c:                              send_to_user(from, "
[zeke@ace source]$ grep hof_restrict *
commands.c:     if (current->hof_restrict)
commands.c:                              current->hof_restrict);
commands.c:             if (current->hof_restrict)
commands.c:                                       current->hof_restrict);
commands.c:      current->hof_restrict = newlevel;
hof-ons.c:                      if ((max_userlevel(from) < current->hof_restric ) &&
hof-ons.c:                              send_to_user(from, "\002Sorry, I'm being restricted to at least level %i\002", current->hof_restrict);
hofbot.c:                       thebots[i].hof_restrict = 0;
hofbot.h:       int             hof_restrict;
[zeke@ace source]$
2Sorry, I'm being restricted to at least level %i
[zeke@ace source]$ grep hof_restrict *
commands.c:     if (current->hof_restrict)
commands.c:                              current->hof_restrict);
commands.c:             if (current->hof_restrict)
commands.c:                                       current->hof_restrict);
commands.c:      current->hof_restrict = newlevel;
hof-ons.c:                      if ((max_userlevel(from) < current->hof_restric ) &&
hof-ons.c:                              send_to_user(from, "\002Sorry, I'm being restricted to at least level %i\002", current->hof_restrict);
hofbot.c:                       thebots[i].hof_restrict = 0;
hofbot.h:       int             hof_restrict;
[zeke@ace source]$
2", current->hof_restrict); hofbot.c: thebots[i].hof_restrict = 0; hofbot.h: int hof_restrict; [zeke@ace source]$

どうも「restrict」を変数として使っていたのに、予約語にされてしまったっぽいので、変数名を「hof_restrict」に変更してみたら、コンパイルが通ってちゃんと動いているみたい。

うーむ、適当だ。

ちなみにこのプログラム、1日1回ログを取るためにファイルをオープンするのだけど、ログファイルのクローズをしないために、ファイルディスクリプタを食いつぶして、プロバイダの共用サーバを止めちゃったといういわくつきです。

自力でなんとかバグ修正して、自宅サーバで動かしてます。

お勧めのKindle本です!

コメント