web-dev-qa-db-ja.com

ポート転送-なぜPOSTROUTINGルールのiptablesが必要なのですか?

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に送信される必要がありますか?

3
Duke Nukem

*私はiptablesやLinux Network Schedulingの専門家ではありませんが、私はお手伝いします!

iptablesのマニュアルページを見るuser@Host:~$ man 8 iptablesnatNetwork 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つの部分に分かれます。

  1. MASQUERADEルールが必要なのはなぜですか。
  2. なぜPOSTROUINGチェーンに入れる必要があるのですか?.
  3. 代替はありますか?

最初の質問に答えるには、まずiptables NATの仕組みを理解する必要があります。NATテーブルは、接続の最初のパケットで使用され、どの変換が必要かを決定します最初のパケットが処理されると、接続の後続のパケットを処理するために使用される内部マッピングテーブルエントリが作成されますが、ボックスは処理したパケットのみを処理できます。

したがって、XXX.XXX.XXX.XXXとYYY.YYY.YYY.YYYはどちらも、特別なルーティングが構成されていないインターネット上のサーバーであると仮定します。クライアントもファイアウォールのないオープンインターネット上にあり、IPがZZZ.ZZZ.ZZZ.ZZZであると仮定します。 MASQURADEルールなしで何が起こるかを見てみましょう。

  • クライアントは初期パケットZZZ.ZZZ.ZZZ.ZZZ:1234-> XXX.XXX.XXX.XXX:80を送信します
  • パケットは、宛先NATを実行するサーバーAに到着するため、パケットはZZZ.ZZZ.ZZZ.ZZZ:1234-> YYY.YYY.YYY.YYY:80になり、接続追跡エントリが作成され、パケットが通信網。
  • ISPはこの時点で「なりすまし」のためにパケットをブロックするか、サーバーBに配信する場合があります。サーバーBに配信するとします。
  • パケットはサーバーBに到着し、サーバーYYY.YYY.YYY.YYY:80-> ZZZ.ZZZ.ZZZ.ZZZ:1234を作成します。
  • 応答はクライアントに配信されます。
  • クライアントは、ソケットのテーブルで応答を検索しますが、一致を見つけることができず、パケットを破棄します(おそらく応答でICMPエラーを送信します)。

MASQUERADEルールを追加すると、これはどのように変化しますか?

  • クライアントは初期パケットZZZ.ZZZ.ZZZ.ZZZ:1234-> XXX.XXX.XXX.XXX:80を送信します
  • パケットは宛先を実行するサーバーAに到着しますNAT and MASQURADING、つまりパケットはXXX.XXX.XXX.XXX:5678-> YYY.YYY.YYY .YYY:80ネットワークに戻します。
  • ISPはパケットをサーバーBに配信します。
  • パケットはサーバーBに到着し、サーバーYYY.YYY.YYY.YYY:80-> XXX.XXX.XXX.XXX:5678を作成します。
  • 応答はサーバーAに配信されます
  • サーバーAは接続追跡テーブルでパケットを検索し、その送信元と宛先をXXX.XXX.XXX.XXX:80-> ZZZ.ZZZ.ZZZ.ZZZ:1234に変更します。
  • ネットワークはクライアントに応答を配信します。
  • クライアントは、ソケットのテーブルで応答を検索し、一致を見つけます。接続が正常に確立されました。

質問2については、答えはありません。iptablesは、SNAT/MASQUERADEはPOSTROUTINGでのみ実行できると主張していますが、これが当てはまる理由について、技術的に正当な理由があるとは思いません。


MASQUERADEの使用は避けた方がいいでしょう。これにはサーバー上の問題があります。最初に、乱用を制御するために必要なトラフィックの元のソースに関する情報を失います。第2に、サーバーAのポートの数は限られています。

これは解決できますが、両方のサーバーが私たちの管理下にある場合のみです。解決策には3つのステップがあります。

  • サーバーAとサーバーBの間にある種のトンネルを確立します。トンネルのエンドポイントにはプライベートIPアドレスが割り当てられます。
  • サーバーAで、サーバーBのトンネルIPへのトラフィックをDNATします。
  • サーバーBでは、ポリシールーティングを使用して、サーバーBのプライベートIPから送信されるトラフィックが、インターネットに送り返されるのではなく、トンネルを介してサーバーAに送信されるようにします。
2
plugwash