2016-04-27 1 views
0

ウェブスクリプトからiptablesのルールを操作する方法:私は、Web servertheとLinuxボックスが2つの実行中のサービスがある持って

  1. Webプロキシ(リッスンポート80、443)
  2. Apacheを
  3. (ポート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のルールを操作するにはどうすればよいですか?

+2

おそらく問題は 'iptables'があなたのウェブサーバを起動したプロセスに与えられた' PATH'ではないということです。適切なソリューションには、 'system()'をまったく使用しないことが含まれますが、最低限、その名前だけでなく、実行可能ファイルへのフルパスを提供します。 – mah

+0

@mahええ、それはiptablesへの道でした。それを '/ sbin/iptables'に変更した後で動作しました。あなたは答えとしてそれを置くことができますか? – user4035

+0

うれしかったです。回答が投稿されました。 – mah

答えて

1

system("iptables -L");に電話すると、PATH環境変数に応じて、iptablesが表示される場合と表示されない場合があります。あなたはそれを見つけることがわかっているように、あなたはバイナリがある場所へのパスを付加する必要があります

int result = system("/sbin/iptables -L"); 
関連する問題