web-dev-qa-db-ja.com

ソースインターフェイスとIPアドレスに基づくiptablesSNATの使用

入ってくるIPアドレスとインターフェースに応じて送信元IPアドレスを変更したいと思います。次の例を考えてみましょう。

  -----------------------------
  |                            |
  |          Host 1            |
  |                            |
  |        application         |
  |                            |
  |                    eth0    |
  -----------------------------
                         |
                         |  IP0-IP47
                         |
          -----------------------------
          |             eth0           |
          |         Host 2             |
          |                            |
          |         NAT                |
          |                            |
          |  eth1.1   eth1.2  eth1.3   |
          -----------------------------
              |         |        |
              |         |        | 
         IP0-IP15   IP0-IP15   IP0-IP15

ホスト2は、インターフェースeth1.1、eth1.2、eth1.3でメッセージを受信して​​います。各インターフェイスには、16個の一意のIPアドレスを持つ16個のホストがありますが、これらの16個のIPアドレスはすべてのインターフェイスで同じです。 NATを実行する必要があるため、ソースIPは、アプリケーションに送信されるメッセージに48個の一意の送信元IPアドレスを設定するために、送信元IPとインターフェイスに基づいて変更されます。

モストダウンホストで実行されているアプリケーションとそのIPは変更できません。だから私はそれらをVLANに入れることにしました。

さまざまなチュートリアルやHOWTOを検索しましたが、探しているものが見つかりませんでした。問題は次のとおりです。SNATはPOSTROUTINGチェーンでのみ使用できますが、POSTROUTINGではそれが入ったインターフェイスに関する情報がありません。

私は私の仮定で正しいですか?私はこのネットワークに不慣れなので、どんな助けやアドバイスも役に立ちます。

ご協力いただきありがとうございます。

3
user2063933

解決しました。

パケットの宛先はNATが実行されたマシンであったため、POSTROUTINGチェーンを使用できませんでした。

同じ問題を抱えている他の人のために:xtables-addonsをチェックしてください:RAWNATターゲット http://manpages.ubuntu.com/manpages/karmic/man8/xtables-addons.8.html

これにより、PREROUTINGでステートレスSNATを使用できます。それがまさに私が探していたものでした。モジュールをビルドしてロードするだけです(例:modprobeを使用)。

これを実装する場合は、ステートレスであることを忘れないでくださいNATしたがって、SNATやDNATのように自動的にリバースNATを実行しません。したがって、独自のリバースNATルールを実装します。

0
user2063933

おそらくあなたはこれを行うことができます:

  1. PREROUTING時に、異なるインターフェイスからのパケットを異なる番号でマークします。

    Sudo iptables -t nat -A PREROUTING -i eth1.<x> -j MARK --set-mark <choose_a_unique_number_per_interface>
    
  2. ルーティング後の時点でSNATとマークを使用します。

    Sudo iptables -t nat -A POSTROUTING -s <iprange_of_eth1.<x>> -m mark --mark <number_given_to_eth1.<x>_at_the_time_of_prerouting> -j SNAT --to-source <an_ip_from_48_ipset>
    
1
harihardik