C Linuxプログラム内にiptablesルールを追加する必要があります。
どうすればいいですか?ルートアクセスが必要ですか、それとも一部の機能のみを付与できますか?
私はCAP_NET_RAW + iepを与え、popen()、system()、execve()を使ってiptablesを設定しようとしましたが、うまくいきませんでした。
sudoをすると明らかに動作しますが、root権限を与えたくありません。
ありがとうございます。
答え1
ユーザーにroot権限を付与する必要はありません。 sudoersファイルを編集し、ユーザーがsudoを介して実行できるコマンドを制限できます。あるいは、sudoers ファイルに NOPASSWD オプションを提供することもできます。
MY_USER_NAME ALL = NOPASSWD: /sbin/iptables
sudoersファイルを編集した後、MY_USER_NAMEは "sudo iptables"コマンドを実行できます。権限を必要とする他のコマンドは実行できません。
sudoersファイルを編集するには、visudoコマンドを使用します。
答え2
iptables
iptables v1.8.4(レガシー)の場合は、次のコマンドを使用してコマンドを実行できますiptables-save/restore
。
setcap cap_dac_read_search,cap_net_admin,cap_net_raw+ep /path/to/your/bin
xtables-legacy-multi
バイナリをコピーし、上記の機能を手動で追加することでこれをテストできます。
sudo cp /usr/sbin/xtables-legacy-multi ipt
chown ipt user:user # Some non root user
# Test a command
./ipt iptables -I INPUT -m state --state INVALID -j DROP
# Should see errors here...
# Update caps
sudo setcap cap_dac_read_search,cap_net_admin,cap_net_raw+ep ipt
# Now test a rule
./ipt iptables -I INPUT -m state --state INVALID -j DROP
echo $?
# Should see a successful exit code of 0 for valid rules
別の方法はlibnftnl
ネットフィルタ用ネットリンクライブラリしかし、上記の機能はまだ適用されています(例外がある可能性がありますcap_dac_read_search
)。