かなり奇妙な問題があります。 2つのネットワークインターフェースを備えたサーバーがありますeth0
およびeth1
。それぞれが異なるネットワークに接続されています。各ネットワークにはインターネットゲートウェイがあります。サーバーにはさまざまなoutbound接続があります:http(サーバー上のいくつかのスクリプトはWebサイトをスクレイピングします)、nfsクライアント、sambaクライアント、dnsクライアント、および電子メールフェッチャーしかし、いくつか。
入らない理由のため、これらの送信クライアントを分割する必要があるため、送信http、nfs、samba、およびdnsトラフィックはeth0
他のすべてがeth1
。
私はいくつかのGoogle検索について読みましたが、iptables
が必要だと思われますが、実際には手掛かりがありません。私はufw
を介した受信ファイアウォールルールの管理にのみ慣れています。
誰かがいくつかのルールの例から始めて、起動時にシステムにこれらのルールを採用させる方法を教えてもらえますか?理想的には、SSH接続からロックアウトすることなく(物理的にアクセスできますできますが、私はそうではありません)。
編集アカウントからのすべての送信トラフィックを1つのインターフェースに制限できる場合は、クライアントを2人のユーザーに分割できます。紙の上では簡単かもしれません。
別のルーティングテーブルとそのテーブルを使用してマークされたパケットをルーティングするポリシーを設定し、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を読んでください。
"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で可能かどうかはわかりませんが、iptables
とiproute
プログラム。
はじめに このチュートリアル on複数のインターネット接続をお読みください。読みやすさも、特にoutbound filtering
、process
/pid filtering
およびport filtering
に関するiptablesチュートリアルの数千の1つです。
これを行う適切な方法は、発信パケットに使用するインターフェースにbind()することです。その後、ip route
およびip rule
コマンドを使用してルートを設定し、発信インターフェースに基づいてパケットのルーティング方法を制御できます。私の例では、次のネットワークを想定します。
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ルールを設定する必要があります。これを機能させるには、上記の変更されたルーティングテーブルが必要です。