web-dev-qa-db-ja.com

Ubuntu Linux-複数のNIC、同じLAN ... ARP応答は常に単一のNIC

AT&T U-Verseインターネットサービスをご利用いただけます。これには、非常に骨の折れたDSLゲートウェイがあります。

5つのIP(ネットマスク248)がありますが、ゲートウェイは単一のIP->単一のMACアドレスマッピング以外のことを行うことができません。

単一のファイアウォールマシンがあり、異なるIP /ポートコンボをDMZ内の異なる場所にリダイレクトします。

これまでの解決策は、4つの追加のNICを備えたファイアウォール上にVMWare仮想マシンを配置し、他の4つのIPアドレスを取得することですが、問題があります。

ゲートウェイは基本的にARP pingを実行して、IPが予期されるMACで応答しているかどうかを確認します。 4つのNICがすべて同じLAN上にあるため、Linuxは単一のインターフェースを使用して、すべてのIPに対するARP要求に応答しています。これはゲートウェイが期待していることではなく、他の3つのNICをめちゃくちゃにしています。ゲートウェイは、ARP pingの結果が予期されたMACではないIPの着信トラフィックのルーティングを拒否します。

どのようにすれば、eth0のIPに対するARP応答を取得してeth0を出力し、eth1のIPを出力してeth1を出力することができますか?

[〜#〜]編集[〜#〜]

Christopher Cashellの応答は、この状況では機能しません。私はそれを読むことを大いに期待していましたが、...いいえ。

編集2

解決しました!以下の私の答えを参照してください。

16
darron

さて、ここに解決策があります。まず、まとめ:

これが私の基本的なネットワーク計画です:

 eth0 10.10.10.2 netmask 255.255.255.248
 eth1 10.10.10.3 netmask 255.255.255.248
 eth2 10.10.10.4 netmask 255.255.255.248
 eth3 10.10.10.5 netmask 255.255.255.248

すべてのインターフェースが重複しています。これは技術的に間違っており、私のすべての悩みの原因です...しかし、私はこの愚かな住宅のゲートウェイのためにそれをしなければなりません。

まず、ブロードキャストARP要求はこれらすべてに行きます。 4つのIPはすべて有効なローカルアドレスであるため、4つのインターフェイスすべてが応答しようとします。

1)インストールarptables。ブート中にこれをどこかに追加します(/ etc/rc.localここに):

arptables -F INPUT
arptables -A INPUT -i eth0 --destination-ip ! 10.10.10.2 -j DROP
arptables -A INPUT -i eth1 --destination-ip ! 10.10.10.3 -j DROP
arptables -A INPUT -i eth2 --destination-ip ! 10.10.10.4 -j DROP
arptables -A INPUT -i eth3 --destination-ip ! 10.10.10.5 -j DROP

これにより、ブロードキャストが間違ったインターフェイスに入るのを防ぎます。したがって、正しいインターフェースが唯一のレスポンダーになります。

それだけでは十分ではありません。次のビットはARPテーブルの問題です。要求側のPCにはおそらくARPテーブルエントリがすでにあるため、Linuxはそれに関連付けられたインターフェイスを使用します。そのARPテーブルエントリの有効期限が切れるまで、ARP要求に関連付けられたインターフェイスではなく、そのエントリのインターフェイスを使用してARP応答を送信しようとします。

Sysctlオプションrp_filterは、発信ARP応答パケットが間違ったインターフェース上にある場合、それらを拒否しているようです。そう...

2)rp_filterを無効にします。

Debian/Ubuntuでは、これは/ etc/sysctl.d/10-network-security.confの2つのrp_filter行をコメント化することを意味します。

このオプションが有効にされたのは、理由は...インターフェイス間のスプーフィング攻撃を防ぐためです。私はそれを読んで、(MACとIPを交換し、それが同じインターフェースを介してまだルーティングされているかどうかを確認することによって)パケットが出入りするインターフェースに対して正当であることを確認します。したがって、通常はこれをオフにするのは悪い考えです。私の場合、すべてのインターフェースが同じネットワーク上にあるので、そのチェックはまったく問題になりません。

別のインターフェースを追加してスプーフィング保護が必要な場合は、おそらくarptables/iptablesエントリを作成して同じことを行うことができます。

8
darron

選択したソリューションは機能しますが、arptableを使用しない代替手段があります。 (もともとクリストファー・キャシェルは正しい軌道に乗っていたが、彼はくすんでいた。)

つまり、次のパラメータを設定します。

net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2

これらは、最新の2.6シリーズLinuxカーネルを実行している場合に利用できるはずです。システムに '/ proc/sys/net/ipv4/conf// arp_announce' and/proc/sys/net/ipv4/conf //arp_ignore 'が存在することを確認してください。

「arp_filter」パラメータは、さまざまなIPアドレスがLANセグメントを共有しているが、異なるIPサブネットを使用している場合にのみ機能します。それらがIPサブネットも共有している場合は、上記のように「arp_ignore」と「arp_announce」を使用する必要があります。

( 'arp_filter'も '0'に戻す必要があるかもしれません。)

13
Ryan B. Lynch

これは、LinuxがIPとNICを処理する方法に関係しています。基本的に、IPアドレスは特定のNICだけでなく、ボックスに属しているかのように扱われます。その結果、予期しないインターフェイスのIPアドレスからARP応答を取得できます。

解決策はsysctlオプションです。私が覚えているように、あなたが探しているのは:

net.ipv4.conf.default.arp_filter=1
net.ipv4.conf.all.arp_filter=1

これで問題が解決します。それらを/etc/sysctl.confに追加して 'sysctl -p'を実行する(または各行を 'sysctl -w'への引数として実行する)。

これにより、Linuxは、IPアドレスが実際に割り当てられているインターフェース上のARP要求にのみ応答します。

5

これと組み合わせて受け入れられた回答: http://www.linuxquestions.org/questions/linux-networking-3/multiple-interfaces-all-traffic-flows-through-just-one-538701/ =

静的ルートを使用して特定のインターフェイスを介して必要なIPのみと通信する場合、同様の問題に対する強力でシンプルなソリューションが作成されました。

ゲートウェイをブリッジして、ファイアウォールでIPを処理できますか?

0
BJ