マルチホームLinuxシステムは真の目標を達成できますか?強力なESモデル?
###特定のユースケース
私は5つの異なるインターフェイスを持つシステムを持っています。各インターフェイスは同じサブネットに接続されているため、同じインターネットゲートウェイに接続します。
- 私は同じポートで各インターフェイスを個別に受信し、パケットが常に着信するのと同じインターフェイスから出ていることを確認し、「間違った」インターフェイスに入ろうとするパケットが破棄されることを確認したいと思います。
- 各インターフェイスにバインドし、常にバインドする同じ送信元IPから始まるインターネット宛先への接続をしたいと思います。例えば、
カール - インターフェイスインターフェースIPhttp://ipecho.net/plain
常に私がバインドされているのと同じIPアドレスを表示する必要があります--interface
。
- これらのインターフェイスの1つでDHCPを使用すると、静的ルーティングに問題がある可能性があります。
RFC 1122
~からRFC 1122- インターネットホスティング要件 - 通信層、セクション3.3.4.2 - マルチホーミング要件:
インターネットホスティングの実装者は、マルチホーミングの2つの異なる概念モデルを使用しています。この文書は、好みのモデルについての立場をとりません。各モデルには独自の位置があるようです。これらの両面性は、質問(A)及び(B)が任意であるという事実に反映される。
- 強力なESモデル
-
強力なES(エンドシステムまたはホスト)モデルはホスト/ゲートウェイ(ES / IS)の区別を強調しているため、上記の質問(A)と(B)でMAYの代わりに使用する必要があります。マルチホームホストを同じ物理ホスト内の論理ホストセットにモデル化する傾向があります。
(A)に関して、Strong ESモデルの支持者は、自動インターネットルーティングメカニズムが宛先アドレスに対応しない物理インターフェイスにデータグラムをルーティングできないことを指摘しています。
Strong ES モデルから出るデータグラムのルーティング計算は、次のマッピングです。route(src IP addr, dest IP addr, TOS) -> gateway
ソースアドレスは、その物理インターフェイスから直接アクセスできるゲートウェイを選択するためのパラメータとしてここに含まれています。このモデルでは、論理的に各IPソースアドレスには通常1つ以上のデフォルトゲートウェイが必要です。デフォルトゲートウェイが複数あることをお勧めします。
- 弱いESモデル
-
この見解はES / ISの区別をあまり強調しないため、質問(A)と(B)でMAYをMUST NOTに置き換えます。このモデルは、ゲートウェイルーティングプロトコルを盗聴するホストのより自然なモデルであり、組み込みゲートウェイ機能を持つホストに必要です。
弱いESモデルが原因でリダイレクトメカニズムが失敗する可能性があります。データグラムが宛先アドレスに対応しない物理インターフェイスから送信される場合、最初のホップゲートウェイはリダイレクトを送信する必要があるときを認識しません。一方、ホストにゲートウェイ機能が組み込まれている場合は、リダイレクトを受信しなくてもルーティング情報を持つことができます。
弱いESモデルから出るデータグラムのパス計算はマッピングです。route(dest IP addr, TOS) -> gateway, interface
Linuxは基本的に弱いESモデルを使用しますが、FreeBSDや他のUnixバリアントは強力なESシステムとして機能します。 Strong ESシステムのように動作させる方法はありますか?
sysctl
追加する新しいインターフェイスに特定のルーティングルールを追加せずにデフォルトでStrong ESのように機能するには、何を設定するかコンパイル時間を設定する必要がありますか?厳密なソースパスフィルタリングを実行すると、これを実行できることがわかりますが、net.ipv4.conf.default.rp_filter = 1
それ以上の意味があるようです。基本的にソースベースのルーティングを実行するには?
答え1
これを行うには、ファイアウォールルールを追加するだけでは不十分です。同じハードウェアとプロセスを共有する2つの独立したシステムであるかのように、システムはトラフィックをルーティングしたいと思います。これが事実上強力なESモデルです。
目標がLinuxで強力なESモデルを実装することである場合は、まず次のsysctl設定が必要です。
net.ipv4.conf.all.arp_filter=1
net.ipv4.conf.all.arp_ignore=1 # or even 2
net.ipv4.conf.all.arp_announce=2
これらの設定は、ARPの動作が強力なESモデルに従うようにします。つまり、ARP要求が受信されると、正確に要求されたアドレスを持つインターフェイスのみが応答し、元のアドレスに向けられたトラフィックだけが実際にその特定のアドレスを介して送信されます。住所相互作用。
その後、5つのインターフェイスがあるため、ルーティングの観点から異なる動作をしたいので、5つのカスタムルートテーブルを設定する必要があります。数字を使用して識別できますが、通常は名前を付けることがより明確です。したがって、各項目について、1から252までの数字と適切な名前を選択してください。 (0、253、254、255番は予約されています。)
たとえば、100 = rtable0、101 = rtable1、102 = rtable2、103 = rtable3、104 = rtable4 を選択します。ファイルの末尾に次の番号と名前を追加してください/etc/iproute2/rt_tables
。
# ...default stuff above...
100 rtable0
101 rtable1
102 rtable2
103 rtable3
104 rtable4
次に、各インターフェイスに適した最小パスエントリセットで各カスタムパステーブルを入力します。 (実際の値を説明的に名前を付けたい環境変数名に置き換えました。)
ip route add $ETH0_NET dev eth0 proto static src $ETH0_IP table rtable0
ip route add default via $ETH0_GW dev eth0 proto static src $ETH0_IP table rtable0
ip route add $ETH1_NET dev eth1 proto static src $ETH1_IP table rtable1
ip route add default via $ETH1_GW dev eth1 proto static src $ETH1_IP table rtable1
# ... and so on, for all 5 interfaces
最後に、各パケットの送信元アドレスを確認し、それに応じて使用するルーティングテーブルを選択する高度なルーティングルールを追加します。
ip rule add from $ETH0_IP table rtable0
ip rule add from $ETH1_IP table rtable1
#...
再起動後もこれらの設定をすべて維持するには、Linux 配布ルールに合わせてカスタム起動スクリプト(またはスクリプト)をifup-pre
作成する必要があります。ifup-post
セキュリティを強化するために、インターフェイス固有のiptablesルールを追加して、間違ったインターフェイスで受信される可能性があるすべての受信パケットを自動的にドロップできます。すべてが順調に進む場合、これらのパケットの数はゼロのままにする必要があります。パケットの数が増加し始めると、設定に何かがない可能性があります。
iptables -A INPUT -m addrtype --dst-type UNICAST -i eth0 ! -d $ETH0_IP -j DROP
iptables -A INPUT -m addrtype --dst-type UNICAST -i eth1 ! -d $ETH1_IP -j DROP
# ... and so on for each interface
メモ:私はRick Jonesと他のネットワーキングの専門家の古いインターネットの議論に基づいてこれらの設定を実装したことがあります。彼らは「すべてが明らかに見えますが、必要Linuxで強力なホストモデルの動作を達成するためにこれが可能であることを保証することはできません。適切利用可能なすべてのユースケースについて」。
警告する:この設定を設定するときは、システムへの一種のローカルまたはリモートコンソールアクセス権があることを確認してください。この設定はネットワークアクセスを完全に台無しにする可能性が高く、これは戦闘の半分にすぎません。
(N-1)カスタムルーティングテーブルのみを使用してNインターフェイスを設定することは可能ですが、個人的に好むのは、高度なルーティングを使用するときにすべてのルーティング設定をカスタムテーブルに移動することです。システムに明らかにネットワーク接続があるときに本質的に空白または空になるroute -n
ことはip route show
、非常に特別なことが進行中であるという非常に重要な手がかりになります。それでも、このようなシステムを設定するときに/etc/motd
高度なルーティングが適用され、それを設定する実際のスクリプトがどこにあるかを永続的な通知も設定します。
答え2
ARP処理をより効果的に制御するための別のオプションがあります。見物するarp_ignore
。