iptables を用いて旧 IP から新 IP へ転送する
SERVER
旧 IP を新 IP へ転送する
ハウジングセンターの切り替えに伴って、サーバーの IP アドレスを変更しなければならない状況になりました。
このとき、DNS レコードの伝搬待ちの都合、どうしても旧サーバー IP アドレスへのアクセスが場所によっては数日程度残ってしまう場合があります。多くの場所は数分のうちに問題なく伝搬されたとしても、それでも別の場所では 2 日も伝搬されなかったことがあります。
それでも、このように新サーバー IP へアクセスできない場面があった場合でも、旧サーバー IP へ届いたパケットを新サーバー IP へ転送することができれば、伝搬待ちの間であっても、新サーバーへアクセスさせることができるはずです。
旧 IP から新 IP へ転送する方法としては、DeleGate 9.9.6 を CentOS 5.4 にインストールする や DeleGate で HTTP Proxy を構築する 等で記したような "プロキシ" サーバーを構築するという方法もあると思いますが、今回はそのような代理アクセスではなく、iptables の NAT (Network Address Translation) 機能を利用して宛先アドレスを新 IP に変換する方法で実現を図ってみたいと思います。
NAT を用いてパケットを転送する
例えば、"AAA.AAA.AAA.AAA" という IP アドレスを利用していて、それを "BBB.BBB.BBB.BBB" という IP アドレスに変更したとします。
この時、DNS 伝搬待ちの関係で、旧 IP にたどり着いてしまう通信を想定して、"AAA.AAA.AAA.AAA" 宛に届いたパケットを NAT を使って "BBB.BBB.BBB.BBB" に透過的に転送する方法を、Linux サーバーで iptables を利用してやってみたいと思います。
そのためには、旧 IP アドレスが設定されたサーバー上で iptables の nat 設定を行う必要があるようでした。
Linux サーバーのネットワークインターフェイスに IP アドレス "AAA.AAA.AAA.AAA" が設定されている状態で、iptables の nat 設定を利用して、そのアドレスに送られてきたパケットの宛先を、転送直前 (PREROUTING) に、外部のサーバーに設定されている IP アドレス "BBB.BBB.BBB.BBB" に変換 (DNAT) します。
また、DNAT で外部サーバーへ転送したパケットに対する返答を旧サーバーで管理できるように、外部サーバー "BBB.BBB.BBB.BBB" へ送出するパケットの送信元アドレスを、実際の送信元から旧サーバー "AAA.AAA.AAA.AAA" のアドレスへ変換 (SNAT) します。
具体的には次のような感じの設定になります。
iptables -t nat -A PREROUTING -d AAA.AAA.AAA.AAA -j DNAT --to BBB.BBB.BBB.BBB
iptables -t nat -A POSTROUTING -d BBB.BBB.BBB.BBB -j SNAT --to AAA.AAA.AAA.AAA
CentOS 5.5 で、"/etc/sysconfig/iptables" ファイルに設定内容を記載する場合には、以下のような iptables の restore 用の書式で記載することになります。
*nat
-A PREROUTING -d AAA.AAA.AAA.AAA -j DNAT --to BBB.BBB.BBB.BBB
-A POSTROUTING -d BBB.BBB.BBB.BBB -j SNAT --to AAA.AAA.AAA.AAA
COMMIT
こうすることで、旧サーバーが新サーバーとの通信の間に立つことができ、ただしく通信を中継できるようになりました。
IP マスカレード (NAPT) を設定しているゲートウェイサーバー上での設定であれば POSTROUTING での SNAT 設定は無くても(NAPT により送信元アドレスの変換が行われるので)大丈夫なようでしたけど、それ以外のサーバーでは 送信先毎にも SNAT 設定を行う必要があるようでした。