カテゴリ

ucspi-tcp

目次

方針

http://www.nrg4u.com/ にある「tcpserver SSL/TLS patch( http://www.nrg4u.com/qmail/ucspi-tcp-ssl-20050405.patch.gz )」 を利用して ucspi-tcp(tcpsercer)をSSL/TLS対応にする。

パッチ後のtcpserverは指定できるオプションが増えているだけで、素の(パッチをあてていない)tcpserverと同じオプション設定であればそのまま動作するので、特に置き換え・併用などはしない。

netqmail-1.06 に含まれる ucspi-tcp 用パッチも合わせて適用する。ただし、 ucspi-tcp-0.88.errno.patch は tcpserver SSL/TLS patch に同等の処理が含まれているため適用しない。
※ ucspi-tcp-0.88.a_record.patch、 ucspi-tcp-0.88.nodefaultrbl.patch の2つを適用する。

必要なパッケージ

ucspi-tcp-0.88
http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
tcpserver SSL/TLS patch
http://www.nrg4u.com/qmail/ucspi-tcp-ssl-20050405.patch.gz
netqmail-1.06
http://www.qmail.org/netqmail-1.06.tar.gz
パッケージ内の other-patches 以下にある ucspi-tcp-0.88.a_record.patch、ucspi-tcp-0.88.nodefaultrbl.patch のみを利用
OpenSSLのライブラリ
ソースインストールしていない場合は yum install openssl-devel などでインストールしておく

インストールスクリプト

#! /bin/sh

UCSPI=ucspi-tcp-0.88
SSLPATCH=ucspi-tcp-ssl-20050405.patch
NETQMAIL=netqmail-1.06

# ソースダウンロード
[ ! -e ${UCSPI}.tar.gz ]    && wget http://cr.yp.to/ucspi-tcp/${UCSPI}.tar.gz
[ ! -e ${SSLPATCH}.gz ]     && wget http://www.nrg4u.com/qmail/${SSLPATCH}.gz
[ ! -e ${NETQMAIL}.tar.gz ] && wget http://www.qmail.org/${NETQMAIL}.tar.gz


# 展開
tar zxvf ${UCSPI}.tar.gz
gunzip   ${SSLPATCH}.gz
tar zxvf ${NETQMAIL}.tar.gz


cd ${UCSPI}

# パッチ適用
patch < ../${SSLPATCH}
patch -p1 < ../${NETQMAIL}/other-patches/ucspi-tcp-0.88.a_record.patch
patch -p1 < ../${NETQMAIL}/other-patches/ucspi-tcp-0.88.nodefaultrbl.patch

make

# 既存の tcpserver とは別の名前でインストールする場合、
# make setup はせずに、make の後、ucspi-tcp のソースディレクトリ内に
# できている tcpserver を任意の名前でコピーして利用する。


# パッチ適用後の tcpserver のファイル名を tcpserver のままにする場合、
# 既存の tcpserver が利用中の場合インストールに失敗する。
# tcpserver を利用しているサービスを停止してから下記を実行する。
#
#make setup check

使い方

基本的な使い方は素の tcpserver と同じ。
オプションに下記の2つが追加されている。

-s
SSLを有効にする
-n
試用するSSL証明書を指定する

おまけ

#! /bin/sh

# このスクリプトを呼び出す前に下記の環境変数を設定しておくことで
# tcpserver配下のプログラム実行が行える。
#
# 	SERVICEIP	サービスのリッスンIPアドレス(すべての場合 0 )
# 	PORTNUM		サービスのリッスンポート
#	RUNPROG		実行するプログラム
#
# さらに下記の環境変数を指定することで、よりオプションを指定できる。
#
#	CERTFILE	SSL接続で利用するSSL証明書
#	SETUSER		プログラムの実行ユーザー(自動的に所属グループを実行グループとする)
#	MAXCONN		同時接続数の上限
#	TCPRULES	接続制限を行う場合の設定DB(CDB)
#



# 変数 CERTFILE が設定されている場合、SSL対応
set_cert()
{
    if [ -e "${CERTFILE}" ]; then
        OPTSSL="-s -n ${CERTFILE}"
    else
        OPTSSL=""
    fi
}

# 変数 SETUSER が設定されている場合、setuidgid としてそのユーザを利用する
set_uidgid()
{
    if [ -z "${SETUSER}" ]; then
        SETUID=""
        SETGID=""
    else
        SETUID="-u `id -u ${SETUSER}`"
        SETGID="-g `id -g ${SETUSER}`"
    fi
}

# 変数 MAXCONN が設定されている場合、最大同時接続数として利用する
set_maxconnection()
{
    if [ -z ${MAXCONN} ]; then
        OPTC=""
    else
        OPTC="-c ${MAXCONN}"
    fi
}

# 変数 TCPRULES が設定されている場合、接続制限データファイルとして利用する
set_tcprules()
{
    if [ -e "${TCPRULES}" ]; then
        OPTX="-x ${TCPRULES}"
    else
        OPTX=""
    fi
}


# 以下メイン

set_cert
set_uidgid
set_maxconnection
set_tcprules

# ↓動作確認の際にコメントアウトを外すと起動オプションが確認できる
# cat << _EOT_
exec \
        tcpserver \
                -HRv         \
                ${OPTSSL}    \
                ${SETUID}    \
                ${SETGID}    \
                ${OPTC}      \
                ${OPTX}      \
                ${SERVICEIP} \
                ${PORTNUM}   \
                ${RUNPROG}   \
2>&1
# _EOT_
# ↑動作確認の際にコメントアウトを外すと起動オプションが確認できる

上記スクリプトを仮に /var/daemontools/services/exec-tcpserver.sh に実行権限付きでおいてあるとする。

下記のようなスクリプトを daemontools 管理のサービスの run ファイルとして利用できる。

#! /bin/sh

RUNPROG=[qmail-smtpd など実行するプログラム(オプションなどもつけて)]

SERVICEIP=0    # ←全てのIPアドレスでListenする場合
# SERVICEIP=`dnsip \`hostname\``  # ←自分に設定されているIPアドレスを使う場合
PORTNUM=[サービスのポート番号]

CERTFILE=[SSL証明書ファイルのフルパス]
SETUSER=[実行ユーザー]
MAXCONN=[同時接続数]
TCPRULES=[接続制限に使う .cdb ファイル(tcprules形式)]


. /var/daemontools/services/exec-tcpserver.sh

コメント

いただいたコメント
  1. [Blog:技術系メモ http://t.co/l3ayHuI3 ] ucspi-tcp のSSL対応(ついでにインストールスクリプト)。