Linuxネットワークトラフィックがeth0のみを通過するのはなぜですか?


20

サーバー側にeth0の2つのNICがありますか?192.168.8.140およびeth1?192.168.8.142。クライアントは192.168.8.142にデータを送信しiftop、eth1のトラフィックを表示する予定ですが、表示しません。すべてのネットワークはeth0を経由するため、2つのNICをテストするにはどうすればよいですか?

すべてのトラフィックがeth1ではなくeth0を経由するのはなぜですか?インターフェイスごとに1 Gbit / sを取得できると期待していました。セットアップまたは構成の何が問題になっていますか?

サーバ

ifconfig

eth0    Link encap:Ethernet  HWaddr 00:00:00:19:26:B0
        inet addr:192.168.8.140  Bcast:0.0.0.0  Mask:255.255.252.0
        inet6 addr: 0000::0000:0000:fe19:26b0/64 Scope:Link
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
        RX packets:45287446 errors:0 dropped:123343 overruns:2989 frame:0
        TX packets:3907747 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000
        RX bytes:66881007720 (62.2 GiB)  TX bytes:261053436 (248.9 MiB)
        Memory:f7e00000-f7efffff

eth1    Link encap:Ethernet  HWaddr 00:00:00:19:26:B1
        inet addr:192.168.8.142  Bcast:0.0.0.0  Mask:255.255.255.255
        inet6 addr: 0000::0000:0000:fe19:26b1/64 Scope:Link
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
        RX packets:19358 errors:0 dropped:511 overruns:0 frame:0
        TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000
        RX bytes:1772275 (1.6 MiB)  TX bytes:1068 (1.0 KiB)
        Memory:f7c00000-f7cfffff

サーバ側

# Listen for incomming from 192.168.8.142
nc -v -v -n -k -l 192.168.8.142 8000 | pv > /dev/null
Listening on [192.168.8.142] (family 0, port 8000)
Connection from 192.168.8.135 58785 received!

クライアント

# Send to 192.168.8.142
time yes | pv |nc -s 192.168.8.135 -4 -v -v -n 192.168.8.142 8000 >/dev/null
Connection to 192.168.8.142 8000 port [tcp/*] succeeded!

サーバ側

$ iftop -i eth0
interface: eth0
IP address is: 192.168.8.140

TX:             cumm:  6.34MB   peak: 2.31Mb   rates: 2.15Mb  2.18Mb  2.11Mb
RX:                    2.55GB          955Mb           874Mb   892Mb   872Mb
TOTAL:                 2.56GB          958Mb           877Mb   895Mb   874Mb

$ iftop -i eth1
interface: eth1
IP address is: 192.168.8.142

TX:             cumm:      0B   peak:     0b   rates:     0b      0b      0b
RX:                    4.51KB         3.49Kb          3.49Kb  2.93Kb  2.25Kb
TOTAL:                 4.51KB         3.49Kb          3.49Kb  2.93Kb  2.25Kb

$ ip link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:00:00:19:26:b0 brd ff:ff:ff:ff:ff:ff
$ ip link show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:00:00:19:26:b1 brd ff:ff:ff:ff:ff:ff

1
あなたが本当に探しているものがインターフェイスのボンディングであるように聞こえる:wiki.linuxfoundation.org/networking/bonding
フレキソ

@flexoは完全に正しいです-最終的な目標に応じて、2つのネットワークインターフェイスを結合すると全体的な帯域幅が増えますが、結合オプションは異なります。あなたが得ることができる最高のものは2Gbitの1つのストリームではなく、〜1Gbitの2つのストリームです。さらに、マネージドイーサネットスイッチのサービスが必要です。同様に、4をボンディングすると、4x 1ギガビットのフローが一度に得られます。
クリギー

回答:


32

TCP / IPネットワークスタックには、強力なホストモデルと弱いホストモデルの2つの設計モデルがあります。強力なホストモデルに一致する動作を期待しています。Linuxは、弱いホストモデルを使用するように設計されています。一般に、弱いホストモデルは、ルーティングコードの複雑さを軽減し、パフォーマンスが向上する可能性があるため、より一般的です。それ以外の場合、2つのホストモデルは異なる設計原則にすぎません。どちらも本質的に他のモデルより優れているわけではありません。

基本的に、弱いホストモデルは、送信元IPに関係なく、宛先(または宛先が直接到達できない場合は選択されたゲートウェイ)のIPアドレスに一致するルーティングテーブルにリストされた最初のインターフェイスから発信トラフィックが送信されることを意味しますアドレス

これが基本的に、同じネットワークセグメントで2つのIPアドレスが必要な場合に2つの別々の物理インターフェイスを使用するのが一般的にお勧めできない理由です。代わりに、1つのインターフェイスに2つのIPアドレスを割り当てます(IPエイリアス:eth1 = 192.168.8.142およびeth1:0 = 192.168.8.140)。単一のインターフェイスが提供できる帯域幅よりも多くの帯域幅が必要な場合は、2つ以上のインターフェイスを結合(または、該当する場合はチーム)し、結合/チームで両方のIPを実行します。

多くのsysctl設定を調整し、「高度なルーティング」機能を使用して各NICに独立したルーティングテーブルを設定することにより、Linuxを強力なホストモデルシステムのように動作させることができます。しかし、これは非常に特別な構成であり、実装する前によく考えてください。

Linux Source Routing、Strong End System Model / Strong Host Model?で回答をご覧ください本当に必要な場合。


デフォルトモードは、iptablesを使用してトラフィックをシェーピングしようとする場合に待機するのも悪い驚きです:)
rackandboneman

ええ、過去に強力なホストモデルの実装を楽しんでいます。それはそのプロジェクトに必要でしたが、私はパーソナルマシンでその頭痛を経験することはありません。
ボールドリック

11

考慮すべき追加のポイントは、eth1インターフェイスが255.255.255.255のサブネットマスクで構成されていることです。

つまり、eth1インターフェースは、そのネットワークインターフェース上に他のデバイス(ホスト)を期待しないように構成されています。これは、192.168.8.142クライアントと通信できないことを意味します。


2

多くの検索の後、なぜIPに関連付けられた正しいインターフェイスをnetcatが使用しないのかを見つけました、これは同じ問題です。@telcoMが言ったように、発信トラフィックは最初のインターフェイスに送信されますが、それが問題なので、これを解決する最も簡単な方法は次のとおりです。

ip route add default via 192.168.8.142 dev eth1 table 142
ip rule add from 192.168.8.142 table 142

このルートはip route get 192.168.8.135 from 192.168.8.142、eth0ではなくeth1 を返します。その後、すべてが期待どおりに機能します。


3
私が言及した質問で言及されたARP sysctl設定を省略し、エンタープライズグレードのスイッチとルーターを扱っている場合、ネットワーク管理者は、ルーターで不要な「IPアドレスフラッピング」メッセージを引き起こすことに少し不満を感じるでしょう。システムは、両方のインターフェイスの両方のIPに対するARP要求に応答する場合があります。または、ネットワークにIPハイジャック保護がある場合、システムへのすべてのトラフィックが関与して無効になる可能性があります。
telcoM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.