2016-04-27 1 views
0

J'ai une boîte Linux avec web serverthe dispose de 2 services en cours d'exécution:Comment manipuler les règles iptables à partir du script web

  1. proxy web (Ecoutes ports 80, 443)
  2. apache (écoute le port 8080)

Les utilisateurs du proxy peuvent s'inscrire via l'interface Web. Je dois donner accès à proxy uniquement aux clients enregistrés avec certaines adresses IP. Le proxy est un script manuscrit, et je dois utiliser iptables pour bloquer l'accès. J'ai écrit les règles suivantes:

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 

Cela fonctionne. Mais lorsqu'un nouvel utilisateur est ajouté via l'interface Web, Apache lance un script en tant qu'utilisateur non-root. Et je dois exécuter iptables en tant que root.

I can't set suid bit for a program, written in a scripting language, donc je créé un programme 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; 
} 

Je compilé:

# gcc -o updater ./updater.c 
# chmod +s ./updater 

Lorsque je l'exécute en tant qu'utilisateur non privilégié en shell fonctionne correctement: impressions toutes les règles iptables. Lorsque je l'exécute à partir du Web, en appelant le programme à l'intérieur d'un script shell, il n'imprime rien.

Malgré le fait que lorsque j'ai essayé de créer un fichier dans ce programme C, il a été créé avec owner = root. system("ls -l"); fonctionne également - il imprime la liste du répertoire. Comment puis-je manipuler les règles d'iptables à partir du script Web? Comment faire pour manipuler les règles iptables?

+2

Peut-être que le problème est que 'iptables' est pas sur la' path' donné à votre processus lancé-serveur Web. La bonne solution consisterait à ne pas utiliser 'system()' du tout mais au minimum, fournir le chemin complet de l'exécutable, pas seulement le nom de celui-ci. – mah

+0

@mah Ouais, c'était le chemin vers iptables. Après l'avoir changé en '/ sbin/iptables', cela a fonctionné. Pouvez-vous le mettre comme une réponse? – user4035

+0

heureux que cela a aidé. Réponse postée – mah

Répondre

1

Lorsque vous appelez system("iptables -L");, vous pouvez ou ne pas être en mesure de trouver iptables, en fonction de votre variable d'environnement PATH. Vous devez préfixer le chemin où le binaire est que vous savez qu'il se trouve:

int result = system("/sbin/iptables -L");