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


13

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の動作は非常に非生産的eth1です。これは、すべてのIPのすべてのトラフィックがを排他的に通過するためです。

だから私はうろついて、次のような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番目のコンピューターから、192.168.123.1ping にのみ応答する)

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

ボーナスポイント:ソリューションはLinux 2.6.27.27と互換性がなければなりません。(より具体的には、Slax 6.1.2)


ルーティングテーブルを投稿できますか?
ポンフォンゼ

2
この構成を作成する目的は何ですか?何を達成しようとしていますか?
デビッドシュワルツ

このように狂気があります。
Sirex

これらのインターフェースを結合したい場合は、実際に結合する必要があります。
resmon6

1
@DavidSchwartzいいえ、マシンはスイッチ(またはルーター)のように動作することは想定されていません。各VMに専用の物理NICを備えた8つの仮想マシンを実行していると考えてください(注: VM は実行していません。これは単なる例です)。同じネットワーク上の別のボックスの観点から見ると、私の1台のPCは8台のディスクリートPCとまったく区別できません。
frustrated_tester

回答:


17

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

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

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

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

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

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

残念ながら、これらの3つの手順だけで十分かどうかについては意見が一致しません。ウィークエンドシステムモデルはLinux TCP / IPスタック全体に組み込まれているため、マルチキャストなどの微妙な問題で何が問題になるかは明確ではありません。

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

繰り返しになりますが、ジョブに間違ったツールを選択しました。


6

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

これにより、ブリッジはスイッチのように機能し、サブネットにIPアドレスを設定できます。


私の知る限り、これは実際にはLinuxの正解です。Linuxは、ブリッジデバイスを使用して、Davidの回答で言及された問題の多くを回避します(別名、より良いL2論理ネットワークを構築することでL3の問題を回避します)。
デイブ

4

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

スイッチのサポートも必要になります。

開始に使用できるミニチュートリアルを次に示します。


4

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

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


参考文献:Unix Network Programming:Stevens、Fenner、およびRudoffによるSockets Networking API。RFC1122およびRFC4907も参照してください。
スカペレン

0

はい、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の両方が同じサブネットにあるときに生成される適切な機能、つまりeth1からのARP応答

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

//「new_rt_table」テーブルをセットアップして、eth1経由でパケットをルーティングします

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から適切に終了します。

誰かがそれを働かせたら他の方法を親切に提案しなさい。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.