私のCコードは
seteuid (euid);
popen("/root/bin/iptables ....", "r");
seteuid(0) で呼び出しても失敗します。(実行可能ファイルは setuid をオンにしています)。
seteuid と popen は連携していないようです。
popen が呼び出されると、stderr に次のメッセージが出力されます
iptables v1.4.6: can't initialize iptables table : Permission denied (you must be root)
つまり、popen は「成功」しますが、新しいシェルが作成されるため、アクセス許可が維持されず、ユース ケースは失敗します。
どうすれば問題を解決できますか?