2つのサーバーがあるとします。
->サーバーAのIPはXXX.XXX.XXX.XXXです
->サーバーBのIPはYYY.YYY.YYY.YYYです。
トラフィックをサーバーA(ポート80)からサーバーB(ポート80)にリダイレクトする必要があります。
これを行う簡単な方法は、次のルールをiptablesとともにサーバーAに配置することです。
iptables -t nat -A PREROUTING -p tcp --dport port -j DNAT --to-destination server B:80
ただし、この単純なルールは機能しません。次のルールを追加する必要があります。
iptables -t nat -A POSTROUTING -j MASQUERADE
なんでそうなの?なぜPOSTROUTINGルールを追加する必要があるのですか? PREROUTINGの後、パケットは自動的にサーバーBに送信される必要がありますか?
*私はiptablesやLinux Network Schedulingの専門家ではありませんが、私はお手伝いします!
iptablesのマニュアルページを見るuser@Host:~$ man 8 iptables
nat( Network Address Translation )テーブルの説明で確認できます:
「このテーブルは、新しい接続を作成するパケットが検出されたときに参照されます。このテーブルは3つの組み込みで構成されています:PREROUTING(パケットが到着するとすぐに変更するため)、OUTPUT(ローカルで生成されたパケットをルーティング前に変更するため)、およびPOSTROUTING(パケットが送信されようとしているときに変更するため)。 "
それはPOSTROUTINGチェーンです:-)
以下から得たマスカレードの説明 The Linux Documentation Project と、あなたの情報を理解できるようにしています:
- マシン[〜#〜] b [〜#〜]に自分のPPPまたはイーサネット接続のLinuxボックス[〜#〜] a [〜#〜]はそのゲートウェイです。
- パケットがLinuxボックスに入ったとき[〜#〜] a [〜#〜][〜# 〜] b [〜#〜]、パケットを新しいTCP/IP送信元ポート番号に割り当て、独自のIPアドレスをパケットヘッダー内に挿入しますオリジナルを保存します。次に、MASQサーバーはPPP/ETHインターフェイスを介してインターネットに変更されたパケットを送信します。
- パケットがインターネットからLinuxボックスに戻ると[〜#〜] a [〜#〜]、Linuxはポート番号が上記で割り当てられたポート。その場合、MASQサーバーは元のポートとIPアドレスを取得し、それらを返されたパケットヘッダーに戻し、パケットを[〜#〜] b [〜#〜]に送信します。
- パケットを送信したホストは違いを知ることはありません。
あなたの質問は2つの部分に分かれます。
最初の質問に答えるには、まずiptables NATの仕組みを理解する必要があります。NATテーブルは、接続の最初のパケットで使用され、どの変換が必要かを決定します最初のパケットが処理されると、接続の後続のパケットを処理するために使用される内部マッピングテーブルエントリが作成されますが、ボックスは処理したパケットのみを処理できます。
したがって、XXX.XXX.XXX.XXXとYYY.YYY.YYY.YYYはどちらも、特別なルーティングが構成されていないインターネット上のサーバーであると仮定します。クライアントもファイアウォールのないオープンインターネット上にあり、IPがZZZ.ZZZ.ZZZ.ZZZであると仮定します。 MASQURADEルールなしで何が起こるかを見てみましょう。
MASQUERADEルールを追加すると、これはどのように変化しますか?
質問2については、答えはありません。iptablesは、SNAT/MASQUERADEはPOSTROUTINGでのみ実行できると主張していますが、これが当てはまる理由について、技術的に正当な理由があるとは思いません。
MASQUERADEの使用は避けた方がいいでしょう。これにはサーバー上の問題があります。最初に、乱用を制御するために必要なトラフィックの元のソースに関する情報を失います。第2に、サーバーAのポートの数は限られています。
これは解決できますが、両方のサーバーが私たちの管理下にある場合のみです。解決策には3つのステップがあります。