OVH Cloud OVH Cloud

IPTables : interdire/autoriser qu'une adresse IP sorte sur Internet pendant un certain temps

20 réponses
Avatar
noone
Bonjour,


je voudrais interdire qu'une adresse IP (192.168.0.2) sorte sur Internet.
Quelle règle IPTable dois-je ajouter ?
Je veux quand même que cette adresse puisse contacter le routeur 192.168.0.1

Quelle règle dois-je lancer pour annuler cette règle ?


Comment mettre en place un système où j'autorise des clients pendant par
exemple 1 heure ? (je pense aux taches périodiques avec cron... mais je
n'ai jamais pratiqué)


Avez-vous une petite interface web (PHP ou Perl) permettant de gérer ça ?


Merci d'avance

10 réponses

1 2
Avatar
Pascal Hambourg
Ok merci mais alos je fais comment ????? (Désolé... je ne suis pas très
doué avec iptables... c'est d'ailleurs pour ça que j'utilise IPCop sur
un vieux PC)


Il faut apprendre.
Soit apprendre comment insérer ses propres règles de filtrage dans IPCop
(que je ne connais pas), soit apprendre à utiliser directement iptables
(ce que j'ai choisi de faire).

Avatar
noone
Voici le résultat

# ---------------------------------------
# | disable or enable internet connection |
# ---------------------------------------


room=$2
if [ "$room" = "" ]; then room="32"; fi


time=$3
if [ "$time" = "" ]; then time="60"; fi


if_lan=eth0
if_ext=ppp0

case "$1" in

start)
iptables -N bloque_ip

iptables -I FORWARD -i $if_lan -o $if_ext -j bloque_ip

for ip in `cat internet_rules_room_$room.dat`
do
echo "start internet connection for $ip for $time minutes"
iptables -D bloque_ip -s $ip -j REJECT --reject-with net-unreach
done

sleep "$time"m

$0 stop $room
;;

stop)
for ip in `cat internet_rules_room_$room.dat`
do
echo "stop internet connection for $ip"
iptables -I bloque_ip -s $ip -j REJECT --reject-with net-unreach
# -A
done
;;

restart)
$0 stop $room $time
sleep 1
$0 start $room $time
;;

*)
echo "Usage: $0 start|stop|restart [room] [time]" >&2
exit 1
;;

esac


exit 0





le problème c'est qu'en regardant la chaine FORWARD via
# iptables -L
Chain FORWARD (policy DROP)
target prot opt source destination
bloque_ip all -- anywhere anywhere
bloque_ip all -- anywhere anywhere
bloque_ip all -- anywhere anywhere
bloque_ip all -- anywhere anywhere
bloque_ip all -- anywhere anywhere
bloque_ip all -- anywhere anywhere
bloque_ip all -- anywhere anywhere
bloque_ip all -- anywhere anywhere
bloque_ip all -- anywhere anywhere
bloque_ip all -- anywhere anywhere
ipac~fi all -- anywhere anywhere
ipac~fo all -- anywhere anywhere
BADTCP all -- anywhere anywhere
TCPMSS tcp -- anywhere anywhere tcp
flags:SYN,RST/SYN TCPMSS clamp to PMTU
CUSTOMFORWARD all -- anywhere anywhere
ACCEPT all -- anywhere anywhere state
RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere state NEW
DROP all -- 127.0.0.0/8 anywhere state NEW
DROP all -- anywhere 127.0.0.0/8 state NEW
ACCEPT all -- anywhere anywhere state NEW
ACCEPT all -- anywhere anywhere
WIRELESSFORWARD all -- anywhere anywhere state NEW
REDFORWARD all -- anywhere anywhere
PORTFWACCESS all -- anywhere anywhere state NEW
LOG all -- anywhere anywhere limit: avg
10/min burst 5 LOG level warning prefix `OUTPUT '

Chain bloque_ip (10 references)
target prot opt source destination
REJECT all -- 192.168.0.2 anywhere reject-with
icmp-net-unreachable

une nouvelle chaine bloque_ip apparait à chaque lancement de connexion

Comment l'enlever ?

J'ai essayé

# iptables -X bloque_ip
iptables: Can't delete chain with references left

j'ai essayé aussi en faisant
# iptables -F bloque_ip

mais c'est pareil



De plus, lorsque je lance la connexion

iptables -N bloque_ip
me lance
iptables: Chain already exists

comment éviter ça ? (je pense que la résolution du problème précédent
devrait éviter celui-ci)


Merci d'avance
Avatar
Pascal Hambourg
[...]
case "$1" in

start)
iptables -N bloque_ip


Pas la peine de recréer la chaîne à chaque fois, une fois pour toutes
suffit.

iptables -I FORWARD -i $if_lan -o $if_ext -j bloque_ip


Pareil, une seule règle mise en place au début (faute de mieux) de la
chaîne FORWARD une fois pour toutes suffit.

for ip in `cat internet_rules_room_$room.dat`
do
echo "start internet connection for $ip for $time minutes"
iptables -D bloque_ip -s $ip -j REJECT --reject-with net-unreach


Avec -A (append) au lieu de -D (delete) ça devrait être mieux.

[...]
stop)
for ip in `cat internet_rules_room_$room.dat`
do
echo "stop internet connection for $ip"
iptables -I bloque_ip -s $ip -j REJECT --reject-with net-unreach


Je suppose que c'est plutôt ici qu'il faut mettre -D. Si le but est de
simplement effacer toutes les règles contenues dans la chaîne bloque_ip,
il y a plus simple :

iptables -F bloque_ip

Avatar
noone
Je suppose que c'est plutôt ici qu'il faut mettre -D.


non non ça marche comme ça...



Si le but est de
simplement effacer toutes les règles contenues dans la chaîne bloque_ip,
il y a plus simple :

iptables -F bloque_ip


oui mais on fait comment pour supprimer la chaine ?

Avatar
Pascal Hambourg

oui mais on fait comment pour supprimer la chaine ?


1) Vider la chaîne avec -F
2) Effacer toutes les règles qui se terminent par -j <chaine>
3) Supprimer la chaîne avec -X

Avatar
noone


oui mais on fait comment pour supprimer la chaine ?



1) Vider la chaîne avec -F
2) Effacer toutes les règles qui se terminent par -j <chaine>
3) Supprimer la chaîne avec -X


Ok c'était le 2) qui me manquait...


Avatar
noone
Ok c'était le 2) qui me manquait...


Désolé mais j'ai quand même un soucis

# iptables -N bloque_ip

# iptables -I FORWARD -i eth0 -o ppp0 -j bloque_ip

# iptables -F bloque_ip

# iptables -D bloque_ip 1
iptables: Index of deletion too big


# iptables -X bloque_ip
iptables: Can't delete chain with references left



Je n'arrive pas à effacer la règle
# iptables -I FORWARD -i eth0 -o ppp0 -j bloque_ip

Avatar
noone
Bon finalement je travaille directement avec la chaine FORWARD
et ça m'évite le problème de la création/suppression de la chaine bloque_ip


#!/bin/sh
# ---------------------------------------
# | disable or enable internet connection |
# ---------------------------------------


room=$2
if [ "$room" = "" ]; then room="32"; fi


time=$3
if [ "$time" = "" ]; then time="60"; fi


if_lan=eth0
if_ext=ppp0

case "$1" in

start)

for ip in `cat internet_rules_room_$room.dat`
do
if [ $time != 0 ]; then
echo "start internet connection for $ip for $time minutes"
else
echo "start internet connection for $ip"
fi
iptables -D FORWARD -i $if_lan -o $if_ext -s $ip -j REJECT
--reject-with net-unreach
done

if [ $time != 0 ]; then
sleep "$time"m

$0 stop $room
fi
;;

stop)
for ip in `cat internet_rules_room_$room.dat`
do
echo "stop internet connection for $ip"

iptables -I FORWARD -i $if_lan -o $if_ext -s $ip -j REJECT
--reject-with net-unreach
done
;;

restart)
$0 stop $room $time
sleep 1
$0 start $room $time
;;

*)
echo "Usage: $0 start|stop|restart [room] [time]" >&2
exit 1
;;

esac


exit 0



Au moins ça n'ajoute pas de règles superflues à l'utilisation

par contre comme ça tente de supprimer une règle qui n'existe pas j'ai
un message d'erreur (mais je préfère ça à l'empilement de règles...
Avatar
Pascal Hambourg
Ok c'était le 2) qui me manquait...



Je sais. J'avais vu le message d'erreur au sujet des références restantes.

Désolé mais j'ai quand même un soucis

# iptables -N bloque_ip

# iptables -I FORWARD -i eth0 -o ppp0 -j bloque_ip

# iptables -F bloque_ip

# iptables -D bloque_ip 1
iptables: Index of deletion too big


Cette commande superflue essaie d'effacer la règle n° 1 dans la chaîne
bloque_ip alors que cette chaîne est vide. Vide parce qu'aucune règle
n'y a été ajoutée après sa création, vide aussi parce que la commande -F
l'aurait vidée de toutes les règles existantes de toute façon.

# iptables -X bloque_ip
iptables: Can't delete chain with references left


Même problème qu'avant : il existe une chaîne qui fait référence à
bloque_ip (qui se termine par -j bloque_ip). C'est cette règle qu'il
faut supprimer avant de pouvoir supprimer la chaîne elle-même.

Je n'arrive pas à effacer la règle
# iptables -I FORWARD -i eth0 -o ppp0 -j bloque_ip


iptables -D FORWARD -i eth0 -o ppp0 -j bloque_ip

Note : s'il existe plusieurs règles identiques correspondant, la
première d'entre elle est supprimée.

Mais je répète, pourquoi vouloir supprimer cette règle et la chaîne
qu'elle appelle ? Quand la chaîne est vide l'effet est le même.


Avatar
noone
Mais je répète, pourquoi vouloir supprimer cette règle et la chaîne
qu'elle appelle ? Quand la chaîne est vide l'effet est le même.



Ok merci beaucoup pour toutes ces explications !

1 2