web-dev-qa-db-ja.com

プロセスに基づいてIPトラフィックを異なるデフォルトルート/インターフェースにルーティングする

他のすべてのパケットが別のインターフェイスを介してルーティングされている間に、プロセスまたはプロセスグループから特定のインターフェイスを介してIPパケットを選択的にルーティングできるかどうかを確認しようとしています。つまり、他のすべてのパケットが_/usr/bin/testapp_を通過する間、_eth1_からのすべてのトラフィックが_eth0_を介してルーティングされるようにします。この場合のパケットは、TCP、UDP、ICMPなどであり、エンドユーザーがさまざまなポートを使用するように構成できます。

問題のプロセスを特定のインターフェイスにバインドすることを簡単に強制できないため、ルーティングを介して同じ結果を達成しようとしています。これは可能ですか?

---編集---

ここおよび他の多くの場所で役立つ提案を通じて、UIDに基づいてパケットにマークを付けることができます。それは本当に目標ではありません。目標は、プロセスに基づいてマーク/フィルタリング/ルーティングすることですユーザーに関係なく。つまり、alicebob、およびcharlieがすべて、_/usr/bin/testapp_の独自のインスタンスを実行する場合、 3つのインスタンスすべてからのすべてのパケットは_eth1_を通過する必要がありますが、システムからの他のすべてのパケットは_eth0_を通過する必要があります。

さまざまなユーザーがtestappを実行し、独自の_~/.config/testapp.conf_などに異なるポートを設定する可能性があるため、ソース/宛先ポート、ユーザー名/ UIDなどでマークするだけでは不十分です。問題は、プロセスによるフィルタリングです。

どれほど役立つかはわかりませんが、利用可能なオプションの1つは、ネイティブバイナリの周りに/bin/(ba|z)?shベースのラッパーを使用することです。

---編集---

私は、最新のLinuxカーネル(4.0以上)を実行しているシステムのルーティングについて言及しています。 _iproute2_、nftablesconntrackおよび同様のツール以外のソフトウェア依存関係がある場合は、オープンソースソリューションを検討しますが、基本的なツールの方が適しています。

6
justinzane

Eth1またはeth0を介したパケットのルーティング。テーブルマングルはこれに対処する必要があります。そのためには、パケットにマークを付け、それを処理するためのルールを設定する必要がありました。最初に、カーネルが2でマークされたパケットをテーブルにルーティングするルールを追加します

ip rule add fwmark 2 table 3

ゲートウェイが10.0.0.1であると仮定して、トラフィックを別のインターフェースにリダイレクトするためのルートを追加します。

ip route add default via 10.0.0.1 table 3

ルーティングキャッシュをフラッシュします。

ip route flush cache

次に、指定されたパケットをマークするためのファイアウォールルールを設定します。

iptables -t mangle -A OUTPUT -p tcp --dport 465 -j MARK --set-mark 2

最後に、リバースパスのソース検証を緩和します。 0に設定することを勧める人もいますが、https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txtによると2の方が適切な選択です。これをスキップすると、パケットを受信します(これはtcpdump -i tap0 -nを使用して確認できます)が、パケットは受け入れられません。パケットが受け入れられるように設定を変更するコマンド:

sysctl -w net.ipv4.conf.tap0.rp_filter=2

リファレンス:http://serverfault.com/questions/345111/iptables-target-to-route-packet-to-specific-interface

2
Peter Nduati

特定のユーザーでプロセスを実行し、パケットをiptableのowner拡張子と照合する場合があります。一致したら、マークを付けて別のルーティングテーブルで使用するか、POSTROUTINGまたは任意のソリューションを使用できます。

これ 投稿はownerとのパケットマッチングをよりよく説明しています。

0
Mauricio López

残念ながら、iptables拡張機能のマンページ( http://ipset.netfilter.org/iptables-extensions.man.html )には、要件を満たすモジュールがないと記載されています。

MauricioLópez と同じことをお勧めします。

ターゲットアプリケーションを特定のユーザーまたはグループにsetuidまたはsetgidすることができます。これにより、最初にアプリケーションを開始したユーザーに関係なく、常に特定のユーザーまたはグループとして実行されます。

adduser specialrouteuser
chown specialrouteuser: /usr/bin/testapp
chmod +s /usr/bin/testapp

次に、iptables owner拡張を使用して、その特定のUIDまたはGIDと一致させます。

もちろん、これは他の問題やセキュリティの問題を追加する可能性があります。

0
mofoe

まあ、あなたが私たちに言ったことを考えると:

問題のプロセスを特定のインターフェイスにバインドすることを簡単に強制することができないため、ルーティングを介して同じ結果を達成しようとしています。これは可能ですか?

この時点から私たちはあなたを助け始めることができます。かつてのFreeBSDでは、jailシステムコールが、プロセスまたはプロセスのグループをシステムリソースのサブセクションに制限する目的で登場しました。特に、「分離された」プロセスがネットワークアクティビティに使用するIPアドレスを指定できます。これは非常に便利なため、Linuxでこの機能を本当に見逃してしまいました。しかし、Linuxにも同様の結果を得る方法がいくつかあります。

または、最も軽量なのは手動で名前空間をいじるだけです https://unix.stackexchange.com/questions/155446/linux-is-there-handy-way-to-exec-a-program-binding- it-to-ip-address-of-choice

0
poige