連載
» 2002年09月21日 00時00分 UPDATE

実用qmailサーバ運用・管理術(12):qmail導入・運用関連トラブルシューティング集 (1/2)

本連載もいよいよ大詰めを迎えるに至った。今回は、qmailの導入や運用時にありがちなトラブルとその解決方法を解説する。あらゆるケースを網羅するのは不可能だが、この記事が何らかの糸口になれば幸いである。

[鶴長鎮一,@IT]

 今回は、qmail関係で遭遇するであろうトラブルと、その解決策を紹介します。

 この連載で何回も繰り返してきた言葉ですが、qmailのインストールは簡単なものの、ちょっとしたことを実現させたい場合はアドインツールを導入せざるを得ない状況が多々あります。アドインツールの組み合わせが何通りも存在するように、トラブルもさまざまです。また、トラブルの発生頻度もqmail単体に比べて増えてしまいます。qmail自体はMTAのメジャーになりつつあるものの、アドインツールの組み合わせによっては、過去の対策事例が見つからないこともしばしばです。

 ここですべてを紹介することはできませんが、私の経験やLinux Square会議室に書き込まれた事例を基に、いくつか紹介します。

導入時&設定関連のトラブル

 当連載のとおりにやってみたものの、うまく機能しないということもあるかと思います。原因はさまざまで、皆さんのインストール環境と筆者の環境との差異によるものや、記事の中で重要な手順を省略してしまったといった提供側の問題もあるかもしれません。あってはいけないことですが、記事が間違っていることもあるでしょう()。

注:本連載では、この点を猛省しております。ご指摘を受けたものに関しては、こちらで確認し反映させていただきました。ご指摘くださった皆さま、ありがとうございました。そして、間違いのために時間を無駄にしてしまった皆さま、本当に申し訳ありません。

 Linux Square会議室に寄せられた書き込みの多くが「インストールはできたもののサービスが正常に機能しない」というものでした。その対応策を見ていきましょう。

qmail関連のサービスが開始できない

●ログに「fatal: unable to bind: address already used」と記録される

 /var/log/maillogや/va/log/qmailなどに「fatal: unable to bind: address already used」と記録される場合は、すでに同様のサービスが起動していないかどうかを確認します。Linuxディストリビーションによっては、デフォルトでsendmailやimap4がインストールされ、場合によっては自動起動の状態になっている場合があります。最近はspamに対する意識やDoS攻撃の踏み台にされることに対する防御から、インストール時に意図的に選択しなければ起動しないようになっていますが、古いバージョンのディストリビューションは、自動起動が選択されている可能性があります。

 まず、現在の状況を確認します。Turbolinuxであればturboserviceコマンド、Red Hat Linuxであればntsysvコマンドでサービスの状態を確認し、もし起動されているようなら自動起動しないように設定します。

# ntsysv 
netsysvコマンドの例。[スペース]キーで選択/選択解除することにより、起動するサービスをコントロール可能 netsysvコマンドの例。[スペース]キーで選択/選択解除することにより、起動するサービスをコントロール可能

 そのほかのディストリビューションでも同様のコマンドが用意されているはずですが、手っ取り早く確認するにはtelnetコマンドを使用します。SMTPが起動されているかどうかを確認する場合は25番ポートに対して、POP3の起動を確認するには110番ポートに対して以下のように実行します。

$ telnet localhost 25
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
SMPTサービスが起動されていない場合(注)
注:接続制限がかけられている場合も同様のメッセージが表示されます。その場合は後述の「クライアント側でメールの送受信ができない」を参照してください。

$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 host.example.jp ESMTP Sendmail 8.9.3+3.2W/3.7W; Tue, 17 Sep 2002
 19:27:
20 +0900
sendmailが起動している場合
$ telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK POP3 localhost v2001.80 server ready
POP3が起動している場合

確認作業を終了するには、

quit 

とタイプします。

 Nmapがインストールされているのであれば、これを使用します。

# nmap localhost
Starting nmap V. 2.12 by Fyodor (fyodor@dhp.com,
 www.insecure.org/nmap/)
Interesting ports on localhost (127.0.0.1):
Port    State       Protocol  Service
7       open        tcp        echo
9       open        tcp        discard
13      open        tcp        daytime
19      open        tcp        chargen
21      open        tcp        ftp
23      open        tcp        telnet
25      open        tcp        smtp ←注意
901     open        tcp        unknown
1024    open        tcp        unknown
5680    open        tcp        canna
6000    open        tcp        X11
Nmap run completed -- 1 IP address (1 host up) scanned in 2 seconds

 既存のSMTP/POP3サービスの存在が確認されたら、これらのサービスを停止して二度と起動しないようにします。先ほどはntsysvを紹介しましたが、今度はディストリビューションに依存しないchkconfigコマンドを使ってみます。

 まず、サーバマシンの起動とともに実行されるサービスを確認します。

# /sbin/chkconfig --list
alsasound       0:off   1:off   2:off   3:off   4:off   5:off   6:off
pcmcia          0:off   1:off   2:off   3:off   4:off   5:off   6:off
syslog          0:off   1:off   2:on    3:on    4:on    5:on    6:off
(以下略)

 0〜6の数字はランレベル(Linux Tips:ランレベルとは)です。「on」になっているランレベルを「off」にして起動しないようにします。

# chkconfig --level ランレベル sendmail off

 chkconfigの使用については「Linux Tips:システムサービスのランレベルを調べたり変更するには」を参照してください。

 POP3がxinetd経由で起動されている場合は、/etc/xinetd.d/pop-3などの設定ファイルを見つけて下記のように編集し、xinetdサービスを再起動します。

# vi /etc/xinetd.d/pop-3
# default: off
# description: POP-3 Mail Server
# securlevel: 30
service pop-3
{
        disable         = yes ←ここを変更
        socket_type     = stream
        protocol        = tcp
        wait            = no
        user            = root
        server          = /usr/sbin/ipop3d
}
# /etc/init.d/xinetd restart

●設定が正しくない場合

 qmailは、/var/qmail/controlディレクトリにあるmeファイルを環境に合わせて用意すれば、取りあえずは起動できます。/var/qmail/controlにあるファイルの正当性を確認するには、/var/qmail/bin/qmail-showctlコマンドを使用します。

# /var/qmail/bin/qmail-showctl
qmail home directory: /var/qmail.
user-ext delimiter: -.
paternalism (in decimal): 2.
silent concurrency limit: 120.
subdirectory split: 23.
user ids: 3005, 3006, 3007, 0, 3008, 3009, 3010, 3011.
group ids: 3005, 3006.
(中略)
me: (Default.) My name is undefined! Uh-oh. ←meファイルがない場合
(以下略)

 これで不備が見つかるようであれば、再度/var/qmail/control/下のファイルを作り直します。/var/qmail/control/下のファイルについては、「第1回 qmailによるSMTPサーバの構築」を参照ください。

クライアント側でメールの送受信ができない その1

 サービスが起動できても、メールの送受信がうまくいかない場合があります。tcpserverを導入している場合は、cdbファイルにクライアントのIPが含まれているかどうかを確認します。もし含まれていなければ、/etc/tcp.smtpファイルを修正してcdbファイルを再構築します。

# vi /etc/tcp.smtp
192.168.0.:allow,RELAYCLIENT="" ←接続を許可するクライアントのIPを追加
# /usr/local/bin/tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp

クライアント側でメールの送受信ができない その2

 最近のLinuxディストリビューションは、デフォルトインストールでセキュリティレベルを設定できます。「中」レベルを選択すると最小限のサービスのみを自動起動するように設定されますが、「高」レベルではipchainsを有効にするケースもあるようです。ipchainsはカーネル2.2から実装されたもの()で、自作ファイアウォールを構築された方にはなじみの深いものでしょう。ipchainsのパケットフィルタリング機能でホストのセキュリティを高めようというものですが、そのために追加サービスを開始する際の手順が増えます。

注:カーネル2.2より前はipfwadmコマンドでしたが、2.2からipchainsに置き換わりました。カーネル2.4ではiptablesコマンドが用意されています。カーネルの進化とともに、パケットフィルタリングの方法も少しずつ変わっています。

 まず、ipchainsが有効かどうかを確認します。

# /sbin/ipchains -L
Chain input (policy ACCEPT):
target   prot opt     source           destination       ports
ACCEPT   tcp  -y----  X.X.X.0/24       anywhere          any ->   ssh
ACCEPT   all  ------  anywhere         anywhere          n/a
REJECT   tcp  -y----  anywhere         anywhere          any ->   any
REJECT   udp  ------  anywhere         anywhere          any ->   any
Chain forward (policy ACCEPT):
Chain output (policy ACCEPT):

 ipchainsが有効でなければアクセスリストは表示されません。逆に、ipchainsをインストールしたつもりがなくても、Linuxの導入時にセキュリティレベルを「高」にしたことでインストールされている場合もあります。この状態では、各種のサービスを起動してもipchainsのパケットフィルタに引っ掛かり、クライアントとの接続が確立できません。

 ipchainsを無効にするには、前述のturboserviceやnetsysv、chkconfigコマンドを使用してipchainsサービスを停止します。ipchainsを有効にしたままでSMTPやPOP3のサービスを解放する場合は、次の手順で行います。

 SMTPやPOP3が使用するポートを双方向で解放するために、ipchainsを次のように実行します。ここではtcpserverで接続を制限するため、ipchainsでは発信元やあて先による制限は行いません。

# /sbin/ipchains -A input -p tcp -b -d 0.0.0.0/0 25 -j ACCEPT
# /sbin/ipchains -A input -p tcp -b -d 0.0.0.0/0 110 -j ACCEPT

 上記のコマンドが有効になっているかどうかを確認します。

# /sbin/ipchains  -L
Chain input (policy DENY):
target   prot opt     source          destination       ports
ACCEPT   tcp  ------  anywhere        anywhere          any ->   smtp
ACCEPT   tcp  ------  anywhere        anywhere          smtp ->   any
ACCEPT   tcp  ------  anywhere        anywhere          any ->   pop-3
ACCEPT   tcp  ------  anywhere        anywhere          pop-3 ->   any
Chain forward (policy DENY):
Chain output (policy ACCEPT):
この例では、「/sbin/ipchains -P input DENY」も有効になっています

 このままではマシンを再起動すると設定が消えてしまうため、再起動後も設定が有効になるように/etc/sysconfig/ipchainsファイルに書き出します。

# ipchains-save > /etc/sysconfig/ipchains
以下の内容が追加されます。
:input DENY
:forward DENY
:output ACCEPT
Saving `input'.
-A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 25:25 -p 6 -j ACCEPT
-A input -s 0.0.0.0/0.0.0.0 25:25 -d 0.0.0.0/0.0.0.0 -p 6 -j ACCEPT
-A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 110:110 -p 6 -j ACCEPT
-A input -s 0.0.0.0/0.0.0.0 110:110 -d 0.0.0.0/0.0.0.0 -p 6 -j ACCEPT

 サーバに必要なサービスは、これだけではありません。管理のためのsshやDNSサービス、HTTPサービスもあります。また、発信元やあて先のIPアドレスで制限をかける必要もあります。必要に応じて、「ゼロから始めるLinuxセキュリティ 第2回 ホストレベルセキュリティの総仕上げ」を参考にフィルタリングルールを追加しましょう。

 ちなみに、Red Hat Linuxにはipchainsの設定を対話式で行うLokkitツールがあります。

# /sbin/lokkit
lokkitの画面 lokkitの画面

設定を簡単に行いたい

 qmail単体であれば設定は至って簡単ですが、svcのためのdaemontoolsやtcpserverのためのucspi-tcpと、アドインツールをインストールするにつれて設定ファイルを準備する手間も増えてきます。そこで、qmail-confツールを使用するという方法もあります。

 qmail-confはTetsu Ushijima氏によってhttp://www.din.or.jp/~ushijima/qmail-conf.htmlで公開されています。日本語の説明はhttp://www.y-min.or.jp/~nob/qmail/qmail-conf.htmlにあります。

 大変便利なツールですが、できれば一度は自分で設定ファイルを1つ1つ確認しながらインストールすることをお勧めします。

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。