他のすべてのパケットが別のインターフェイスを介してルーティングされている間に、プロセスまたはプロセスグループから特定のインターフェイスを介してIPパケットを選択的にルーティングできるかどうかを確認しようとしています。つまり、他のすべてのパケットが_/usr/bin/testapp
_を通過する間、_eth1
_からのすべてのトラフィックが_eth0
_を介してルーティングされるようにします。この場合のパケットは、TCP、UDP、ICMPなどであり、エンドユーザーがさまざまなポートを使用するように構成できます。
問題のプロセスを特定のインターフェイスにバインドすることを簡単に強制できないため、ルーティングを介して同じ結果を達成しようとしています。これは可能ですか?
---編集---
ここおよび他の多くの場所で役立つ提案を通じて、UIDに基づいてパケットにマークを付けることができます。それは本当に目標ではありません。目標は、プロセスに基づいてマーク/フィルタリング/ルーティングすることですユーザーに関係なく。つまり、alice
、bob
、およびcharlie
がすべて、_/usr/bin/testapp
_の独自のインスタンスを実行する場合、 3つのインスタンスすべてからのすべてのパケットは_eth1
_を通過する必要がありますが、システムからの他のすべてのパケットは_eth0
_を通過する必要があります。
さまざまなユーザーがtestapp
を実行し、独自の_~/.config/testapp.conf
_などに異なるポートを設定する可能性があるため、ソース/宛先ポート、ユーザー名/ UIDなどでマークするだけでは不十分です。問題は、プロセスによるフィルタリングです。
どれほど役立つかはわかりませんが、利用可能なオプションの1つは、ネイティブバイナリの周りに/bin/(ba|z)?sh
ベースのラッパーを使用することです。
---編集---
私は、最新のLinuxカーネル(4.0以上)を実行しているシステムのルーティングについて言及しています。 _iproute2
_、nftables
、conntrack
および同様のツール以外のソフトウェア依存関係がある場合は、オープンソースソリューションを検討しますが、基本的なツールの方が適しています。
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
特定のユーザーでプロセスを実行し、パケットをiptableのowner
拡張子と照合する場合があります。一致したら、マークを付けて別のルーティングテーブルで使用するか、POSTROUTING
または任意のソリューションを使用できます。
これ 投稿はowner
とのパケットマッチングをよりよく説明しています。
残念ながら、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と一致させます。
もちろん、これは他の問題やセキュリティの問題を追加する可能性があります。
まあ、あなたが私たちに言ったことを考えると:
問題のプロセスを特定のインターフェイスにバインドすることを簡単に強制することができないため、ルーティングを介して同じ結果を達成しようとしています。これは可能ですか?
この時点から私たちはあなたを助け始めることができます。かつての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