うちの実家サーバ(LINUX:FedoraCore3)の場合、親がメールを独自ドメインで使いたい!と言い出したため、Postfixをインストールして、メールサーバを立てているのですが、実はKazuはメールサーバなんて当然今まで立てたこともなく、知識もほとんどなかったので、いろいろ問題が出たりしています。
今までに起こった問題と解決手段
1.添付ファイル(というより、メール1通の全体)が10MB以上あると送れない→/etc/postfix/main.cf内のmessage_size_limitを102400000(100MB)に増やした(増やしすぎ!?)
2.AOLドメイン宛てのメールが送れない
→ダイナミックDNSを使ってサーバを立てていたので、例えばAOLは固定IPからの接続以外を拒否するらしく、こればっかりは固定IPにしないと無理?ということで先日固定IPを導入した
3.特定の相手からメールが届かない
→送ったはずだ、いや、届いていない、というのがあったようで、これは原因がなかなかつかめなくて苦労した(以下に詳細をメモ)
特定の相手からメールが届かない
3に関してはサーバのログを調べてみると、postfix/smtpd[XXXX]: timeout after DATA from XXX.XX.XX[XXX.XXX.X.XX]のようなものが大量に出ていた。 何?これ。とググってみると、Postfixのメーリングリストで同じ症状に見舞われている方を見つけた。その方の場合はMTUを変えることで解決した、と書かれてあった。
postfix/smtpd[XXXX]: disconnect from XXX.XX.XX[XXX.XXX.X.XX]
で、MTUってなーに?(笑 ・・・こんなやつがサーバ立ててていいんだろうか。。))
ちょっとだけお勉強タイム。
まずは、IT用語辞典 e-wordsより
MTUとは
通信ネットワークにおいて、1回の転送で送信できるデータの最大値を示す値。送信する側が接続ごとに値を設定できる。送信側ホストが受信側ホストより大きいMTUを持っていた場合は、送信側が受信側のMTUに従ってデータを再分割して送信する。エラーデータの再送信はMTUに指定されたサイズを単位として行われるため、劣悪な通信環境ではMTUを小さい値に設定した方が転送速度が速くなり、逆に安定した通信環境では制御信号が少なくなる分MTUの大きい方が転送速度が速くなる。MTUの単位はバイトで、Ethernetでは1500程度、電話回線によるダイヤルアップ接続では576程度が最適とされる。
それと、メールとどう関係あんの?
もう一つサイトを見つけた。@ITの記事
ネットワークで通信を行う場合、(通常は)一度に送信可能なデータ(パケット)のサイズには上限がある。例えば、TCP/IPプロトコルで利用されているIPプロトコルでは、1つのIPパケットでは最大64Kbytesまでしか送信できない(IPv4の場合)。しかし、このような大きなサイズのIPデータを1つのパケットで送信することのできる物理ネットワーク媒体はない。例えばイーサネット(および相互互換性を持つ無線LANなど)では、1パケット(1フレーム)のサイズは最大1500bytesだし、FDDI(光ファイバ)では4352bytesというのが普通である。このように、一度に送信することができるデータのサイズを「MTU(Maximum Transmission Unit)」といい、ネットワークのプロトコルや媒体ごとに固有の値がある。
そして、その許容可能なパケットサイズを超えたデータが来ると、「フラグメンテーション(パケットの断片化)が発生してパケットを組み立てなおす必要が出てきて、その分時間がかかってログにあったような「timeout after DATA from XXX.XX.XX[XXX.XXX.X.XX]」というのが発生する、ってことらしい。
なるほど。うちの実家サーバの場合、光回線でPPPoEなのでこれを試してみる価値はあるかも?と考え、一応MTUを最適化させるために以下を試してみた。
まず、サーバ側の設定は?
ifconfigコマンドでeth0のネットワークインタフェースを調べられる[root@linux ~]# ifconfig
eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:192.168.253.103 Bcast:192.168.253.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
(省略)
1500がデフォルト値のようだ。
PingでMTUをサイズを調査する
MTUサイズは、ICMPヘッダ(8バイト)とIPヘッダ(20バイト)を含めた値なので、1500からこれらヘッダのサイズ28バイトを引くと、1472バイト。これを使って外部ネットワークから試してみる。C:\Documents and Settings\user>ping -f -l 1472 kazuizm.com
Pinging kazuizm.com [202.171.147.53] with 1472 bytes of data:
Reply from 192.168.1.2: Packet needs to be fragmented but DF set. ・・・エラー応答
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Ping statistics for 202.171.147.53:
Packets: Sent = 4, Received = 1, Lost = 3 (75% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
やっぱダメじゃん!断片化してますよ!って。
パケットのサイズを小さくしながら試していくと・・・
C:\Documents and Settings\user>ping -f -l 1424 kazuizm.com1424バイトまではpingが通ることからMTUサイズは1424+28(ICMPヘッダ+IPヘッダ)で1452バイトとなる。 どうやら、PPPoE(xDSLや光ファイバ・インターネット回線などで使われているプロトコル)などが使われていると、それらのプロトコルの分だけ、MTUサイズが制限されることになる、ということらしい。
Pinging kazuizm.com [202.171.147.53] with 1424 bytes of data:
Reply from 202.171.147.53: Destination protocol unreachable.
↑応答あり(ICMPパケットはルータではじいているのでこれでOK
Reply from 202.171.147.53: Destination protocol unreachable.
Reply from 202.171.147.53: Destination protocol unreachable.
Reply from 202.171.147.53: Destination protocol unreachable.
Ping statistics for 202.171.147.53:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
この1424バイトというのをMTUの値としてLinuxのサーバ側に設定する
LINUXサーバ側でMTU値を設定
MTU値の設定はifconfigコマンドでできる。
[root@linux ~]# ifconfig eth0 mtu 1452
[root@linux ~]# ifconfig
eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:192.168.253.103 Bcast:192.168.253.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1452 Metric:1
(省略)
メールが届くか確認
早速/var/log/maillogを見てみると、今までtimeout after DATA from~となっていた接続元ドメインからのメールが無事届いた!めでたしめでたし







