マルチホームシステムとは、複数のIPインターフェースを持つシステムのことです。これらのインターフェイスは、同じサブネット上にあっても、異なるサブネット上にあっても構いません。今日はFTPとNDMPのようなプロトコルについて考えてみたいと思います。どちらのプロトコルでも、サーバはクライアントからの接続を受け入れてから、クライアントへの新しい接続を行います。マルチホームシステムでは、この新しい接続がすべての問題の原因となります。
両方のプロトコルでは、ソース IP アドレスは、クライアントが最初に接続した IP アドレスに基づいていません。代わりに、クライアントに戻るために使用されるゲートウェイに関連付けられたインターフェイスに基づいています。
例えば、次のようなインターフェイスとルーティングテーブルを指定します。
ifconfig -all
Number of interface(s) under IP: 5
%phx_vos#loop.m16: <UP, LOOPBACK, RUNNING>
127.0.0.1 netmask 0xff000000
%phx_vos#enetA: <UP, BROADCAST, RUNNING, NOFORWARDBROADCAST, KEEPALIVE>
172.16.1.50 netmask 0xffffff00 broadcast 172.16.1.255
%phx_vos#enetZ: <UP, BROADCAST, RUNNING, NOFORWARDBROADCAST, KEEPALIVE>
192.168.77.50 netmask 0xffffff00 broadcast 164.152.77.255
ready 15:33:51
route print
Default Gateway: 192.168.77.1
ready 15:33:57
10.1.1.1.1 の IP アドレスを持つクライアントが 172.16.1.50 に接続している場合、この接続を「A」と呼びます。10.1.1.1.1 にパケットを送信するには、モジュールは 192.168.77.0/24 ネットワーク上にあるデフォルトゲートウェイを使用しなければならず、192.168.77.50 インターフェイスを使用します。接続「A」のために 10.1.1.1.1 へのすべてのトラフィックにこのインターフェイスを使用しますが、TCP ヘッダーの IP アドレスは 172.16.1.50 になります。しかし、モジュールが 10.1.1.1.1.1(接続「B」)への新しい接続を作成すると、STCP はデフォルトで 192.168.77.50 をソース IP アドレスとして選択します。これは、ゲートウェイが接続されているインターフェイスであるためです。アプリケーションはこれをオーバーライドすることができますが、FTPもNDMPもこれを行いません。
主に考慮すべき点は、ルータのファイアウォールとアクセスリストの設定です。クライアントのファイアウォールやルータのACLが172.16.1.50からの接続のみを許可するように設定されている場合、192.168.1.50からの接続は失敗します。解決策としては、172.16.1.1.0/24サブネット上のルータを使用して10.1.1.1へのルートを作成するか(もちろん、選択したルータは10.1.1.1に到達できる必要があります)、ファイアウォールとルータのアクセスリストを192.168.1.50を許可するように再設定するかのいずれかです。
以下のスクリプトでテストできます。
stcp_calls
socket
connect -name 10.1.1.1 -port N
socket
bind -name 172.16.1.50 -port 0
connect -name 10.1.1.1 -port N
もちろん、10.1.1.1.1 をクライアントの実際の IP アドレスに、172.16.1.1.50 をクライアントが接続する IP アドレスに置き換える必要があります。ポートNは、クライアントで開いているポートで、ファイアウォールやルータのACLで許可されているものでなければなりません。
最初の接続ではデフォルトのIPアドレスを使用し、2回目の接続では172.16.1.50を使用します。最初の接続がタイムアウトしたり(1分ほどかかります)、接続が拒否されたエラーですぐに戻ってきたりしますが、2回目の接続は動作します(すべて"stcp:"のプロンプトが表示されます)が、解決する必要があるファイアウォールやルータのACLの問題があることを確認できます。