web-dev-qa-db-ja.com

同じサブネット上のIPを持つ複数の物理インターフェース

9つのNICが搭載されたLinuxボックスがあり、そのうちの8つに同じサブネット上で一意のアドレスを設定します。例:

ifconfig eth1 192.168.123.1 netmask 255.255.0.0
ifconfig eth2 192.168.123.2 netmask 255.255.0.0
ifconfig eth3 192.168.123.3 netmask 255.255.0.0
...
ifconfig eth8 192.168.123.8 netmask 255.255.0.0

この場合、デフォルトのARPの動作は、すべてのIPのすべてのトラフィックがeth1のみを通過するため、非常に逆効果です。

だから私は周りをうろついて、次のようなsysctlにいくつかの変更を加えました:

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

そのため、eth1が他のユーザーになりすますことはできませんでしたが、eth1のアドレス以外にpingすることはできません。 (たとえば、同じスイッチ上の2番目のコンピューターから、pingに応答するのは192.168.123.1のみ)

Arptablesやiproute、SOMETHINGで何かをする必要があると思いますが、この分野では海で迷っています。

ボーナスポイント:ソリューションはLinux 2.6.27.27と互換性がある必要があります。 (より具体的には、Slax 6.1.2)

13

強力なエンドシステムモデル が必要です。 Linuxは基本的に、弱い送信システムモデルを中心に構築されているため、このアプリケーションに適したOSの選択ではありません。

ARPからポリシールーティング、送信元アドレスの選択まで、必要なすべての動作を偽造する必要があります。また、パケットが間違ったインターフェイスに到着した場合にパケットが受け入れられないようにするためのフィルターも必要です。

間違いなく必要な手順は次のとおりです。

  1. すべてのインターフェースでarp_filter = 1およびarp_ignore = 2を構成します。

  2. 発信トラフィックに対して、インターフェイスごとのソースベースのルーティングを追加します。 (宛先インターフェースは、送信元アドレスに基づいて選択する必要があります。)

  3. インターフェースごとの入力フィルタリングを追加して、間違ったインターフェースで受信されたパケットを警告なしでドロップします。 (宛先アドレスが別のインターフェースに割り当てられているパケット。)

残念ながら、これらの3つのステップがすべて必要かどうかについてコンセンサスはありません。ウィークエンドシステムモデルはLinux TCP/IPスタック全体に組み込まれており、マルチキャストなどの微妙な問題で何が問題になるかは明確ではありません。

たとえば、ブロードキャストの出力インターフェイスをどのように選択するかは明確ではありません。それはそれらすべての外に出るべきですか?多分。スタックが、インターフェイスの1つに割り当てられていない送信元アドレスで送信ブロードキャストを受け取った場合、正しい動作は何ですか?

繰り返しますが、あなたはその仕事のために間違ったツールを選択しました。

17
David Schwartz

8/9インターフェースを使用してブリッジを作成し、そのブリッジにIPアドレスを割り当てることをお勧めします(bridge-utilsパケット、コマンド 'brctl add')。

このようにして、ブリッジはスイッチのように機能し、サブネットにIPアドレスを持つことができます。

7
Be2eB

物理インターフェイスを結合してから、単一の結合インターフェイスにすべてのアドレスを構成することをお勧めします。

スイッチのサポートも必要です。

これが ミニチュートリアル です。これを使って始めることができます。

4
bahamat

9台の個別のマシンと同等のテスト環境が必要なようで、1台のマシンの9つのインターフェイスでそれをエミュレートできると信じていました。 Linuxでは、David Schwartzが説明した理由により、単一のスタックでこれを行うことはできません。 BTDTと傷があります。それは2つのインターフェースで十分に悪かった。

1つのホストで8個または9個の個別の仮想マシンを実行し、8個または9個のインターフェースをこれらの仮想マシンにブリッジすることをお勧めします。

4
Skaperen

はい、David Schwartzの提案に従ってください。

echo -ne 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth3/rp_filter

//適切な機能、つまりeth0とeth1の両方が同じサブネットにある場合に生成されるARPはeth1から応答します

echo -ne 0 > /proc/sys/net/ipv4/conf/all/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth1/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

//Create a table called "new_rt_table" and create a routing rule that says any packet with a mark equal to '1' gets routed according to the "new_rt_table"(can name it whatever you want) table. The file /etc/iproute2/rt_tables is the only source of table names on the system. Internally, routing tables have integer identifiers.

echo 1 new_rt_table >> /etc/iproute2/rt_tables
ip rule add from all fwmark 1 table new_rt_table

// eth1経由でパケットをルーティングするように「new_rt_table」テーブルを設定します

ip route add default dev eth1 table new_rt_table
ip route show table new_rt_table

//「ip route」がeth1を介してルーティングできるようにパケットにマークを付ける

iptables -F -t mangle
iptables -t mangle -I OUTPUT -s <ip addr of eth1> -o eth0 -j MARK --set-mark 1

//カーネル構成で複数のルーティングテーブルのサポートを有効にします。

カーネル構成

→ネットワークサポート→ネットワークオプション

[*] IP:高度なルーター

[*] IP:ポリシールーティング

CONFIG_IP_ADVANCED_ROUTER

CONFIG_IP_MULTIPLE_TABLES

//上記の手順では、eth0から出力されるパケットをリダイレクトして、eth1から適切に終了します。

誰かがそれを動作させる場合は、他の方法を教えてください。

0
noel av