web-dev-qa-db-ja.com

Linuxの同じサブネット上の2つのネットワークインターフェイスと2つのIPアドレス

最近、2つのSSL/TLSサイトを実行できるように、1つのLinuxホストに割り当てられた同じサブネット上の2つのIPアドレスが必要になる状況に遭遇しました。私の最初のアプローチは、IPエイリアスを使用することでした。 eth0:0、eth0:1などを使用していますが、私たちのネットワーク管理者は、この考えを打ち砕くセキュリティのために、かなり厳密な設定をいくつか行っています。

  1. それらはDHCPスヌーピングを使用し、通常は静的IPアドレスを許可しません。静的アドレス指定は静的DHCPエントリを使用して行われるため、同じMACアドレスは常に同じIP割り当てを取得します。この機能は、理由があればスイッチポートごとに無効にすることができます(ありがたいことに、私はネットワーク関係者と良好な関係を築いており、これを行うのは難しくありません)。
  2. スイッチポートでDHCPスヌーピングが無効になっているため、MACアドレスXはIPアドレスYを持つことを許可するというルールをスイッチに設定する必要がありました。残念ながら、これにはMACアドレスXだけが許可されるという副作用もありました。 IPアドレスY。IPエイリアスではMACアドレスXに2つのIPアドレスを割り当てる必要があったため、これは機能しませんでした。

スイッチ構成でこれらの問題を回避する方法があった可能性がありますが、ネットワーク管理者との良好な関係を維持するために、別の方法を見つけようとしました。 2つのネットワークインターフェイスを持つことは、次の論理的なステップのように見えました。ありがたいことに、このLinuxシステムは仮想マシンであるため、2番目のネットワークインターフェイスを簡単に追加できました(再起動せずに、追加することもできます-かなりクールです)。あと数回のキーストロークで、2つのネットワークインターフェイスが稼働し、DHCPからIPアドレスをプルしました。

しかし、その後、問題が発生しました。ネットワーク管理者は(スイッチ上で)両方のインターフェイスのARPエントリを表示できますが、私が起動した最初のネットワークインターフェイスのみがpingまたは任意の種類のTCPに応答します。 UDPトラフィック。

たくさんの掘り出し物を突いた後、ここに私が思いついたものがあります。機能しているように見えますが、単純であるように見えるものに対しては多くの作業のようです。そこに代替のアイデアはありますか?


ステップ1:すべてのインターフェースでARPフィルタリングを有効にする:

# sysctl -w net.ipv4.conf.all.arp_filter=1
# echo "net.ipv4.conf.all.arp_filter = 1" >> /etc/sysctl.conf

Linuxカーネルドキュメントのnetworking/ip-sysctl.txtファイルから:

arp_filter - BOOLEAN
    1 - Allows you to have multiple network interfaces on the same
    subnet, and have the ARPs for each interface be answered
    based on whether or not the kernel would route a packet from
    the ARP'd IP out that interface (therefore you must use source
    based routing for this to work). In other words it allows control
    of which cards (usually 1) will respond to an arp request.

    0 - (default) The kernel can respond to arp requests with addresses
    from other interfaces. This may seem wrong but it usually makes
    sense, because it increases the chance of successful communication.
    IP addresses are owned by the complete Host on Linux, not by
    particular interfaces. Only for more complex setups like load-
    balancing, does this behaviour cause problems.

    arp_filter for the interface will be enabled if at least one of
    conf/{all,interface}/arp_filter is set to TRUE,
    it will be disabled otherwise

ステップ2:ソースベースのルーティングを実装する

私は基本的に http://lartc.org/howto/lartc.rpdb.multiple-links.html からの指示に従いましたが、そのページは異なる目標を念頭に置いて書かれました( 2つのISPを扱います)。

サブネットが10.0.0.0/24、ゲートウェイが10.0.0.1、eth0のIPアドレスが10.0.0.100、eth1のIPアドレスが10.0.0.101であると想定します。

/ etc/iproute2/rt_tablesにeth0およびeth1という名前の2つの新しいルーティングテーブルを定義します。

... top of file omitted ...
1    eth0
2    eth1

これら2つのテーブルのルートを定義します。

# ip route add default via 10.0.0.1 table eth0
# ip route add default via 10.0.0.1 table eth1
# ip route add 10.0.0.0/24 dev eth0 src 10.0.0.100 table eth0
# ip route add 10.0.0.0/24 dev eth1 src 10.0.0.101 table eth1

新しいルーティングテーブルをいつ使用するかのルールを定義します。

# ip rule add from 10.0.0.100 table eth0
# ip rule add from 10.0.0.101 table eth1

メインルーティングテーブルはDHCPによって既に処理されています(この場合、厳密に必要であるかどうかも明確ではありません)が、基本的には次のようになります。

# ip route add default via 10.0.0.1 dev eth0
# ip route add 130.127.48.0/23 dev eth0 src 10.0.0.100
# ip route add 130.127.48.0/23 dev eth1 src 10.0.0.101

そして出来上がり!すべてがうまく機能しているようです。両方のIPアドレスへのpingの送信は正常に機能します。このシステムから他のシステムにpingを送信し、特定のインターフェイスを使用するようにpingを強制することは正常に機能します(ping -I eth0 10.0.0.1ping -I eth1 10.0.0.1)。そして最も重要なのは、いずれかのIPアドレスとの間のすべてのTCPおよびUDPトラフィックが期待どおりに機能することです。


繰り返しますが、私の質問は、これを行うためのより良い方法はありますか?これは一見単純な問題に対しては多くの作業のようです。


更新:上記の解決策は不完全でした。トラフィックが同じサブネットに留まる場合は問題なく機能しましたが、2番目のインターフェースを使用した他のサブネットへの通信は正しく機能しませんでした。大きな穴を掘るのではなく、ネットワーク管理者と話し、1つのインターフェースに複数のIPアドレスを許可し、IPエイリアス(eth0とeth0:0など)を使用できるようにしました。

22
Scott Duckworth

はい、より良い方法は、適切なビジネスケースを構築し、スイッチのルールを緩和して、1つのNICに複数のIPを設定できるようにすることです。

8
Zypher