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ヶ月間くらいはログを見て動作を確認しましょう。
|