web-dev-qa-db-ja.com

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

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

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.x.xを使用して、これらが一連のパブリックIPアドレスにNAT変換されていると仮定します)

クライアントの1つがFTP経由で在庫を公開しているため、毎晩ログインしてサーバーから大きなファイルをダウンロードします。彼らのファイアウォールは私たちの(パッシブ)FTP接続が192.168.1.100から作られることを期待しています。

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

192.168.1.101のサーバーにSSHで接続し、FTPを対話的に実行するとします。シェルが接続されているインターフェイスがOSであることをOSが認識しているため、送信TCP/IP接続は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にバグがあるのか​​、それとも単純に理解しているのかを知るために、これがどのように機能するのかについて少し洞察を得ようとしていますすべてのピースがどのように組み合わされるかについて。

ありがとう

15
Joe Holloway

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 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」が重要であることに注意してください。これにより、forwardedトラフィックの送信元アドレスがこのルールによって書き換えられるのを防ぎます。

Linuxに複雑なネットワーク構成を実装する場合は、Linux Advanced Routing and Traffic Controlのドキュメント http://lartc.org をお読みください。

12
user14017

あなたの例では、すべての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 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カーネルスコープリンクsrc 192.168.222.178 169.254.0.0/16 dev eth0スコープリンク192.168.222.1 dev eth0 src 192.168.222.178を介したデフォルト

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

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

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

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

ただし、完全にはわかりませんが、tcpdump -nを実行して、src IPとして表示されるものを確認します。

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

5
Kyle Brandt

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

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

4
sysadmin1138

次のように、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

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

4
tomoe

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

netstat -rn

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

1
Murali Suriar