inspircd 社内用ircサーバの設置

社内でirc使えという指示が来たのだが、公開ircサーバを仕事で使うのは書き込む内容に気をつけないといけなくなって不便なんで自分でサーバを立てることにした。

昔ながらの ircd については、設定ファイルがバッドノウハウくさいので避けることとし、SSL通信機能を持っている inspircd を選択。ports でのインストールについては WITH_OPENSSL, WITH_SSLMODULES を指定してSSLモジュールが入る。ドキュメントによると GNUTLS 推奨だけどopensslに慣れ親しんでしまったので openssl で。

また、2台構成にしてデータをサーバ間でやりとりするようにすることにより冗長構成を実現した。

日本語の解説としては Windows/Mac OS X/Linux/BSDで動作するフリーのIRCサーバ「InspIRCd」 でWindowsにインストールする様子が書いてある。が設定ファイルの詳細については解説がない。

inspircd.conf で2台構成における最低限と思われる設定を作成したので置いておく。

  • OpenSSLによる暗号化を実施
  • クライアントからの接続は port 6667
  • サーバ間の接続は port 7000
  • クライアントからの接続にもパスワードを要求する
<server name="irc1.example.com" description="Example Irc World" network="ExampleIrc">
<admin name="exampleAdmin" nick="exampleAdmin" email="admin@example.com">
<bind address="IRC1のIPアドレス" port="6667" type="clients" ssl="openssl">
<bind address="IRC1のIPアドレス" port="7000" type="servers" transport="openssl">
<power diepass="/DIE用のパスワード" restartpass="/RESTART用のパスワード" pause="2">
<files motd="inspircd.motd" rules="inspircd.rules">
# 上記の2つのファイル inspircd.motd,inspircd.rule については適当に用意する。
# inspircd.motd は接続時に表示される文字列
# inspircd.rules は何もしないなら空のファイルでよい

<options prefixquit="Quit: "
        loglevel="default"
        netbuffersize="10240"
        maxwho="128"
        noservices="no"
        qaprefixes="no"
        deprotectself="no"
        deprotectothers="no"
        somaxconn="128"
        softlimit="12800"
        userstats="Pu"
        operspywhois="no"
        customversion=""
        maxtargets="20"
        hidesplits="no"
        hidebans="no"
        hidewhois=""
        flatlinks="no"
        hideulines="no"
        nouserdns="no"
        syntaxhints="no"
        cyclehosts="yes"
        ircumsgprefix="no"
        announcets="yes"
        disablehmac="no"
        hostintopic="yes"
        hidemodes="eI"
        quietbursts="yes"
        pingwarning="15"
        serverpingfreq="60"
        allowhalfop="yes"
        defaultmodes="nt"
        moronbanner="You're banned! Email haha@abuse.com with the ERROR line below for help."
        exemptchanops="">

<connect allow="*"
        password="接続用パスワード"
        timeout="60"
        flood="20"
        threshold="1"
        pingfreq="120"
        sendq="262144"
        recvq="8192"
        localmax="30"
        globalmax="30">

<link name="irc2.example.com"
        ipaddr="IRC2のIPアドレス"
        port="7000"
        allowmask="192.0.2.0/24みたいな感じで"
        autoconnect="300"
        timeout="15"
        transport="openssl"
        bind="IRC1のIPアドレス"
        statshidden="no"
        hidden="no"
        sendpass="IRC1サーバ間パスワード"
        recvpass="IRC2サーバ間パスワード">

<pid file="/var/run/inspircd/inspircd.pid">

# SSL modules should be place earlier
<module name="m_sslinfo.so">
<module name="m_sslmodes.so">
<module name="m_ssl_openssl.so">
# modules
<module name="m_spanningtree.so">

また、SSL通信に必要な証明書ファイルは標準で cert.pem(証明書ファイル), key.pem(秘密鍵ファイル), ca.pem(証明機関証明書ファイル), dhparams.pem(DH用) となっているので標準のファイル名を採用することにした。これらのファイルはapache用に作成したものを流用するために以下のような Makefile を作成した。

certs::
        cp /usr/local/etc/apache22/server.crt cert.pem
        cp /usr/local/etc/apache22/server.key key.pem
        cp /usr/local/etc/apache22/server-ca.crt ca.pem
        openssl gendh -rand /dev/urandom 512 > dhparams.pem
        chown ircd *.pem
        chgrp ircd *.pem
        chmod o-rwx key.pem

最後に daemontools 用 runスクリプト

#!/bin/sh
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/sbin:/usr/sbin
export PATH

config="/usr/local/etc/inspircd/inspircd.conf"
pidfile="/var/run/inspircd/inspircd.pid"
inspircd_user="ircd"
inspircd_group="ircd"
logfile="/var/log/inspircd/ircd.log"
command=inspircd

    piddir=$(dirname ${pidfile})
    if [ ! -d ${piddir} ]; then
        mkdir -m 755 -p ${piddir}
    fi
    chown -R ${inspircd_user}:${inspircd_group} ${piddir}
    logdir=$(dirname ${logfile})
    if [ ! -d ${logdir} ]; then
        mkdir -m 755 -p ${logdir}
    fi
    chown -R ${inspircd_user}:${inspircd_group} ${logdir}

exec 2>&1
exec softlimit -c 0 \
        setuidgid ${inspircd_user} \
        envdir ./env \
        $command --nofork --logfile ${logfile} --config ${config}

(7/29 追記) openssl だと /sslinfo コマンドで接続ユーザの証明書情報が取れないようだ。後でgnutlsにして試してみる。

コメントを残す