「プロセス」によって開始されたトラフィックを許可するために、つまりプロセス名を使用するためにiptablesを使用することは可能ですか?たとえば、pingコマンドによって開始されるすべてのものを許可したいと思います。
5 に答える
所有者のiptables モジュールが必要なようです。まず、システムで利用できるかどうかを確認します。
iptables -m owner --help
ここで詳細を読むことができます: http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH
-m owner --pid-owner PID
http://linuxpoison.blogspot.com/2010/11/how-to-limit-network-access-by-user.htmlおよびhttp://linux.die.net/man/8/iptablesを参照してください。
--pid-owner は xt_owner ではサポートされていないため、ipt_owner モジュールが必要であることに注意してください。
たとえば(これは単なる概算です)
#!/bin/bash
$@ &
iptables -m owner --pid-owner %1 -j REJECT
ただし、実際には --uid-owner と --gid-owner を使用したほうがよいでしょう。まず、 --pid-owner 基準は正確な pid にのみ一致します。つまり、プログラムは、このルールによってブロックされない子プロセスを簡単に生成できます。(少なくとも私はそれ以外を読んだことはありません。) 第二に、iptables(8) は --pid-owner が SMP システムで壊れていることを警告します (これはあなたに当てはまるかもしれないし、当てはまらないかもしれませんが、どちらの場合も移植性を制限します)。第 3 に、プロセスがブロックされる前に開始されるため、上記のスクリプトには競合状態があります。(プロセスの開始前にプロセスの pid を取得する方法がある場合、私はそれについて聞いたことがありません。)
プロセスが開始する前にプロセスの pid を取得する方法がある場合、私はそれについて聞いたことがありません。
PID は exec(3) 呼び出しによって変更されないため、最初にフォークしてからルールを追加し、プロセスを実行するラッパーを作成できます (実行中のプログラムが再びフォークしないと仮定します)。
/* NOTE this contains zero error checking */
int main(int argc, char **argv) {
/* Eat argv[0] the name of the wrapper script */
argv++;
argc--;
pid_t my_pid = getpid();
char *iptables_cmd = NULL;
asprintf(&iptables_cmd, "/sbin/iptables -A INPUT -m owner --pid_owner %d -j ACCEPT", my_pid);
system(iptables_cmd);
execv(argv[0], argv);
}
iptables に関するフランス語のウィキペディアのページhttps://fr.wikipedia.org/wiki/Iptablesには、カーネル 2.6.14 以降、 --pid-owner または --cmd-owner でフィルタリングする可能性が削除されたと記載されています... とリンク私はカーネルの内部構造の専門家ではないため、このアサーションを確認できませんでした。
英語の同等のページは、そのレベルの詳細には入りません.
UID/GID によるフィルタリングは引き続き機能します。