サーバの更新を行っていた際、無性にIPアドレスの入れ替えを行いたい衝動に駆られたのでその記録です。
前提
名前でのアクセスであれば、DNSに登録してあるIPアドレスを変更することでサーバーを入れ替えることが可能です。テスト時であれば /etc/hosts や windows/system32/drivers/etc/hosts を使って宛先を偽ることもできるでしょう。しかし、一部にはIPアドレス指定でアクセスする必要があるサーバーもあります。
この場合どうすればよいでしょう?
NATを使いましょう
いきなり結論ですが、NATを使います。
NATというと家庭用ルーターでも標準的に使われるあの技術です。NATには様々な拡張仕様があるので何をしているもの?と言われてもなかなか説明が難しいと思いますが、今回必要な機能は単純にNetwork Address Translationの名前通りIPアドレスを変換するだけです。
YAMAHAルーターでVPN接続された環境を例にしていますが、NAT自身はルーター以外にもiptablesやnpf等でも使えるので様々な環境に応用可能だと思います。
具体的な作業例
10.22.0.30
server1 ----LAN---- routerA ----VPN---- routerB ----LAN---- PC
server2
10.22.0.31
server1の新しい環境としてserver2を用意します。ただ、server1は稼働中なのでここは手を付けず、IPアドレスは10.22.0.31として別の機材を用意しています。ある程度移行がすすんだところで、IPアドレスでのアクセス確認を行うのですが、アドレスを付け替えるてしまうと運用(=server1)に支障が出ます。そこで、途中経路に細工をして10.22.0.30でserver2へのアクセスを行いますが、routerBに細工をすると影響が出る範囲はごくわずかに限られそうです。
YAMAHAルーターの場合、追加の設定はは以下のようになります。
tunnel select 1
ip tunnel nat descriptor reverse 1
nat descriptor type 1 nat
nat descriptor address outer 1 10.22.0.30-10.22.0.31
nat descriptor static 1 1 10.22.0.30=10.22.0.31 1
nat descriptor static 1 2 10.22.0.31=10.22.0.30 1
先頭のip tunnel nat
は用意されたnatをtunnelに適用しているのですが、YAMAHAのNATは「自分と相手のある通信で、相手に自分を偽る仕組」と説明があります。通常の利用では、宅内のサーバーにNATの外からアクセスするときに自分側のIPアドレスやポートを変換するのが基本機能だからですね。
今回はこれを逆向きに使っているのでreverse
と記述します。
次にnat descriptor type
で1番のnatをtype=natで定義していきます。
outerは外側ネットワークでの変換対象のIPアドレスを記載しています。
static として変換の対応を書いていますが、routerBの外側にある10.22.0.30へアクセスする際に10.22.0.31に変換しています。逆の変換も記述しておくと、お互いにアドレスが入れ替わる形になります。
NATの外側ではserver1, server2は正しいIPアドレスで認識されていますが、routerBを経由する場合だけお互いが入れ替わっている状態になります。
応用範囲は様々
今回は仮環境として、異なるIPアドレスでアクセスするためにNATを使いましたが同じような設定で、同じIPアドレスの範囲を持つ別々のネットワークをつなぎ合わせたり応用範囲は様々です。ただ、凝り過ぎるとどこで何が起きてるのかさっぱりわからなくなるのでやり過ぎにはお気を付けください。