web-dev-qa-db-ja.com

リクエストの送信元と同じインターフェースで応答する

まず、これがIPの意図とは違うことを知っています。しかし、いつものように、これは私がそれを機能させる必要がある方法です。

私は警備会社で働いています。少なくとも2つのネットワークインターフェイスがあります。両方のインターフェイスにデフォルトゲートウェイが必要です。 1つのインターフェイスはデフォルトのイーサネットインターフェイスで、2番目のインターフェイスは3gインターフェイスです。どちらもインターネットに接続します。 1つのインターフェースがメインで、もう1つのインターフェースがバックアップであるため、さまざまな構成が可能です。または、イーサネットインターフェイスはローカルLAN(異なるサブネット、ゲートウェイ)で、3Gモデムはインターネット接続です。

私の主な質問は、Linux TCP/IPスタックに、リクエストが送信されたのと同じインターフェイスで応答する方法を教えてください。

2番目の質問は、さまざまなインターフェイスでさまざまなサブネットを操作せずに、選択したインターフェイスを介して接続を開始するにはどうすればよいですか。

7
Malic

Linuxでは、ソースIPアドレスに基づいてルートを設定できます。 Linuxでは特定のインターフェースにバインドすることが可能ですが、それは非常にまれです。ソースIPに基づくルーティングにより、発信インターフェイスごとにデフォルトゲートウェイを作成できます。リクエストを処理するサーバーのソケットはIPにバインドできるため、これにより、応答が送信されたのと同じインターフェイスから確実に送信されます。 (サーバーがワイルドカードアドレス(0.0.0.0)、特定のインターフェースにバインドされていないため、このメソッドを使用することはできません。 conntrackモジュールとiptablesマークを使用することも可能ですが、ここでは詳しく説明しません)。

これは、ipコマンドを使用して別の ルーティングテーブル を作成することで実現できます。ここでの「10」は任意です。

# 10.0.0.1 = gateway for the secondary interface
# 10.0.0.10 = ip address for the secondary interface eth1

ip route add default via 10.0.0.1 dev eth1 table 10
ip rule add from 10.0.0.10 table 10

複数のアドレスにバインドしている場合、またはdhcpがある場合は、サブネット上にルールベースを作成できます

ip route add default via 10.0.0.1 dev eth1 table 10
ip rule add from 10.0.0.0/8 table 10

サーバーがデバイスにバインドしていることが確実な場合は、より高いメトリックを持つ別のデフォルトゲートウェイで十分です。

ip route add default via 10.0.0.1 dev eth1 metric 2
9
JimB

あなたが望む一般的な意味でこれが可能かどうかはわかりません。特定のアドレスにバインドすることにより、マシンで実行されているプログラムが使用するネットワークインターフェイスを確実に制御できます。

ただし、一般的には、着信ネットワークパケットを発信パケットに接続する方法はないと思います。あなたができる最善のことは、「このネットワークに接続しようとしている場合は、常にこのインターフェースを使用する」という説明に従ってシステムに指示を与えることです。これは、システムルーティングテーブル(iproute)を介して、またはiptablesファイアウォールルールを使用して、さまざまな方法で実行できます。

これがセキュリティ上の目的である場合、物理サーバーで実行されている仮想マシンの使用を検討しましたか? 1つのVMが1つのインターフェースにのみアクセスできるように構成し、他のVMが他のインターフェースにのみアクセスできるように構成できます。VMは他のインターフェースをまったく見ることができません。間違ったネットワークからのパケットに応答することはできません。

あなたはおそらく このserverfaultの質問 も参照する必要があります。これは、どのインターフェースのarpリクエストが送信されるかを制御する方法をカバーしています。 rp_filter sysctlも確認する必要があります。これは、誤ったインターフェースに表示されるパケットを無視するように設定できます。

1
Phil Hollenback