stunnel 5.58をDebianで設定する
以前メールプロキシ替わりに使っていたstunnelを久しぶりに動かそうと思ったらうまく接続できなくなっていたので、設定を再確認しました。
stunnel
stunnelは、プログラムコードを変更することなく既存のクライアントやサーバーにTLS暗号通信を加えるプロキシです。
かつてメール送信時の暗号化が普及していなかった時代によく使われていました。
メールだけでなく、stunnelサーバーに来たデータを、アドレスやポートを変更して転送することができます。
筆者はかつてDebianでstunnelを使用していたのですが、aptで確認したら現行のバージョンは5.50でした。さらに公式ページにある最新版は5.58でした。
ビルド
セキュリティ関連のパッケージはなるべく新しい方がいいと思いますので、最新バージョンをダウンロードしてビルドします。
先の公式ページのdownloadページから「stunnel-5.58.tar.gz」をダウンロードしました。
Debian環境でビルドをしていきます。もし開発環境が整っていない場合は「apt install build-essentiail」を先に実行してください。ビルドが面倒だという方は読み飛ばしてください。
「configure -h」で確認したら--disable-ipv6というIPv6を使わないオプションがあったので、設定してみました。stunnelでIPv6は今のところ使う予定がないですし、存在を忘れたりすると思わぬ不具合に悩まされかねません。
また、configureの途中で、一度次のようなエラーで止まりました。これはlibssl-devをインストールすることで解決しました。
# cd /usr/local/src
# wget https://www.stunnel.org/downloads/stunnel-5.58.tar.gz
...
# tar vzxf stunnel-5.58.tar.gz
...
# cd stunel-5.58
# ./confiure --disable-ipv6
# make
...
# make install
ビルドしインストールすると設定ファイルは/usr/local/etc/stunnelディレクトリ、バイナリは/usr/local/bin/stunnelに配置されます。
これは以前にaptでインストールした/usr/bin/stunnelと競合するので設定を変更します。aptでインストールしてあるものは、stunnelに対してstunnel4にリンクを張っているようです。このリンクを新しく作成した方に変更します。
# ls -l /usr/bin | grep stunnel
lrwxrwxrwx 1 root root 8 1月 9 2017 stunnel -> stunnel4
-rwxr-xr-x 1 root root 2788 1月 9 2017 stunnel3
-rwxr-xr-x 1 root root 199432 1月 9 2017 stunnel4
# rm /usr/bin/stunnel
# ln -s /usr/local/bin/stunnel /usr/bin/stunnel
もうひとつ修正箇所があります。stunnelはinit経由でサービスに登録されているので、その記述を変えます。スクリプト内の前半にDAEMONという変数があり、バイナリへのパスが記述されているので、そちらを/usr/local/bin/stunnelにします。
修正がおわったらupdate-rc.dで更新します。
# vim /etc/init.d/stuunel4
...
DAEMON=/usr/local/bin/stunnel
...
# update-rc.d stunnel4 defaults
新しい設定ファイル
以前の設定ファイルは次のようになっていたと思います。
old-stunnel.conf
...
; Certificate/key is needed in server mode and optional in client mode
cert = /etc/stunnel/stunnel.pem
key = /etc/stunnel/stunnel.pem
[gmail-pop3]
client = yes
accept = 110
connect = pop3.gmail.com:995
[gmail-smtp]
client = yes
accept = 25
connect = smtp.gmail.com:465
protocol = smtp
...
これが次のように変わりました。
new-stunnel.conf
...
[gmail-pop3]
client = yes
accept = 110
connect = pop.gmail.com:995
verifyChain = yes
CApath = @sysconfdir/ssl/certs
checkHost = pop.gmail.com
OCSPaia = yes
protocol=pop3
[gmail-smtp]
client = yes
accept = 25
connect = smtp.gmail.com:465
verifyChain = yes
CApath = @sysconfdir/ssl/certs
checkHost = smtp.gmail.com
OCSPaia = yes
protocol=smtp
...
過去から存在したものを含め項目を順に説明していきます。
- client
以これをyesにすることで非SSL通信をSSL通信化できるようになります。noにするとサーバモードとなり、SSLを解いて通信する機能となります。
- accept
待ち受けるポートです。ポートの前に「IPアドレス:」をつけることでIPの制限もできます。
- connect
接続先です。こちらもaccept同様にドメインの部分が省略できます。省略した場合はlocalhostになります。
- verifyChain
ルートCAからのチェーンで接続先を照合します。
- CApath
CAファイルのあるディレクトリを指定します。以前cert、keyとしてしてしていたエントリーの代わりです。もし特定のファイルをしていしたい場合はCAfileというエントリーもあります。
@sysconfdirには/etcディレクトリが入ると思いますが、うまくいかない場合は/etcと直接記述してしまっても問題ありません。
- checkHost
証明書のsubjectと照合する文字列指定します。
- OCSPaia
証明書の失効情報をAIAをもとにOCSPサーバーから取得してチェックします。AIAとはAuthority Information Accessの略で、証明書に書かれている、証明書が公開されている場所を示すものです。
- protocol
プロトコル固有のTLSネゴシエーションを有効にします。サンプルの設定ファイルには記述はありませんでしたが、これをつけないとうまく動かないサーバーがありました。
設定ファイルの場所は/etc/stunnelディレクトリのままでいいようです。
ちなみにここでは110番や25番ポートを待ち受けポートにしていますが、既存のサービスがそのポートで待ち受けているとエラーになります。確認するためには「lsof -i」コマンドを使います。
これで設定はすべてですが、restartでプロセスが停止できない現象が起きました。aptでインストールしたバイナリを消すことでこれに対応しました。この時、設定ファイルは消されることはありませんが、init.d内のスクリプトは消されてしまうので退避させておきましょう。
purgeが終わったら、起動ファイルをinit.dディレクトリに再度移動させ、update-rc.dを実行します。