web-dev-qa-db-ja.com

同じネットワークへのリンクが複数ある場合の優先ルートの指定

同じネットワーク上に複数のインターフェイスとIPアドレスを持つサーバーがあります。非iSCSIトラフィックがインターフェイスの1つを排他的に使用し、iSCSIトラフィックが残りのインターフェイスを排他的に使用するようにしたいと思います。 iSCSIトラフィックをインターフェイスのサブセットに制限するのは簡単です。使用したくないインターフェイスのエントリを/ var/lib/iscsi/ifaces /に作成しないだけです。ただし、非ISCSIトラフィックを1つのインターフェイスに制限するための適切なアプローチが何であるかはわかりません。 Linuxに関する限り、iSCSIインターフェイスと非iSCSIインターフェイスはネットワークへの同様に適切なルートです。

設定例を次に示します

ISCSIストレージのIPアドレスは172.16.50.70-78です。

サーバーには、次のインターフェイス、アドレス、およびルートがあります。

$ ip route list
149.76.12.0/24 dev eth0  proto kernel  scope link  src 149.76.12.4
172.16.0.0/16 dev eth1  proto kernel  scope link  src 172.16.50.80 
172.16.0.0/16 dev eth2  proto kernel  scope link  src 172.16.50.81 
172.16.0.0/16 dev eth3  proto kernel  scope link  src 172.16.50.82
default via 149.76.12.1 dev eth0

必要な構成は、eth3を非ISCSIトラフィックに使用し、eth1とeth2をiSCSIトラフィックに使用することです。ただし、非iSCSIトラフィックは現在eth1から送信されます。

$ ip route get to 172.16.50.90
172.16.50.90 dev eth1  src 172.16.50.80

(以下の元の投稿以降の一部の編集)

現在の構成では、eth1とeth2がiSCSIトラフィックの送信で完全に飽和している場合、非iSCSIトラフィックはeth3がアイドル状態のときにeth1のiSCSIトラフィックと競合します。

Eth1またはeth2ではなくeth3を使用してローカルネットワークにトラフィックを送信することを優先するようにLinuxを構成するにはどうすればよいですか?

すでにnet.ipv4.conf.all.arp_ignoreを1に設定し、net.ipv4.conf.all.arp_announceを2に設定しています。これにより、IPアドレスがインターフェイス間で変動するのを防ぐことができます。 arpフラックス。ルーティングのサポートが必要なだけだと思います。

(その他の編集)

Pfoのおかげで、私はメトリクスを見始めました。ルートを削除し、非iSCSIインターフェイスよりもメトリックが高いiSCSIインターフェイスを使用してルートを再作成すると、希望どおりに機能しているように見えます。 iSCSIトラフィックは、iSCSI IPアドレスへの静的ルートを設定しなくても、専用のインターフェイスを使用します。他のすべてのローカルトラフィックはeth3から出ます。次に、インターフェイスが表示されたときにメトリックを自動的に設定する適切な方法を理解する必要があります。これはRHEL5.5にあります。

ip route delete to 172.16.0.0/16 dev eth1
ip route delete to 172.16.0.0/16 dev eth2
ip route delete to 172.16.0.0/16 dev eth3
ip route add to 172.16.0.0/16 dev eth1 src 172.16.50.80 metric 1
ip route add to 172.16.0.0/16 dev eth2 src 172.16.50.81 metric 1
ip route add to 172.16.0.0/16 dev eth3 src 172.16.50.82 metric 0

(最終更新)

既存のRHELネットワークスクリプトを使用して別のメトリックを割り当てることは不可能のようです https://bugzilla.redhat.com/show_bug.cgi?id=498472

2
sciurus

私が書いた問題を解決するために、 nethook 、ネットワークインターフェイスがRHELベースのディストリビューションで状態を変更したときにスクリプトを実行するデーモンを作成しました。ルートのメトリックを増やしたいインターフェイスに対して このスクリプト を実行します。

編集:私は ifup-localとifdown-local に気付く前にnethookを書きました。おそらく代わりにそれらを使用できます。

1
sciurus

マルチホーミングホストの場合は、注意が必要なことがいくつかあります。まず、Linux TCP/IPスタックがARPクエリと回答に関して同じサブネット内にある複数のインターフェイスを処理する方法に注意する必要があります。この設定は、sysctl(1)を介してクエリできるインターフェイスの_arp_filter_値です。または_/proc_ファイルシステム。

0-(デフォルト)TCP/IPスタックは、他のインターフェイスからのアドレスを使用してARP要求に応答します。これは間違っているように見えるかもしれませんが、コミュニケーションが成功する可能性が高くなるため、通常は理にかなっています。 IPアドレスは、特定のインターフェイスではなく、Linux上の完全なホストによって所有されます。

1-同じサブネット上に複数のネットワークインターフェイスを配置し、カーネルがARPされたIPからそのインターフェイスにパケットをルーティングするかどうかに基づいて各インターフェイスのARPに応答させることができます。つまり、どのNICがARP要求に応答するかを制御でき、最終的にTCP/IPフローを実行できるようになります。

最初に、同じサブネット内にあるすべてのインターフェイスでarp_filterを有効にする必要があります。そうすれば、iSCSIポータルのルーティングテーブルにエントリを簡単に追加して、特定のifaceを使用し、他のインターフェイスのメトリックを調整して、1つがその他。

別のオプションは、ソースベースのルーティングを設定することです。デフォルトの宛先ベースのルーティングは、すべてのifaceが同じサブネット内にある場合に説明したとおりに機能します。

Eth1が取り出される理由は、IPの数値が最も低く、そのネットワークとの通信用に選択されているためです。

1
pfo