特定のインターフェイスで特定の送信トラフィックのみを許可する


15

かなり奇妙な問題があります。私は2つのネットワークインターフェイスeth0とサーバーを持っていますeth1。それぞれが異なるネットワークに接続されています。各ネットワークにはインターネットゲートウェイがあります。サーバーにはさまざまなアウトバウンド接続があります:http(サーバー上の一部のスクリプトはWebサイトをスクレイプします)、nfsクライアント、sambaクライアント、dnsクライアント、電子メールフェッチャー。

私が入らない理由のために、これらのアウトバウンドクライアントを分割して、アウトバウンドhttp、nfs、samba、およびdnsトラフィックのみが要求されeth0、他のすべてはオフになりますeth1

私はいくつかのGoogle検索を読んだiptablesことがあり、必要なもののように見えますが、本当に手がかりがありません。私は、受信ファイアウォールルールの管理にのみ慣れていufwます。

いくつかのルールの例から始めて、システムがブート時にこれらのルールを採用する方法を教えてもらえますか?理想的には私SSH接続の私をロックせずに(私がすることができます物理的なアクセスを取得し、私はむしろたくありません)。

編集アカウントからのすべてのアウトバウンドトラフィックを1つのインターフェイスに制限できる場合、クライアントを2人のユーザーに分割できます。紙の上では簡単に思えるかもしれません。

回答:


12

別のルーティングテーブルと、そのテーブルを使用してマークされたパケットをルーティングするポリシーを設定し、iptables / netfilterに特定のパケットをマークさせます。

テーブルを作成します。 echo 1 known >> /etc/iproute2/rt_tables

ルーティングルールを作成します(ipコマンドはiproute2からのものです)。 ip rule add from all fwmark 1 table known

「既知」というテーブルを作成し、1に等しいマークを持つすべてのパケットが「既知」テーブルに従ってルーティングされることを示すルーティングルールを作成しました。既知のプロトコルのリスト用であるため、既知とのみ呼んでいます-好きな名前を付けることができます。次に、既知のテーブルをセットアップして適切な方法でルーティングします。

ip route add default dev eth0 table known

iptablesルールを作成します。

iptables -t mangle -I PREROUTING -p tcp --dport 111 -j MARK --set-mark 1
iptables -t mangle -I PREROUTING -p tcp --dport 2049 -j MARK --set-mark 1

この例では、NFSポート(111、2049)上のパケットに1のマークを付けます。このルールを「マングル」iptableに追加しています。これはルーティングテーブルとは異なり、変更できません。マングルテーブルは、NAT以外の方法でパケットを変更するためのものです。

ここで、他のすべてのインターフェイスを介して他のすべてをルーティングするために、標準ルーティングテーブルにルートを追加します。

ip route add default dev eth1

これを本当に理解するには、LARTC howtoのセクション4と11を読んでください


まあそれは実際に私が恐れていたよりもはるかに簡単です。Linuxネットワークスタックは、本当に美しい獣ですよね!私はこれに簡単なテストを与えました、そして、それは予想通りに働くように見えます。各インターフェイスを介して監視してiftopおり、それぞれが適切な種類のトラフィックを示しています。どうもありがとうございます。
オリ

iptablesやiproute2がどのように設定を保存するのかわかりません。ブートごとにこれらのルールを実行する必要がありますか?
オリ

@Oli再起動するとクリアされます。あなたは保存して、ルールを復元することができますiptables-saveし、iptables-restore。NetworkManagerを使用している場合、ディスパッチャスクリプトをセットアップしてプロセスを自動化できます。残念ながら、公式のNMページにはこの機能に関するドキュメントはありませんが、UbuntuArch Linuxのドキュメントには両方とも記載されています。
ショーンJ.ゴフ

5

さて、「最も簡単な」方法は、特定のインターフェース(またはインターフェースのIP。たとえば、単一のプログラムに指示することです。例えば:

ping -I eth1 8.8.8.8

eth1をソースインターフェイスとして使用するようにpingに指示します。

wget --bind-address 10.0.0.1 http://www.google.it/

IPアドレスとして持っいるインターフェースを通過するようにwgetに指示し10.0.0.1ます。

正直なところ、必要なすべてのプログラムでそれが可能かどうかはわかりませんが、記述する必要のある規則iptablesiprouteプログラムを削減するための開始点です。

はじめに複数のインターネット接続に関するこのチュートリアルをお読みください。良い読み物もの一つであり、数千 expeciallyに、iptablesのチュートリアルのoutbound filteringprocess/ pid filteringport filtering


4

これを行う適切な方法は、発信パケットに使用するインターフェイスにbind()することです。その後、ip routeおよびip ruleコマンドを使用してルートを設定し、発信インターフェイスに基づいてパケットのルーティング方法を制御できるためです。私の例では、次のネットワークを想定しています。

  • eth0:
    • アドレス:192.168.0.2/24
    • デフォルトゲートウェイ:192.168.0.1
  • eth1:
    • アドレス:192.168.1.2/24
    • デフォルトゲートウェイ:192.168.1.1

2つのルーティングテーブルを作成します。1つはalternateというeth0の発信トラフィック用で、もう1つはmainというeth1用のテーブルです。ルーティングテーブルmainは常に存在し、routeand ip routeコマンドで使用される通常のテーブルです。ほとんどの人が他のテーブルを扱うことはありません。alternateというテーブルを作成するには、次の行をに追加します/etc/iproute2/rt_tables

10    alternate

テーブルmainのデフォルトの優先順位は254です。ルーティングテーブルが有効になっているルールは、ip ruleコマンドによって制御されます。デフォルトでは、このコマンドは、次のような既存のルールのリストを出力します。

0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

これは基本的にlocal、自分のIPアドレスなどのローカルルート用にカーネルが保持する特別なテーブルであるテーブル内のルートを検索することを示しています。次に、メインのテーブルとデフォルトのテーブルを試します。テーブルのデフォルトは通常空白なので、mainに一致するものがない場合、ホストへのルートはありません。最初に、eth0の規則でテーブルを交互に埋めます。

sudo ip route add table alternate 192.168.0.0/24 dev eth0
sudo ip route add table alternate 192.168.1.0/24 dev eth1
sudo ip route add table alternate default via 192.168.0.1

通常、alternateテーブルはテーブルと同じように見えmainます。唯一の違いは、ルーティングが異なる場合です。すべてのNFS、HTTPなどのトラフィックがeth1のネットワーク宛であっても、eth0のデフォルトゲートウェイを経由するようにしたい場合は、上記の2行目を含めたくない場合があります。次のステップでは、この代替ルーティングテーブルをいつ使用するかのルールを追加します。

sudo ip rule add from 192.168.0.0/24 pref 10 table alternate

このルールは、192.168.0ネットワーク上のアドレスからのトラフィックalternateは通常のmainテーブルではなくルーティングテーブルを使用することを示しています。最後のステップは、eth0バインドを使用する必要があるすべてのクライアントを確認することです。ではwget、例えば、設定--bind-address=192.168.0.2、NFSのために設定clientaddr=192.168.0.2マウントオプション。LibWWWをPerlで使用している場合、LWP :: UserAgentでlocaladdrオプションを設定して、バインド先のローカルインターフェイスを制御できます。バインディングを制御できないクライアントが存在する場合、ソースのコンパイルはオプションではありません。iptablesルールを使用してそのアドレスを変更できる場合がありますが、これはハッキングであり、機能しない可能性があります。natテーブルまたはmangleテーブルのPREROUTINGチェーンにSNATルールを設定する必要があります。これを機能させるには、上記の変更されたルーティングテーブルが必要です。

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