nptclのブログ

Common Lisp処理系nptの開発メモです。https://github.com/nptcl/npt

FreeBSD 12にOpenSMTPDを入れたかった

昔はこうやって入れていました。

# portsnap fetch update
# cd /usr/ports/mail/opensmtpd
# make
===>  opensmtpd-5.9.2p1_6,1 is marked as broken: Incompatible with Openssl
1.1.x yet.
*** Error code 1

Stop.
make: stopped in /usr/ports/mail/opensmtpd
# 

何か月たってもエラー。
あきらめようか。

【追記】FreeBSD 12.1-RELEASEでやったらうまく行きました。
やったー!!

# freebsd-version
12.1-RELEASE
# portsnap fetch update
# cd /usr/ports/mail/opensmtpd
# make install
# rehash
# smtpd -h
version: OpenSMTPD 6.6.0-portable
usage: smtpd [-dFhnv] [-D macro=value] [-f file] [-P system] [-T trace]
#

ソースから手動で入れる

ここでの手順はパッケージ管理されないので色々問題ありそう。
ずっとOpenSMTPDを使ってきたけど、結局sendmailに戻すかも。

それではOpenSMTPDをソースから入れる手順を示します。
方針は下記の通り。

  • 必要なライブラリも全部ソースから入れる
  • /opt/smtpdにインストール
  • 起動停止スクリプト/usr/local/etc上に配置

管理ユーザーの作成

# pw useradd -n _smtpd -u 257 -c OpenSMTPD -w no -m -d /opt/smtpd -s sh
# pw useradd -n _smtpq -u 258 -c OpenSMTPD -w no -m -d /var/empty -s /usr/sbin/nologin

切り替え

# su - _smtpd
$

ディレクトリ作成

# mkdir src
$ mkdir distfiles

ダウンロード

$ cd distfiles
$ fetch --no-verify-peer https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.9.2.tar.gz
$ fetch --no-verify-peer https://github.com/libevent/libevent/releases/download/release-2.1.10-stable/libevent-2.1.10-stable.tar.gz
$ fetch --no-verify-peer https://www.opensmtpd.org/archives/libasr-1.0.2.tar.gz
$ fetch --no-verify-peer https://www.opensmtpd.org/archives/opensmtpd-6.4.1p2.tar.gz

LibreSSL構築

$ cd
$ cd src
$ tar zxf ../distfiles/libressl-2.9.2.tar.gz
$ cd libressl-2.9.2/
$ ./configure --prefix=$HOME
$ make
$ make install
$ make clean

環境変数LD_LIBRARY_PATHを設定する。

$ cd
$ vi .profile

下記の3行を追記

# OpenSMPTD
LD_LIBRARY_PATH="${HOME}/lib:${LD_LIBRARY_PATH}"
export LD_LIBRARY_PATH

一度ログアウトする

$ exit

切り替え

# su - _smtpd

環境変数の確認

$ env | grep LD_LIBRARY_PATH
LD_LIBRARY_PATH=/opt/smtpd/lib:

libevent構築

$ cd
$ cd src
$ tar zxf ../distfiles/libevent-2.1.10-stable.tar.gz
$ cd libevent-2.1.10-stable/
$ ./configure --prefix=$HOME
$ make
$ make install
$ make clean

libasr構築

$ cd
$ cd src
$ tar zxf ../distfiles/libasr-1.0.2.tar.gz
$ cd libasr-1.0.2/
$ ./configure --prefix=$HOME
$ make
$ make install
$ make clean

OpenSMPTD構築

$ cd
$ cd src
$ tar zxf ../distfiles/opensmtpd-6.4.1p2.tar.gz
$ cd opensmtpd-6.4.1p2/
$ ./configure --prefix=$HOME \
--with-libasr=$HOME \
--with-libevent=$HOME \
--with-libssl=$HOME
$ make
$ make install
$ make clean

環境設定

rootにて作業を行う

ディレクトリの移動

# cd /usr/local/etc/rc.d/

もし存在しない場合は作る

# mkdir -p /usr/local/etc/rc.d/
# mkdir -p /usr/local/etc/mail/
# cd /usr/local/etc/rc.d/

サービス用スクリプトを作成する。

# vi optsmtpd

内容は下記の通り。

#!/bin/sh
# PROVIDE: optsmtpd mail
# REQUIRE: LOGIN
# KEYWORD: shutdown
. /etc/rc.subr
basepath="/opt/smtpd"
LD_LIBRARY_PATH="${basepath}/lib:${LD_LIBRARY_PATH}"
export LD_LIBRARY_PATH

name="optsmtpd"
rcvar=optsmtpd_enable

start_precmd="optsmtpd_precmd"
restart_precmd="optsmtpd_checkconfig"
configtest_cmd="optsmtpd_checkconfig"
extra_commands="configtest"

load_rc_config $name

: ${optsmtpd_enable:="NO"}
: ${optsmtpd_config:="/usr/local/etc/mail/smtpd.conf"}
: ${optsmtpd_procname:="${basepath}/sbin/smtpd"}
: ${optsmtpd_flags:=""}

command=${optsmtpd_procname}
command_args="-f ${optsmtpd_config} ${command_args}"
required_files="${optsmtpd_config}"

procname=${optsmtpd_procname}
pidfile="/var/run/smtpd.pid"

optsmtpd_checkconfig()
{
    echo "Performing sanity check on optsmtpd configuration:"
    eval ${command} ${command_args} ${optsmtpd_flags} -n
}

optsmtpd_precmd()
{
    optsmtpd_checkconfig
}

run_rc_command "$1"

権限の設定を行う

# chmod 755 optsmtpd
# service -l | grep optsmtpd
optsmtpd

自動起動の設定を行う。

# cd
# vi /etc/rc.conf

下記の行を追加する。

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
optsmtpd_enable="YES"

sendmailの強制停止

# service sendmail forcestop
Stopping sendmail.
Waiting for PIDS: 1983.
Stopping sendmail_msp_queue.
Waiting for PIDS: 1986.

設定ファイルの配置

# vi /usr/local/etc/mail/smtpd.conf

内容は下記の通り。

table aliases file:/etc/mail/aliases
listen on 127.0.0.1
action "local" mbox alias <aliases>
match for local action "local"

プロセスを立ち上げる

# service optsmtpd start
Performing sanity check on optsmtpd configuration:
configuration OK
Starting optsmtpd.

起動確認

# ps -ax | grep smtpd
70778  -  SsJ  0:00.02 /opt/smtpd/sbin/smtpd -f /usr/local/etc/mail/smtpd.conf
70779  -  IJ   0:00.02 smtpd: klondike (smtpd)
70780  -  IJ   0:00.02 smtpd: control (smtpd)
70781  -  IJ   0:00.03 smtpd: lookup (smtpd)
70782  -  IJ   0:00.03 smtpd: pony express (smtpd)
70783  -  IJ   0:00.03 smtpd: queue (smtpd)
70784  -  IJ   0:00.02 smtpd: scheduler (smtpd)
70790  0  S+J  0:00.00 grep smtpd

メール送信テスト

# echo hello | mail root
(少し待つ)
# mail
Mail version 8.1 6/6/93.  Type ? for help.
"/var/mail/root": 1 message 1 new
>N  1 root@empty.lan        Tue Jul 23 05:08  18/575
& 1
Message 1:
From root@empty.lan Tue Jul 23 05:08:39 2019
Delivered-To: root@empty.lan
Date: Tue, 23 Jul 2019 05:08:39 GMT
From: Charlie Root <root@empty.lan>
To: root@empty.lan

hello

& q
Saved 1 message in mbox
#

停止確認

# cd
# service optsmtpd stop
Stopping optsmtpd.
Waiting for PIDS: 70778.
# ps -ax | grep smtpd
70810  0  S+J  0:00.00 grep smtpd
#

最後に

どこまでうまく動くかは不明。
あと、6.4.0からsmtpd.confの書き方が変わったんですって。