大橋のページ

iproute2+tcを使って1台で複数インターネット接続

1 複数のインターネット接続
2 インタフェースとルーティングテーブル
3 ifconfigとrouteコマンド
4 Linuxカーネルのコンパイル 1
5 Linuxカーネルのコンパイル 2
6 iproute2+tcのインストール
7 ipコマンドでインタフェースの登録
8 ipコマンドでルーティング設定
9 namedをインタフェースごとに起動する
10 sendmailをインタフェースごとに起動する

10 sendmailをインタフェースごとに起動する

複数のsendmailを起動するとは

最新バージョンのsendmailは、「バーチャルドメイン」に対応しているため、とくにインタフェースごとに起動させる必然性はありません。しかし、sendmailを複数起動することで、かなり簡単にドメインとそのユーザを管理できます。

インターネット-------          -------------インターネット
 セカンダリDNS-1  |          |    セカンダリDNS-2
          |          |
          |          |
         ルータA       ルータB
          |210.160.79.97    |210.163.168.145
          |          |
          ------ゲートウェイ----
        210.160.79.98 | 210.163.168.151
               |
               |
              LAN 192.168.1.0/255.255.255.0

この図でいうと、ゲートウェイ上で「210.160.79.98」「210.163.168.151」そして「192.168.1.1」の各インタフェースごとにsendmailを起動してみます。

sendmail.cfを編集する

まずsendmail.cfをcpコマンドなどでコピーして、「sendmail.cf.domain1」と「sendmail.cf.domain2」の2つを作り、さらに内部用に「sendmail.cf.local」を作ります。それぞれのsendmail.cf.xxxxxでは、

# SMTP daemon options
O DaemonPortOptions=Addr=192.168.1.1

のように「DaemonPortOptions」を使ってインタフェースを指定します。先頭の文字は「O」(OptionのO)です。sendmailの起動スイッチで「-O」スイッチを使っても指定できるようです(/usr/sbin/sendmail -bd -O DaemonPortOptions=Addr=192.168.1.1)。ここでは、sendmail.cf.domain1で「210.163.168.151」を、sendmail.cf.domain2で「210.160.79.98」を、sendmail.cf.localで「192.168.1.1」を指定しました。

sendmail.cfで関連したファイルをそれぞれ用意します。たとえば、sendmail.st.xxxxです。

# status file
O StatusFile=/var/log/sendmail.st.local

で指定している「sendmail.st」ファイルに関しては不明でした。sendmail.stは、コメントの通りステータスファイルのようで、RedHat6.2の場合、「/var/log」に見当たりますが、どんなときに利用されるのか不明です。また、sendmail.cf.xxxxで指定しても自動的には作られないようです。

また、sendmailでもPID(プロセスID)ファイルが使われますが、ほかのサービスと違って設定ファイルや起動オプションで指定することはできません。sendmailの開発の方向として、複数のデーモンとして起動させるのではなく、ひとつのデーモンで複数のドメインを扱えるようにする方向に向かっているようです。そのため、sendmailのPIDは、ソースのコンパイル時に指定するようになっています。そのため、それぞれのsendmailごとにPIDを変更したい場合は、PIDを違うものにしてコンパイルし直す必要があるようです。もちろんできあがるsendmail自身も名前を変える必要があるでしょう。このへんは不明です。そのため、そのようにして作った複数のsendmailが正常に動作するかどうかも不明です。調べたかぎりでは、PIDを別にしなくてもそれなりに動作しているようです^^; 基本的には、ひとつのデーモンで複数ドメインを扱えるよう設定するのが正しい方向でしょう。

/etc/rc.d/init.d/sendmailを編集する

RedHatでは、各サービスの起動・再起動・終了などをコントロ−ルするためのスクリプト(シェルスクリプト)が、「/etc/rc.d/init.d」ディレクトリにあります。sendmailの場合、「sendmail」です。RedHat6.2Jでは標準で次のようになっています。

#!/bin/sh
#
# sendmail      This shell script takes care of starting and stopping
#               sendmail.
#
# chkconfig: 2345 80 30
# description: Sendmail is a Mail Transport Agent, which is the program \
#              that moves mail from one machine to another.
# processname: sendmail
# config: /etc/sendmail.cf
# pidfile: /var/run/sendmail.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Source sendmail configureation.
if [ -f /etc/sysconfig/sendmail ] ; then
        . /etc/sysconfig/sendmail
else
        DAEMON=yes
        QUEUE=1h
fi

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

[ -f /usr/sbin/sendmail ] || exit 0

RETVAL=0

# See how we were called.
case "$1" in
  start)
        # Start daemons.

        echo -n "Starting sendmail: "
        /usr/bin/newaliases > /dev/null 2>&1
        for i in virtusertable access domaintable mailertable ; do
            if [ -f /etc/mail/$i ] ; then
                makemap hash /etc/mail/$i < /etc/mail/$i
            fi
        done
        daemon /usr/sbin/sendmail $([ "$DAEMON" = yes ] && echo -bd) \
                                  $([ -n "$QUEUE" ] && echo -q$QUEUE)
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/sendmail
        ;;
  stop)
        # Stop daemons.
        echo -n "Shutting down sendmail: "
        killproc sendmail
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/sendmail
        ;;
  restart|reload)
        $0 stop
        $0 start
        RETVAL=$?
        ;;
  status)
        status sendmail
        RETVAL=$?
        ;;
  *)
        echo "Usage: sendmail {start|stop|restart|status}"
        exit 1
esac

exit $RETVAL

これを改造して、3つのsendmailが起動し、終了し、再起動できるようにします。ただ、筆者はシェルスクリプトなどにそれほど詳しくありません。とりあえず動くようにしたものです。セキュリティ上問題があるかもしれません。もっとスマートな書き方があるかもしれません。

#!/bin/sh
#
# sendmail      This shell script takes care of starting and stopping
#               sendmail.
#
# chkconfig: 2345 80 30
# description: Sendmail is a Mail Transport Agent, which is the program \
#              that moves mail from one machine to another.
# processname: sendmail
# config: /etc/sendmail.cf.local and /etc/sendmail.cf.domain1/domain2
# pidfile: /var/run/sendmail.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Source sendmail configureation.
if [ -f /etc/sysconfig/sendmail ] ; then
        . /etc/sysconfig/sendmail
else
        DAEMON=yes
        QUEUE=1h
fi

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

[ -f /usr/sbin/sendmail ] || exit 0

RETVAL=0

# See how we were called.
case "$1" in
  start)
        # Start daemons.

        echo -n "Starting Local sendmail: "
        /usr/bin/newaliases > /dev/null 2>&1
        for i in virtusertable access domaintable mailertable ; do
            if [ -f /etc/mail/$i ] ; then
                makemap hash /etc/mail/$i < /etc/mail/$i
            fi
        done
        daemon /usr/sbin/sendmail -C/etc/sendmail.cf.local $([ "$DAEMON" = yes ]
 && echo -bd) \
                                  $([ -n "$QUEUE" ] && echo -q$QUEUE)
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/sendmail.local
        echo
        echo -n "Starting Domain1 sendmail: "
/usr/sbin/sendmail -C/etc/sendmail.cf.domain1 $([ "$DAEMON" = yes ] && echo -bd)
\
                                  $([ -n "$QUEUE" ] && echo -q$QUEUE)
        RETVAL=$?
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/sendmail.domain1
        echo
        echo -n "Starting Domain2 sendmail: "
/usr/sbin/sendmail -C/etc/sendmail.cf.domain2 $([ "$DAEMON" = yes ] && echo -bd)
\
                                  $([ -n "$QUEUE" ] && echo -q$QUEUE)
        RETVAL=$?
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/sendmail.domain2
        echo
        ;;
  stop)
        # Stop daemons.
        echo -n "Shutting down Local sendmail: "
        killproc sendmail
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/sendmail.local
        echo -n "Shutting down Domain1 sendmail: "
        killproc sendmail
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/sendmail.domain1
        echo -n "Shutting down Domain2 sendmail: "
        killproc sendmail
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/sendmail.domain2
        ;;
  restart|reload)
        $0 stop
        $0 start
        RETVAL=$?
        ;;
  status)
        status sendmail
        RETVAL=$?
        ;;
  *)
        echo "Usage: sendmail {start|stop|restart|status}"
        exit 1
esac

exit $RETVAL

startオプションで「/usr/sbin/sendmail -C/etc/sendmail.cf.domain1」となっていて、「daemon」がないのは、namedのときと同様で、なぜか「daemon」を付けると正常に起動しなかったためです。おわかりになるかたがいらっしゃったら、お教えください。

動作を確認し、稼動状況を監視する

設定が終わったら、起動、終了など各オプションを付けて、「/etc/rc.d/init.d/sendmail」スクリプトを実行してみます。実行結果を「/var/log/maillog」を見て確認します。正常に読み込まれたり、終了したりしているようであれば、起動し、実際にメールの送受信をして確認します。

sendmailは、namedと同様、きわめて重要なサービスですから、設定が終了しても、少なくても1週間くらい、場合によっては1ヶ月間くらいはログを見て動作を確認しましょう。

著作権、商標等について (C) 2001 HyperDyne Inc.