SMTPサーバ(受信)
【前提条件:FireWall】
注意:ここの記述はセキュリティとして完全じゃないと思います。ipv6とか考えてません。
WEBサーバなどに比べてメールサーバ(SMTPサーバ)を立ち上げるのは大変。WEBサーバの場合はポート80にくる接続だけを面倒見ればいいが、SMPTの場合は受信に加えて自らが送信する場合のことも考えなければならない。またスパムの踏み台にされないために認証も付けなければならない。そして送信する際にもいきなり相手のSMTPサーバに接続できないのが普通(Outbound Port 25 Blocking)なのでプロバイダのSMTPサーバにお願いしなければならないし、その際の認証の設定もしなければならない。そこでここではメールの受信と送信を分けて最初は受信だけ考える。今は送信に関してはiptablesでポート25と587のアウトバウンドを無効にすることで対処しておく。
自サーバ宛のメールの受信するにはDNSがMXレコードを返してくれければならないが、返してくれない場合は、メールのドメイン部をホストとしてそこに送ってくれるはずなのでDDNSの場合MXレコードはなくても問題ない。
ただしMXレコードが違うサーバを返すとメールはそっちに送られてしまうので届かない。以下のようにしてMXレコードを確認する。
$ dig @192.168.0.1 myhost.example.com mx
このコマンドでMXが帰ってこないか、myhost.example.comならメールは届くことになる。
_ ポート25と587のアウトバウンドを無効にする
ufwではアウトバウンドの設定ができないみたいなのでiptablesを直接いじる。ufwの設定はすべてiptablesのスクリプトでuser設定として保存されていて、このuser設定を適用する前後で/etc/ufw/before.rules, /etc/ufw/after.rulesが適用される。
$ sudo vi /etc/ufw/before.rules
変更前
# allow all on loopback -A ufw-before-input -i lo -j ACCEPT -A ufw-before-output -i lo -j ACCEPT # connection tracking rules -A ufw-before-input -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
変更後
# allow all on loopback -A ufw-before-input -i lo -j ACCEPT -A ufw-before-output -i lo -j ACCEPT # drop all smtp packets -A ufw-before-output -p tcp --dport 25 -j DROP -A ufw-before-output -p tcp --dport 587 -j DROP # connection tracking rules -A ufw-before-input -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
ufwを再起動して変更を適用
$ sudo /etc/init.d/ufw restart
本当に無効になっているかを確認するには53などを80に変えて、wgetやw3mで接続できないかを確認すればいい。
_ インストール
postfixを入れてメールの受信をできるようにする。
$ sudo apt-get install postfix
色々聞かれるがデフォルトで済ます。
_ /etc/postfix/main.cfの設定
/etc/postfix/main.cfはpostfixの設定ファイル。このファイルを編集する。すでに存在するファイルはバックアップとして保存し、あらたに作成する。
_ myhostname myorigin mydomain
myhost.example.comに設定する。/etc/mailnameが設定されておりこのファイルにはインストール時に設定されたものが書かれているがこれは使わない。
myorigin = myhost.example.com myhostname = $myorigin mydomain = $myorigin
_ mydestination
来たメールのドメインがここで指定したドメインなら受け取る。
mydestination = $mydomain, localhost
_ mynetworks
ここから接続された場合、メールの送信(リレー)ができる。
mynetworks = 192.168.0.0/24, 127,0,0,0/8
_ home_mailbox
受信したメールをホームディレクトリのMaildirに格納するようにする。
home_mailbox = Maildir/
_ 完成図
myorigin = myhost.example.com myhostname = $myorigin mydomain = $myorigin mydestination = $mydomain, localhost mynetworks = 192.168.0.0/24, 127.0.0.0/8 home_mailbox = Maildir/
この時点でメールの受信はできる。受信に関しては直接接続してくるのでプロバイダのSMTPは関係ない。
_ ポート25開放
_ ルータでTCPの25番を開ける。
ルータにアクセスし25番を開ける。
_ ファイヤウォールを開ける。
ufwを有効にしている場合は25番を開ける
$ sudo ufw allow Postfix
_ 自分に向けて送信してみる
_ サーバ再起動
$ sudo /etc/init.d/postfix restart
_ ログの監視
$ sudo tail -f /var/log/mail.*
_ どっかから送信
xxx@myhost.example.comあてにどこかから送信してみる。xxxはユーザ名。このときログを確認し、送信が確認されたらホームディレクトリのMaildirの中のnewの中を見て調べる。