IPエイリアシングを行う場合、OSは発信TCP / IP接続のソースとして使用されるIPアドレスをどのように決定しますか?


15

単一のNICにエイリアスされた4つのIPアドレスでUbuntu Serverを実行しているサーバーがあります。

eth0       192.168.1.100
eth0:0     192.168.1.101
eth0:1     192.168.1.102
eth0:2     192.168.1.103

(例として192.168.xxを使用して、これらがパブリックIPアドレスの範囲にNATされていると仮定します)

クライアントの1人がFTPを介してインベントリを公開しているため、夜間にログインしてサーバーから大きなファイルをダウンロードします。彼らのファイアウォールは、(パッシブ)FTP接続が192.168.1.100から確立されることを期待しています。

サーバーが論理的に単一のアダプター上に4つのIPアドレスを持っている場合、オペレーティングシステムはどのIPアドレスが発信TCP / IP接続のソースとして使用されるかをどのように決定しますか?

192.168.1.101でサーバーにsshして、インタラクティブにFTPを実行するとします。発信TCP / IP接続は、シェルが接続されているインターフェイスであることをOSが認識しているため、192.168.1.101を使用しますか?

FTPタスクがシェルのないcronジョブを介して非対話的に実行されるとどうなりますか?

おそらくおわかりのように、これはかなり混乱しているので、私の質問が少なくとも意味を成すことを願っています。

編集

私が尋ねている理由を明確にするために-私はルーティングテーブルに変更を加えておらず、実際には0.0.0.0ルートのIFaceとして「eth0」をリストしています。ただし、すべての兆候は、ソースとして実際にeth0:0を使用していることです。

Destination    Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0        192.168.1.1     0.0.0.0         UG    100    0        0 eth0

ルーティングテーブルをいじったり、クライアントにファイアウォールルールを変更して必要な動作をさせたりすることはできますが、OSにバグがあるのか​​、私の素朴な理解があるのか​​を知るために、これがどのように機能するかについて少し洞察を得ようとしていますすべてのピースがどのように組み合わされるかについて。

ありがとう

回答:


12

デフォルトでは、Linuxでは、インターフェイスに異なるサブネット上にある複数のアドレスがある場合、それぞれのサブネット宛てのトラフィックには適切なソースIPがあります。つまり、eth0に192.168.1.1/24と10.1.1.1/8の2つのアドレスがある場合、10.0.0.0サブネット上のものへのトラフィックにはソース10.1.1.1があり、192.168.1.0サブネット上のものへのトラフィックにはソースがあります192.168.1.1。この場合、「src route 1.2.3.4」オプションを「ip route」に使用して、送信元アドレスを明示的に割り当てることもできます。

ただし、あなたの場合、すべてのアドレスは同じサブネット上にあるため、「プライマリ」アドレス(「ip addr list dev eth0」で示される)が、そのインターフェースから出るトラフィックのソースIPとして使用されます。この場合、「ip route」を使用してソースIPを制御することは可能だと思いますが、対象のトラフィックのソースアドレスを書き換えるためにiptablesを使用する方が簡単であることがわかりました。

特定の送信元アドレスを特定の宛先に強制的に使用する場合は、SNATルールを使用して実行できます。

iptables -t nat -I POSTROUTING -o eth0 -d dest-IP-or-net/mask -s primary-IP-of-eth0 -j SNAT --to-source desired-source-IP

「プライマリ」eth0 IPが192.168.100.1であるが、1.2.3.4へのトラフィックに192.168.100.2のソースを持たせたい場合は、次のようにします。

iptables -t nat -I POSTROUTING -o eth0 -d 1.2.3.4/0 -s 192.168.100.1 -j SNAT --to-source 192.168.100.2

「-s 192.168.100.1」が重要であることに注意してください。転送されたトラフィックの送信元アドレスがこのルールによって書き換えられるのを防ぎます。

Linuxで複雑なネットワーク構成を実装する場合は、Linux Advanced Routing and Traffic Controlのドキュメント(http://lartc.org)を読む必要があります


サンプルでは、多分、または「1.2.3.4を-d」「1.2.3.4/332は-d」と「1.2.3.4/0を-d」置き換え
クリスチャン・

5

あなたの例では、すべてのIPが同じネットワークに属さないように近すぎることがわかります

単に4つのIPエイリアスを持っているのではなく、実際にマルチホーミングしていると確信していますか?

後者の場合は、これに似たものでルートにソースIPを設定できます

/ sbin / ip route show 192.168.222.0/24 dev eth0 proto kernel scope link src 192.168.222.178 169.254.0.0/16 dev eth0 scope link via 192.168.222.1 dev eth0

sudo / sbin / ip routeは、192.168.222.1 src 192.168.222.178を介してデフォルトを置き換えます

/ sbin / ip route show
192.168.222.0/24 dev eth0 proto kernel scope link src 192.168.222.178 169.254.0.0/16 dev eth0 scope link via 192.168.222.1 dev eth0 src 192.168.222.178

再起動間で永続化する方法については、manインターフェイスを参照してください


あなたは正しいです。おそらく、マルチホーミングという用語を乱用しているのでしょう。データセンターでは、すべて同じサブネット上に4つのIPアドレスを提供しています。
ジョーホロウェイ

質問を編集できることを知っていますよね?
hayalci 09年

5

別のゲートウェイを使用するように指示する特定のルートがない限り、デフォルトゲートウェイがルーティングテーブルにあるものを使用します。 route -n

編集:私はあなたの質問をあまりにも早く読んだようです...

パッシブモードを使用しており、クライアントが常に接続を開始するため、IPヘッダーのsrc ipフィールドは、クライアントが接続したIPとして常に表示されると思います。サーバーが接続を開始していたアクティブモードであった場合、それは常に「プライマリ」IPになると思います。アドレスが同じサブネット内にある場合、Linuxは、「Primary」を追加した最初のアドレスと他のアドレスをセカンダリにします。

ただし、tcpdump -nを実行し、src IPとして表示されるものを確認します。

EDIT2:さて、私はあなたがサーバーを実行しているという観点から上記を書いたので、あなたはクライアントであり接続を開始しているので、それは常にプライマリIPアドレスから来ているように見えますが、もう一度試してみてくださいtcpdumpを使用します。


ルーティングテーブルは単なるデフォルトであり、サブネットは1つだけです。別のポスターは、マルチホーミングという用語を誤用していることを示しました。ただし、eth0エイリアスを使用していることを期待しています。wgetを使用してwhatsmyip.netをダウンロードしましたが、代わりにeth0:0を使用していることがわかります。
ジョーホロウェイ

本当に... whatsmyip.netがあなたのパブリックIPを表示する必要があり、私には意味がありません
カイルブラント

私はそれがeth0のに関連付けられているプライベートIPにNAT-EDであるパブリックIPアドレスを表示するように期待するのに対し、0:より明確にするために、それはNAT-EDはeth0に関連付けられているプライベートIPにあるパブリックIPアドレスを示します
ジョー・ホロウェイ

1
ここでのこの答えは、あまりにも多くの支持を集めており、多くの編集を含んでおり、多くのものを混乱させ、助けにはなりません。tbmanとjknapkaの答えは素晴らしく、とても助けてくれました。
クリスチャン

4

FTPジョブに接続に使用するインターフェイスを指定する方法がない限り、デフォルトは関連するサブネット上の最初の物理インターフェイス(この場合はeth0)になります。異なるサブネット上に2つのNICを備えたサーバーがある場合、ルーティングテーブルに基づいて、使用するインターフェイスがわかります。

システムには単一の物理インターフェース(eth0)と同じサブネット上の4つの仮想/エイリアス(eth0:0からeth0:2)しかないため、アプリケーションが十分にスマートでない限り、発信トラフィックはソースとしてeth0 IPアドレスを使用しますアウトバウンドインターフェイスを宣言します。


2
これは私の想定でしたが、すべてのテストは、ソースとしてeth0:0を使用していることを示しています。
ジョー・ホロウェイ

次に、おそらくデフォルトルートがeth0:0インターフェイスを使用するように構成されます。イーサネットブリッジを使用するインストールがあり、デフォルトルートに仮想ブリッジインターフェイスを使用するように構成されています。
sysadmin1138

接続を受信したIPを印刷するために、別のマシンで簡単なプログラムをセットアップしました。nc -s <ip of eth0:2>netcatでbind(2)以前に行ったことがありますが、常にソースアドレスを表示するものに接続すると、実際にはeth0:0のIP になりconnect(2)ます。そのため、マシンに複数の送信元アドレスからの接続を許可するためにエイリアスが機能しないようです。
ピーターコーデス

4

次のように、ip route getコマンドで使用されるデバイスとsrc ipアドレスを確認できます。

$ /sbin/ip route get 1.1.1.1
1.1.1.1 via 2.2.2.2 dev eth0  src 2.2.2.2 
    cache  mtu 1500 advmss 1460 hoplimit 64

エイリアス環境でこれを試したことはありませんが、これが役立つことを願っています。


1

アウトバウンド接続を確立する際、サーバーはルーティングテーブルを調べて、4つのインターフェースのどれを使用するかを決定します。TCP接続には、出口インターフェースのソースIPがあります。

netstat -rn

ルーティングテーブルの出力を提供します。接続しようとしているクライアントIPに一致する特定のエントリを探します。存在しない場合は、デフォルトルート(0.0.0.0、マスク0.0.0.0)を使用します。複数のデフォルトルートがある場合、最もコストの低いルートが使用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.