MTAとしてPostfix2.11.3-1を使用してDebianGNU/Linux8.7ボックスを実行しています。突然、つまりMTA設定を変更せずに、メールの配信が停止し、次のエラーが/var/log/mail.err
に表示され始めました。
root@schroeder:~# tail /var/log/mail.err
Mar 21 12:51:01 schroeder postfix/smtp[25421]: fatal: unknown service: smtp/tcp
Mar 21 12:54:11 schroeder postfix/smtp[26397]: fatal: unknown service: smtp/tcp
Mar 21 12:54:12 schroeder postfix/smtp[26398]: fatal: unknown service: smtp/tcp
Mar 21 12:59:26 schroeder postfix/smtp[26553]: fatal: unknown service: smtp/tcp
Mar 21 12:59:26 schroeder postfix/smtp[26554]: fatal: unknown service: smtp/tcp
Mar 21 12:59:26 schroeder postfix/smtp[26555]: fatal: unknown service: smtp/tcp
Mar 21 12:59:26 schroeder postfix/smtp[26556]: fatal: unknown service: smtp/tcp
Mar 21 13:04:30 schroeder postfix/smtp[27797]: fatal: unknown service: smtp/tcp
Postfixドキュメント と twoother ServerFaultの同様の質問によると、これはpostfixがchrootされて実行されるが、必要なファイルが不足しているためです。おそらく/etc/services
、スプールディレクトリ、つまり/var/spool/postfix
。
私がチェックしたところ、実際、/etc/services
は/var/spool/postfix
から欠落していました。だから私は(notsymlinked)/etc/services
を/var/spool/postfix/etc
にコピーしました。残念ながら、役に立たない。
次に、/etc/postfix/master.cf
でpostfixのsmtpバイナリのchroot jailを無効にしてみましたが、unixサービスタイプのchrootを無効にすると、メールが正常に配信されることがわかりました。つまり、次の/etc/postfix/master.cf
は正常に機能します。
root@schroeder:~# grep -v ^# /etc/postfix/master.cf
smtp inet n - - - - smtpd
pickup unix n - - 60 1 pickup
cleanup unix n - - - 0 cleanup
qmgr unix n - n 300 1 qmgr
tlsmgr unix - - - 1000? 1 tlsmgr
rewrite unix - - - - - trivial-rewrite
bounce unix - - - - 0 bounce
defer unix - - - - 0 bounce
trace unix - - - - 0 bounce
verify unix - - - - 1 verify
flush unix n - - 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
# The setting below is the one that I've changed.
# The vendor default is a dash in the fifth column.
smtp unix - - n - - smtp
relay unix - - - - - smtp
showq unix n - - - - showq
error unix - - - - - error
retry unix - - - - - error
discard unix - - - - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - - - - lmtp
anvil unix - - - - 1 anvil
scache unix - - - - 1 scache
maildrop unix - n n - - pipe
flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
uucp unix - n n - - pipe
flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail unix - n n - - pipe
flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp unix - n n - - pipe
flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix - n n - 2 pipe
flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman unix - n n - - pipe
flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
${nexthop} ${user}
/etc/services
が/var/spool/services
のchrootjailに存在しないという他の何かが、私のchroot設定に問題があるに違いないと思いました。
そこで、chrootingを再度有効にし、Postfixソースをダウンロードし、Postfixソースディストリビューションに同梱されているLinuxのchrootセットアップスクリプトを確認して実行しました。
root@schroeder:~# cd /usr/local/src/
root@schroeder:/usr/local/src# curl https://fourdots.com/mirror/postfix/postfix-release/official/postfix-3.2.0.tar.gz | tar -xz
root@schroeder:/usr/local/src# sh postfix-3.2.0/examples/chroot-setup/LINUX2
postfix/postfix-script: refreshing the Postfix mail system
ただし、これでもセットアップは修正されませんでした。
また、/etc/postfix/master.cf
のSMTP構成に「-v」を追加しようとしましたが、エラーレポートが詳細になりませんでした。
この時点で、私は機知に富んでいます。他に何を確認できますか? postfixのsmtpバイナリのchrootを再度有効にできるようにセットアップを修正するにはどうすればよいですか?
参考までに、私の設定:
root@schroeder:~# postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
config_directory = /etc/postfix
inet_interfaces = 127.0.0.1 ::1
mailbox_size_limit = 0
mydestination = schroeder.phl.univie.ac.at, localhost.phl.univie.ac.at, localhost
myhostname = schroeder.phl.univie.ac.at
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
myorigin = /etc/mailname
readme_directory = no
recipient_delimiter = +
relayhost =
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
smtpd_tls_cert_file = /etc/ssl/certs/phl.univie.ac.at.pem
smtpd_tls_key_file = /etc/ssl/private/phl.univie.ac.at.key
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls = yes
接尾辞はnot(まだ)AppArmorによって保護されています:
root@schroeder:~# apparmor_status
apparmor module is loaded.
apparmor filesystem is not mounted.
これがPostfixのホームページとPostfixパッケージのDebianのバグトラッカーで既知のバグであるかどうかを確認しました。
Postfixホームページとメーリングリストにリンクされているリソースも検索しましたが、 'solution' 私が見つけたのはソースからPostfixをビルドすることだけです。私も試してみましたが、エラーが続きました。
私は同じ問題に出くわしました。私の場合、これは、フラグnoexecが設定された/ var/spoolがマウントされたzfsを使用したセットアップが原因でした。解決策は、マウントされたファイルシステムでそのフラグをクリアすることでした。
詳細については、 https://github.com/zfsonlinux/zfs/issues/6803#issuecomment-378271799 を参照してください。
結論として、Postfixは、サービスデータベースを読み取るために/ var/pool/postfixにchrootjailに配置されたダイナミックリンクライブラリに依存しているようです。オプションnoexec
setでマウントされた別のファイルシステムでこのフォルダーまたはその親フォルダーのいずれかを実行する場合、このライブラリは実行されるコードを含むためにロードされません。 Postfixの観点からは、これは特に考慮されていません。代わりに、サービスデータベースの読み取りに関するより一般的な問題を確認してログに記録します。
/etc/postfix/master.cfファイルを介してsmtpに対してchrootが有効になっているFedora28にpostfixをインストールしようとした後に発生した同じ問題。
多くのreadmeファイルの1つを読んだ後、特に
/ postfix-3.3.1/README_FILES/BASIC_CONFIGURATION_README
私はpostfixchrootedを正しく実行するために実行する必要のあるスクリプトがあることに気づきました。
Note that a chrooted daemon resolves all filenames relative to the Postfix
queue directory (/var/spool/postfix). For successful use of a chroot jail, most
UNIX systems require you to bring in some files or device nodes. The examples/
chroot-setup directory in the source code distribution has a collection of
scripts that help you set up Postfix chroot environments on different operating
systems.
私が理解した問題は、私が実行する必要があるということでした。
LINUX2
にあるスクリプトファイル
/ postfix-3.3.1/examples/chroot-setup /
そのようです:
[[email protected] ~]$ cd postfix-3.3.1/examples/chroot-setup/
[[email protected] chroot-setup]$ ls
AIX42 BSDI2 BSDI3 FreeBSD2 FREEBSD3 HPUX10 HPUX9 IRIX5 IRIX6 LINUX2 NETBSD1 NeXTSTEP3 OPENSTEP4 OSF1 Solaris10 Solaris2 Solaris8
[[email protected] chroot-setup]$ chmod +x LINUX2
[[email protected] chroot-setup]$ ./LINUX2
このスクリプトは、etc、lib、lib64、およびusrから/ var/boost/postfixディレクトリにファイルをコピーするため、rootまたはSudoとして実行する必要があり、rootが所有している必要があります。スクリプトを実行した後、正常に実行され、postfixをリロードしましたが、それでもエラーが発生したため、非常に古いスクリプトをデバッグしたところ、cond_copy()関数にスラッシュがないことがわかりました。 。
正しいcond_copy()関数は次のようになります
cond_copy() {
# find files as per pattern in $1
# if any, copy to directory $2
dir=`dirname "$1"`
pat=`basename "$1"`
lr=`find "$dir/" -maxdepth 1 -name "$pat"`
if test ! -d "$2" ; then exit 1 ; fi
if test "x$lr" != "x" ; then $CP $1 "$2" ; fi
}
したがって、これがエラーであり、chroot jailed postfixを実行している場合は、最初に正しいファイルを/ var/pool/postfix /にコピーするスクリプトを見つけてcopy_cond( )関数を実行し、rootとして実行するか、少なくともそれを実行しました。
ちょっとした補遺:
sELinuxを実行している人にとっては、/ var/pool/postfix /と入力し、restorecon -Rvを実行することは、おそらくそれほど悪い考えではありません。移動したファイル
[[email protected] postfix]# restorecon -Rv etc/ lib/ lib64/ usr/
エラーの実際の原因は見つかりませんでしたが、驚いたことに(そしてがっかりしましたが)、次の方法で修正できました。
apt remove --purge postfix
apt install postfix postfix-doc
さらに、私が知る限り、これはnot関連する設定を変更しました。プレパージ構成のバックアップを/etc/postfix.backup
に保持しましたが、/etc/postfix/main.cf
はnot/etc/postfix.backup/main.cf
とは関連性が異なります。
root@schroeder:/etc/postfix# diff main.cf ../postfix.backup/main.cf
18c18
< readme_directory = /usr/share/doc/postfix
---
> readme_directory = no
21c21
< smtpd_tls_cert_file=/etc/ssl/certs/phl.univie.ac.at.crt
---
> smtpd_tls_cert_file=/etc/ssl/certs/phl.univie.ac.at.pem
38d37
< mailbox_command = procmail -a "$EXTENSION"
42d40
< html_directory = /usr/share/doc/postfix/html
また、/etc/postfix/master.cf
は/etc/postfix.backup/master.cf
とは異なり、chrootが再び有効になっている(そして機能している)場合に限ります。
root@schroeder:/etc/postfix# diff master.cf ../postfix.backup/master.cf
53c53
< smtp unix - - - - - smtp
---
> smtp unix - - n - - smtp
/etc/postfix
の他のファイルは、/etc/postfix/backup
の対応するコピーとまったく異なりません。
私は好奇心から、古い構成ファイルの使用に戻ったときに何が起こるかを確認しました。
root@schroeder:/etc/postfix# cp main.cf main.cf.backup
root@schroeder:/etc/postfix# cp ../postfix.backup/main.cf .
root@schroeder:/etc/postfix# postfix reload
postfix/postfix-script: refreshing the Postfix mail system
echo 'A test.' | mail -s Test <censored>
テストメールが届きます。したがって、/etc/postfix
の構成ファイルは、明らかに、notが最初に問題を引き起こしました。
私はまだ何をしたのか分かりません。