接続設定を傍受したい。たとえば、特定のプロセス(すべてのプロセス)がいつ接続を確立するかを知りたいと思います。これを達成する方法はありますか?
私が考えることができる唯一のことは、connect()
システムコールを傍受することです。しかし、他の方法がありますか?カーネルでネットワークコンテキストを生成するときに可能ですか?
目的は、特定の要件に基づいてプロセスをフィルタリングし、リアルタイムで接続設定を有効/無効にすることです。
よろしくお願いします。
PS:私は絶対に合法的な目的でこれをやっています。
PPS Googleで検索しましたが、すでに確立されている接続を傍受する方法だけを見つけました(まさに私が望むものではありません)。私が要求するのはコードではなくアイデア、検索方向です。
ベストアンサー1
情報を抽出するには、AUDIT一致(または多くの情報が必要ない場合はLOG一致)を使用してiptablesを介して実行できます。
実際、複雑なルールに基づいてライブ接続を許可または許可しない場合は、Linuxで確実に実行できるかどうかはわかりません。オプションは次のとおりです。
- Seccomp-BPFですが、これが可能かどうかはわかりません(そして、フィルタは与えられたプロセスでインスタンス化されると静的になります)。
- さまざまなソケット呼び出しをオーバーライドするには、LD_PRELOADまたは他のメソッドを使用してください。これは簡単にバイパスできるため信頼できません(直接システムコールを作成するのは簡単です。
dlopen()
任意のlibcを使用してこの方法で呼び出すこともできます)。 - 制御
net_cls
グループ。これにはファイアウォールの設定が必要で、アクティブな接続に影響を与え、必要な方法で正しく機能しない可能性があります(起動時にプロセスを適切な制御グループに移動するにはデーモンが必要です)。 - ネットワークに入ってくるデータを受け入れることができる場合は、iptables NFLOGターゲットを使用して興味深い接続を監視できます(リアルタイムの評価をしたい場合は、すべての新しい接続を記録し、ユーザースペースの内容を解析する必要があります)。次に、手動で接続したくないものを閉じます。
- 独自のネットワーク名前空間で各アプリケーションを実行し、ホストシステムを介してアウトバウンドトラフィックを強制し、ソースベースのポリシールーティングを使用して物理ネットワークに到達するトラフィックを制御できます。
つまり、これがなぜ必要なのかを再評価したい場合があります。ニューラルネットワークまたは他のヒューリスティック(どちらもさまざまな理由で疑わしい選択)を介して決定を提供しない限り、ほとんど常にファイアウォールに直接エンコードすることをお勧めします(iptablesはそうすることができます)。均一に分散されたランダムな速度で特定のUIDから開始する特定のポートに対して特定のIPプロトコルを使用する接続のみを一致させ、一致しないパケットを別の宛先に送信する)または予約ツールまたは他のフックを使用してファイアウォールルールを動的に更新(たとえば、システムを使用していないときにファイアウォールルールを変更したり、ユーザーがログインしたときに特定のUIDからの新しい接続のみを許可)。