目次
方針
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
[Blog:技術系メモ http://t.co/l3ayHuI3 ] ucspi-tcp のSSL対応(ついでにインストールスクリプト)。