インターネットなこと: 2016年11月アーカイブ

いやあ、まあ、今時?な話なんで、こんなところに書いてもあんまり参考になりませんが、俺の備忘録代わりに。

もうずっと(サーバは乗り換えつつも基本的な環境は変更せず)動いてるシステムがあって、そのメールサーバが、tcpserver(ucspi-tcp)+qmail という形で構築されている。

今回、このメールサーバを某プロバイダのロードバランサー(以降 LB)の下に移動することになった。
MX にロードバランサーの IP を指定して、外部からのメールは LB の 25番ポートに届くんで、それをネットワーク内部にいるメールサーバの 25番に振り分ける・・・っていう運用ね。

これが上手くいかないの(^^;

/etc/tcp.smtp には LB の IP も登録し、実際、/var/log/messages を見ると、LB からメールサーバの 25番ポートには接続に来ている。
実際、メールサーバ側の /usr/local/bin/tcpserver も起動するしね。
しかし、送り元に 220 コード(正常に接続できたという意味のコードNo)は返ってこない。

$ telnet smtp.exsample.co.jp 25
Trying 202.XXX.XXX.116...
Connected to smtp.exsample.co.jp.
Escape character is '^]'.
Connection closed by foreign host.

と切れちゃう。

正常に接続できれば、

$ telnet smtp.exsample.co.jp 25
Trying 202.XXX.XXX.116...
Connected to smtp.exsample.co.jp.
Escape character is '^]'.
220 smtp.exsample.co.jp ESMTP
QUIT
221 smtp.exsample.co.jp
Connection closed by foreign host.

と、こんな感じなんだけど。

なんじゃあ???
送った側の /var/log/maillog 見てみると、

Nov 22 16:02:12 smtp qmail: 1479798132.340284 delivery 1015263: deferral: Connected_to_202.XX.XX.116_but_connection_died._(#4.4.2)/

だって。
接続後数秒してから切れるので、タイムアウトくさい。tcpserver が答えを返さない?あるいは tcpserver が必要としている情報が LB から来ない?(直接インターネットから接続すると上手くいくので、LB 独自の何か・・・なんだろうけど)

結論から言うと、tcpserver が TCPREMOTEINFO を取得しようとするが、LB からは取得できず待ちにはいっちゃって、LB側がセッションを切ってる感じかな?
LB 側のセッション切れた後も、しばらく tcpserver は起動しているからそういうこと?

結局、tcpserver の起動オプションに「接続元ホストから $TCPREMOTEINFO を取得しない」という意味の R をつければよかった。

/usr/local/bin/tcpserver -v -u ~(以下略)
 ↓
/usr/local/bin/tcpserver -vR -u ~(以下略)

という感じ。

これで、問題なく LB 経由で内部のメールサーバにメールが届くようになった。
うちで管理しているドメインの スレーブ DNS をしているサーバに、

Nov 16 09:17:52 dns2 named[10**]: client 210.130.***.***#47601: query 'exsample.com/MX/IN' denied
Nov 16 09:17:54 dns2 named[10**]: client 114.111.***.***#47670: query 'hoge.exsample.com/A/IN' denied

みたいなメッセージが山ほど出てるんでなんだ?と思ったんだけど、オープンリゾルバ対策で named.conf を触った時の設定ミスであった(^^;
この間、スレーブ DNS サーバを切り替えたのよ。その時から出てたってことか(^^;
まあ、特に外部からの Web やメールサーバへのアクセスには影響は出てないけど。
大量のログが出ているものをほってもおけないので named.conf の修正。

要は、

options {

        directory       "/usr/local/etc/namedb";
        pid-file        "/usr/local/etc/namedb/run/named.pid";
        allow-transfer {
                none ;
        };
        allow-query {
                localhost;
                my-network;
        };
        allow-query-cache {
                localhost;
                my-network;
        };

};

という具合に query の受付を localhost と my-network で登録した IP からのみに絞ってるのに、自社管理ドメインのサイトのゾーンファイルに関する問い合わせに対してもその設定をそのまま適用しているのがまずい。
拒否したいのは「他社管理ドメインへの問い合わせ」のみ。DDoS 攻撃の踏み台にされないようにね。自社管理ドメインへの問い合わせまで拒否してちゃまずいやろう(^^;

というわけで対応。
例えば、

zone "exsample.com" in {
        type slave;
        file "s/exsample.com.zone.bak";
        masters {
                ***.***.***.107;
        };
        allow-query { any ; };
};

のように、allow-query { any ; }; を設定に加えてやれば良いだけ。

以上の設定を行って named 再起動でメッセージの出力は止まった。

一応、JPCERT/CC が公開してくれている

オープンリゾルバ確認サイト

でオープンリゾルバ状態になってないか確認。

このサイトは、アクセスしたホストが設定している DNS と、自身の IP に対してチェックが行われるので、ssh 接続した Linux サーバ上などからチェックするには、コマンドラインからこのサイトに http でアクセスする必要がある。

wget などを使って、

$ wget -qO - http://www.openresolver.jp/cli/check.html

みたいな感じで。

Configured DNS server: [NOT open] 214.***.***.6(s1100.exsample.net)
Source IP address: [NOT open] 214.***.***.128(dns2.exsample.com)

という具合に結果が返ってくるので、[NOT open] になっていれば OK だ。

このアーカイブについて

このページには、2016年11月以降に書かれたブログ記事のうちインターネットなことカテゴリに属しているものが含まれています。

前のアーカイブはインターネットなこと: 2016年6月です。

次のアーカイブはインターネットなこと: 2016年12月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら