web-dev-qa-db-ja.com

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

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

入らない理由のため、これらの送信クライアントを分割する必要があるため、送信http、nfs、samba、およびdnsトラフィックはeth0他のすべてがeth1

私はいくつかのGoogle検索について読みましたが、iptablesが必要だと思われますが、実際には手掛かりがありません。私はufwを介した受信ファイアウォールルールの管理にのみ慣れています。

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

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

15
Oli

別のルーティングテーブルとそのテーブルを使用してマークされたパケットをルーティングするポリシーを設定し、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を読んでください。

12
Shawn J. Goff

"easiest"の方法は、単一のプログラムに特定のインターフェース(またはインターフェースのIP)を使用するように指示することです。次に例を示します。

ping -I eth1 8.8.8.8

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

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

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

正直なところ、必要なプログラムがallで可能かどうかはわかりませんが、iptablesiprouteプログラム。

はじめに このチュートリアル on複数のインターネット接続をお読みください。読みやすさも、特にoutbound filteringprocess/pid filteringおよびport filteringに関するiptablesチュートリアルの数千の1つです。

5
Mr Shunz

これを行う適切な方法は、発信パケットに使用するインターフェースに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つは代替と呼ばれるeth0の発信トラフィック用で、もう1つはメインと呼ばれるeth1用のテーブルです。ルーティングテーブルmainは常に存在し、routeおよびip routeコマンドで使用される通常のテーブルです。ほとんどの人は他のテーブルを扱うことはありません。 alternateという名前のテーブルを作成するには、/etc/iproute2/rt_tablesに次の行を追加します。

10    alternate

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

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

これは基本的に、自分のIPアドレスなどのローカルルート用にカーネルによって維持される特別なテーブルであるテーブルlocalでルートを探すことを示しています。次に、テーブルのメインとテーブルのデフォルトを試します。テーブルのデフォルトは通常空白なので、メインに一致がない場合、ホストへのルートはありません。まず、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マウントオプションを設定します。 PerlでLibWWWを使用する場合、LWP :: UserAgentでlocaladdrオプションを設定して、バインドするローカルインターフェースを制御できます。バインディングを制御できないクライアントがあり、ソースのコンパイルがオプションではない場合、iptablesルールを使用してそのアドレスを変更できる可能性がありますが、これはハックのようなものであり、機能しない可能性があります。 natテーブルまたはmangleテーブルのいずれかのPREROUTINGチェーンにSNATルールを設定する必要があります。これを機能させるには、上記の変更されたルーティングテーブルが必要です。

4
penguin359