ウェブスクリプトからiptablesのルールを操作する方法:私は、Web servertheとLinuxボックスが2つの実行中のサービスがある持って
- Webプロキシ(リッスンポート80、443)
- Apacheを (ポート8080をリッスンします)
プロキシユーザーは、Webインターフェイス経由で登録できます。特定のIPを持つ登録クライアントにのみ、プロキシへのアクセス権を与える必要があります。プロキシは手書きのスクリプトで、iptablesを使用してアクセスをブロックする必要があります。私は以下の規則を書いた:
iptables -A INPUT -p tcp -m multiport --dports 80,443 -s <valid IP 1> -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 80,443 -s <valid IP 2> -j ACCEPT
...
iptables -A INPUT -p tcp -m multiport --dports 80,443 -s <valid IP n> -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j DROP
それは働く。しかし、新しいユーザーがWebインターフェイス経由で追加されると、Apacheはroot以外のユーザーとしてスクリプトを起動します。そして私はiptables
をrootとして実行しなければなりません。
I can't set suid bit for a program, written in a scripting language、私はCプログラムupdater.c
作成:
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
int result = system("iptables -L");
printf("\nresult=%i", result);
return 0;
}
をそれから私はそれをコンパイル:
# gcc -o updater ./updater.c
# chmod +s ./updater
私はシェル内に、権限のないユーザーとして、それを実行すると、それが正常に動作します:版画すべてのiptablesルール。
シェルスクリプト内でプログラムを呼び出すと、Webから実行すると何も印刷されません。実際、このCプログラムの中にファイルを作成しようとしたとき、それはowner = rootで作成されました。 system("ls -l");
も動作します - ディレクトリリストを出力します。
ウェブスクリプトからiptablesのルールを操作するにはどうすればよいですか?
おそらく問題は 'iptables'があなたのウェブサーバを起動したプロセスに与えられた' PATH'ではないということです。適切なソリューションには、 'system()'をまったく使用しないことが含まれますが、最低限、その名前だけでなく、実行可能ファイルへのフルパスを提供します。 – mah
@mahええ、それはiptablesへの道でした。それを '/ sbin/iptables'に変更した後で動作しました。あなたは答えとしてそれを置くことができますか? – user4035
うれしかったです。回答が投稿されました。 – mah