IT配管業の皆様こんにちは。へなちょこ鯖管の高梨です。
さて、既存のWebサービスを新サーバに移管したり、一時的に別サーバで動かしたい、なんていうときは、どうされていますか?
- サービスを止めずに、
- データの整合性を保たなければならず、
- さらにDNSの設定は諸般の事情によりいじれない
という過酷な条件のもと、なんとかしなければならなくなったら、もう泣きたくなっちゃいますよね。
そんなあなたにご紹介したいのが、以下の iptables 2行。ご存じの方も多いかもしれませんが、私的に大きな収穫だったのでお知らせしたいと思います。
以下、1.1.1.1が旧サーバ、2.2.2.2 が新サーバ、HTTP(80/tcp)を移管したい、とします。1.1.1.1上で実行します。
# iptables -A PREROUTING -t nat -p tcp -d 1.1.1.1 --dport 80 -j DNAT --to-destination 2.2.2.2:80 # iptables -A POSTROUTING -t nat -p tcp -d 2.2.2.2 --dport 80 -j SNAT --to-source 1.1.1.1
これだけで、転送用のデーモン(プロキシ)などを立てるまでもなく、旧サーバの80/tcpへのアクセスは新サーバの同ポートに転送されるようになります。もちろん、アクセス元の制限はありません。一旦旧サーバを経由するので、若干アクセス速度は落ちますが、カーネル動作ですし、日本国内での転送であれば、そう遅くはならない、と思います。DNSのキャッシュに悩まされることもなく、大変便利。
キモは2行目の SNAT でして、これでパケットの送信元IPアドレスを旧サーバのものに書き換えています。1行目だけだと、送信元IPが書き換わらないので、帰りのパケットが正しい経路を経て帰ってきません。
私もiptablesは必要に迫られたら調べるクチなので、動作は保証しかねますし、これ以上の説明はできませんが、参考になれば。