CentOS8で構築する自宅サーバ:ircサーバの構築

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

CentOS 7のときは、パッケージがあったのですが、CentOS 8になって、パッケージが用意されていないみたいです。

[root@ace src]# dnf search ircd
メタデータの期限切れの最終確認: 0:12:40 時間前の 2020年02月25日 21時49分28秒 に 実施しました。
============================ 名前 & 概要 一致: ircd ============================
nagios-plugins-ircd.x86_64 : Nagios Plugin - check_ircd
=============================== 概要 一致: ircd ================================
lirc-drv-irman.x86_64 : lircd(8) plugin for handling IrMan devices.
[root@ace src]#

なので、ソースからコンパイルしてインストールします。

公式サイトからソースをgetしてコンパイル

今回インストールするのは、ngircdで公式サイトはこちらになります。

[root@ace ~]# cd /usr/local/src/
[root@ace src]# wget https://ngircd.barton.de/pub/ngircd/ngircd-25.tar.gz
--2020-02-25 22:00:12--  https://ngircd.barton.de/pub/ngircd/ngircd-25.tar.gz
ngircd.barton.de (ngircd.barton.de) をDNSに問いあわせています... 2001:470:1f0b:18e4::cafe, 95.208.52.79
ngircd.barton.de (ngircd.barton.de)|2001:470:1f0b:18e4::cafe|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 301 Moved Permanently
場所: https://arthur.barton.de/pub/ngircd/ngircd-25.tar.gz [続く]
--2020-02-25 22:00:13--  https://arthur.barton.de/pub/ngircd/ngircd-25.tar.gz
arthur.barton.de (arthur.barton.de) をDNSに問いあわせています... 2001:470:1f0b:18e4::cafe, 95.208.52.79
arthur.barton.de (arthur.barton.de)|2001:470:1f0b:18e4::cafe|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 527886 (516K) [application/x-gzip]
`ngircd-25.tar.gz' に保存中

ngircd-25.tar.gz    100%[===================>] 515.51K   174KB/s 時間 3.0s

2020-02-25 22:00:17 (174 KB/s) - `ngircd-25.tar.gz' へ保存完了 [527886/527886]

[root@ace src]#

[root@ace src]# tar xfz ngircd-25.tar.gz
[root@ace src]# cd ngircd-25
[root@ace ngircd-25]# ls
AUTHORS    Makefile.am  aclocal.m4    config.sub    contrib     man
COPYING    Makefile.in  ar-lib        configure     depcomp     missing
ChangeLog  NEWS         autogen.sh    configure.ac  doc         src
INSTALL    README       config.guess  configure.ng  install-sh
[root@ace ngircd-25]#

公式サイトから、ソースプログラムを/usr/local/srcにダウンロードして展開します。展開した中のINSTALLとかREADMEなんて名前のファイルにインストール方法などが書いてあるのでチェックです。

[root@ace ngircd-25]# cat INSTALL
:
省略
:
* Red Hat / Fedora based distributions:

  yum install \
    autoconf automake expect gcc glibc-devel gnutls-devel \
    libident-devel make pam-devel tcp_wrappers-devel telnet zlib-devel
:
省略
:
- /usr/local/sbin/ngircd: executable server
- /usr/local/etc/ngircd.conf: sample configuration (if not already present)
- /usr/local/share/doc/ngircd/: documentation
- /usr/local/share/man/: manual pages
:
省略
:
[root@ace ngircd-25]#

事前に必要なパッケージは「autoconf automake expect gcc glibc-devel gnutls-devel libident-devel make pam-devel tcp_wrappers-devel telnet zlib-devel」ですね。今入っているパッケージを見ると

[root@ace ngircd-25]# dnf list installed autoconf automake expect gcc glibc-devel gnutls-devel \
>     libident-devel make pam-devel tcp_wrappers-devel telnet zlib-devel
インストール済みパッケージ
gcc.x86_64                          8.3.1-4.5.el8                     @AppStream
glibc-devel.x86_64                  2.28-72.el8_1.1                   @BaseOS
make.x86_64                         1:4.2.1-9.el8                     @BaseOS
telnet.x86_64                       1:0.17-73.el8                     @AppStream
[root@ace ngircd-25]#

ちょっと足りませんね。でも必要のない機能もあるので、zlib-devel(ファイル圧縮用ライブラリ)だけインストールしておきました。

[root@ace ngircd-25]# ./configure --help
`configure' configures ngIRCd 25 to adapt to many kinds of systems.

Usage: ./configure [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:
  -h, --help              display this help and exit
      --help=short        display options specific to this package
      --help=recursive    display the short help of all the included packages
  -V, --version           display version information and exit
  -q, --quiet, --silent   do not print `checking ...' messages
      --cache-file=FILE   cache test results in FILE [disabled]
  -C, --config-cache      alias for `--cache-file=config.cache'
  -n, --no-create         do not create output files
      --srcdir=DIR        find the sources in DIR [configure dir or `..']

Installation directories:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [/usr/local]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [PREFIX]

By default, `make install' will install all the files in
`/usr/local/bin', `/usr/local/lib' etc.  You can specify
an installation prefix other than `/usr/local' using `--prefix',
for instance `--prefix=$HOME'.

For better control, use the options below.

Fine tuning of the installation directories:
  --bindir=DIR            user executables [EPREFIX/bin]
  --sbindir=DIR           system admin executables [EPREFIX/sbin]
  --libexecdir=DIR        program executables [EPREFIX/libexec]
  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
  --libdir=DIR            object code libraries [EPREFIX/lib]
  --includedir=DIR        C header files [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
  --infodir=DIR           info documentation [DATAROOTDIR/info]
  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
  --mandir=DIR            man documentation [DATAROOTDIR/man]
  --docdir=DIR            documentation root [DATAROOTDIR/doc/ngircd]
  --htmldir=DIR           html documentation [DOCDIR]
  --dvidir=DIR            dvi documentation [DOCDIR]
  --pdfdir=DIR            pdf documentation [DOCDIR]
  --psdir=DIR             ps documentation [DOCDIR]

Program names:
  --program-prefix=PREFIX            prepend PREFIX to installed program names
  --program-suffix=SUFFIX            append SUFFIX to installed program names
  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names

System types:
  --build=BUILD     configure for building on BUILD [guessed]
  --host=HOST       cross-compile to build programs to run on HOST [BUILD]

Optional Features:
  --disable-option-checking  ignore unrecognized --enable/--with options
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --enable-silent-rules          less verbose build output (undo: `make V=1')
  --disable-silent-rules         verbose build output (undo: `make V=0')
  --disable-dependency-tracking  speeds up one-time build
  --enable-dependency-tracking   do not reject slow dependency extractors
  --disable-ircplus       disable IRC+ protocol
  --enable-ipv6           enable IPv6 protocol support
  --enable-sniffer        enable IRC traffic sniffer (enables debug mode)
  --enable-debug          show additional debug output
  --enable-strict-rfc     strict RFC conformance -- may break clients!

Optional Packages:
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --without-syslog        disable syslog (autodetected by default)
  --without-zlib          disable zlib compression (autodetected by default)
  --without-select        disable select IO support (autodetected by default)
  --without-poll          disable poll support (autodetected by default)
  --without-devpoll       disable /dev/poll IO support (autodetected by
                          default)
  --without-epoll         disable epoll IO support (autodetected by default)
  --without-kqueue        disable kqueue IO support (autodetected by default)
  --with-openssl          enable SSL support using OpenSSL
  --with-gnutls           enable SSL support using gnutls
  --with-tcp-wrappers     enable TCP wrappers support
  --with-ident            enable "IDENT" ("AUTH") protocol support
  --with-pam              enable user authentication using PAM
  --with-iconv            enable character conversion using libiconv

Some influential environment variables:
  CC          C compiler command
  CFLAGS      C compiler flags
  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
              nonstandard directory <lib dir>
  LIBS        libraries to pass to the linker, e.g. -l<library>
  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
              you have headers in a nonstandard directory <include dir>
  CPP         C preprocessor

Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.

Report bugs to <ngircd-ml@ngircd.barton.de>.
ngIRCd home page: <http://ngircd.barton.de/>.
[root@ace ngircd-25]#

「./configure –help」コマンドで使えるオプションを検討します。IPv6とiconv(文字コード変換)だけは有効にしたほうがいいかな。

インストールディレクトリはコマンドや設定ファイルだけなので、/usr/localのままで良いでしょう。

ということで

[root@ace ngircd-25]# ./configure --enable-ipv6 --with-iconv
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
:
省略
:
ngIRCd 25 has been configured with the following options:

               Host: x86_64-pc-linux-gnu
           Compiler: gcc
     Compiler flags: -g -O2 -pipe -W -Wall -Wpointer-arith -Wstrict-prototypes -fstack-protector -DSYSCONFDIR='"$(sysconfdir)"' -DDOCDIR='"$(docdir)"'
          Libraries: -lz

    'ngircd' binary: /usr/local/sbin
 Configuration file: /usr/local/etc
       Manual pages: /usr/local/share/man
      Documentation: /usr/local/share/doc/ngircd

     Syslog support: yes     Enable debug code: no
   zlib compression: yes           IRC sniffer: no
   Use TCP Wrappers: no        Strict RFC mode: no
      IDENT support: no          IRC+ protocol: yes
      IPv6 protocol: yes           I/O backend: epoll(), select()
        PAM support: no            SSL support: no
   libiconv support: yes

[root@ace ngircd-25]#

と、コンパイル環境は問題なく設定完了です。

[root@ace ngircd-25]# make
Making all in doc
make[1]: ディレクトリ '/usr/local/src/ngircd-25/doc' に入ります
Making all in src
make[2]: ディレクトリ '/usr/local/src/ngircd-25/doc/src' に入ります
make[2]: 'all' に対して行うべき事はありません.
:
:
make[1]: ディレクトリ '/usr/local/src/ngircd-25' に入ります
make[1]: 'all-am' に対して行うべき事はありません.
make[1]: ディレクトリ '/usr/local/src/ngircd-25' から出ます
[root@ace ngircd-25]#

[root@ace ngircd-25]# make install
Making install in doc
make[1]: ディレクトリ '/usr/local/src/ngircd-25/doc' に入ります
:
:
make[2]: ディレクトリ '/usr/local/src/ngircd-25' から出ます
make[1]: ディレクトリ '/usr/local/src/ngircd-25' から出ます
[root@ace ngircd-25]#

なんとなく、上手くインストールができました。

テキトーに環境設定

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

[root@ace ngircd-25]# ls -l /usr/local/sbin/
合計 892
-rwxr-xr-x 1 root root 910248  2月 25 22:23 ngircd
[root@ace ngircd-25]#
[root@ace ngircd-25]# ls -l /usr/local/etc/
合計 16
-rw------- 1 root root 15212  2月 25 22:23 ngircd.conf
[root@ace ngircd-25]#

[root@ace ngircd-25]# cp -p /usr/local/etc/ngircd.conf /usr/local/etc/ngircd.con
f.orig
[root@ace ngircd-25]#


[root@ace ngircd-25]# cp -p /usr/local/etc/ngircd.conf /usr/local/etc/ngircd.con
f.orig
[root@ace ngircd-25]# vi /usr/local/etc/ngircd.conf
[root@ace ngircd-25]# diff /usr/local/etc/ngircd.conf /usr/local/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
52c52
<       MotdFile = /usr/local/etc/ngircd.motd
---
>       ;MotdFile = /usr/local/etc/ngircd.motd
61c61
<       Network = ZEKE_Network
---
>       ;Network = aIRCnetwork
80c80
<       ServerGID = ngircd
---
>       ;ServerGID = 65534
87c87
<       ServerUID = ngircd
---
>       ;ServerUID = 65534
186c186
<       DNS = no
---
>       ;DNS = yes
191c191
<       Ident = no
---
>       ;Ident = yes
[root@ace ngircd-25]#

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

[root@ace ngircd-25]# vi /usr/local/etc/ngircd.motd
[root@ace ngircd-25]# cat /usr/local/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 ngircd-25]#

[root@ace ngircd-25]# groupadd -r ngircd
[root@ace ngircd-25]# adduser -d / -g ngircd -r -s /sbin/nologin ngircd
[root@ace ngircd-25]#
[root@ace ngircd-25]# grep ngircd /etc/passwd
ngircd:x:993:990::/:/sbin/nologin
[root@ace ngircd-25]#

「/usr/local/etc/ngircd.motd」を作っておきます。昔のものをそのまま使っているので、日本語メッセージの文字コードはISO-2022-JP(JIS)コードになってます。

また、ngircdのグループとユーザも作っておきます。

試しに動作確認

[root@ace ngircd-25]# /usr/local/sbin/ngircd --help
ngIRCd 25-CHARCONV+IPv6+IRCPLUS+SYSLOG+ZLIB-x86_64/pc/linux-gnu
Copyright (c)2001-2019 Alexander Barton (<alex@barton.de>) and Contributors.
Homepage: <http://ngircd.barton.de/>

This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

  -f, --config <f>   use file <f> as configuration file
  -n, --nodaemon     don't fork and don't detach from controlling terminal
  -p, --passive      disable automatic connections to other servers
  -t, --configtest   read, validate and display configuration; then exit
  -V, --version      output version information and exit
  -h, --help         display this help and exit

[root@ace ngircd-25]# /usr/local/sbin/ngircd -n
[14188:5    0] ngIRCd 25-CHARCONV+IPv6+IRCPLUS+SYSLOG+ZLIB-x86_64/pc/linux-gnu started.
[14188:6    0] Using configuration file "/usr/local/etc/ngircd.conf" ...
[14188:6    0] Running as user ngircd(993), group ngircd(990), with PID 14188.
[14188:6    0] Not running with changed root directory.
[14188:6    0] IO subsystem: epoll (hint size 100, initial maxfd 100, masterfd 3).
[14188:6    0] Now listening on [0::]:6667 (socket 9).
[14188:6    0] Now listening on [0.0.0.0]:6667 (socket 10).

とりあえず「ngircd -n」コマンドで立ち上げてみて、動作確認です。

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

自動起動設定をする

[root@ace ngircd-25]# vi /etc/systemd/system/ngircd.service
[root@ace ngircd-25]# cat /etc/systemd/system/ngircd.service
[Unit]
Description=Next Generation IRC Daemon
After=network.target

[Service]
ExecStart=/usr/local/sbin/ngircd -n
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target

[root@ace ngircd-25]# systemctl enable ngircd
Created symlink /etc/systemd/system/multi-user.target.wants/ngircd.service → /etc/systemd/system/ngircd.service.
[root@ace ngircd-25]# systemctl start ngircd
[root@ace ngircd-25]# systemctl status ngircd
● ngircd.service - Next Generation IRC Daemon
   Loaded: loaded (/etc/systemd/system/ngircd.service; enabled; vendor preset: >
   Active: active (running) since Wed 2020-02-26 00:46:16 JST; 6s ago
 Main PID: 14314 (ngircd)
    Tasks: 1 (limit: 25027)
   Memory: 556.0K
   CGroup: /system.slice/ngircd.service
           mq14314 /usr/local/sbin/ngircd -n

 2月 26 00:46:16 ace.lo.zeke.ne.jp ngircd[14314]: [14314:6    0] Running as use>
 2月 26 00:46:16 ace.lo.zeke.ne.jp ngircd[14314]: [14314:6    0] Not running wi>
 2月 26 00:46:16 ace.lo.zeke.ne.jp ngircd[14314]: [14314:6    0] IO subsystem: >
 2月 26 00:46:16 ace.lo.zeke.ne.jp ngircd[14314]: [14314:6    0] Now listening >
 2月 26 00:46:16 ace.lo.zeke.ne.jp ngircd[14314]: [14314:6    0] Now listening >
 2月 26 00:46:22 ace.lo.zeke.ne.jp ngircd[14314]: [14314:6    6] Accepted conne>
 2月 26 00:46:22 ace.lo.zeke.ne.jp ngircd[14314]: [14314:5    6] User "ZEKEJapa>
 2月 26 00:46:23 ace.lo.zeke.ne.jp ngircd[14314]: [14314:6    7] Shutting down >
 2月 26 00:46:23 ace.lo.zeke.ne.jp ngircd[14314]: [14314:5    7] User "ZEKEJapa>
 2月 26 00:46:23 ace.lo.zeke.ne.jp ngircd[14314]: [14314:6    7] Connection 11 >
[root@ace ngircd-25]#

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

Firewallの穴あけ

[root@ace ngircd-25]# ss -natup|grep ircd
tcp     LISTEN     0          10                                0.0.0.0:6667                                                      0.0.0.0:*                      users:(("ngircd",pid=14314,fd=10))
tcp     ESTAB      0          0                             192.168.1.1:6667                                                 192.168.1.70:1923                   users:(("ngircd",pid=14314,fd=11))
tcp     LISTEN     0          10                                   [::]:6667                                                         [::]:*                      users:(("ngircd",pid=14314,fd=9))
[root@ace ngircd-25]#

で、ポートの確認をして

[root@ace ngircd-25]# firewall-cmd --zone=public --permanent --add-service=irc
success
[root@ace ngircd-25]# firewall-cmd --reload
success
[root@ace ngircd-25]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: dns irc
  ports: 5500-5501/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[root@ace ngircd-25]#
[root@ace ngircd-25]# 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 ngircd-25]#

で、バッチリです。

おまけ

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

   _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
   _/               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*-  _/
   _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

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

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

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

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

うーむ、適当だ。

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

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

Kindle Unlimited入会で無料で読めます!

コメント