Débogger ma config Iptables

Bonjour,

Je voudrais mettre en place le firewall avec iptables sur mon serveur debian Lenny.

Avec mon firewall désactivé mon serveur apache fonctionne tres bien, ainsi que ssh, le ping, no-ip, les DNS.

Avec mon firewall activé:

  • J’arrive à envoyé mon IP dynamique à noip. (Test réaliser: commenter l’autorisation donc l’envoi de l’IP est bloqué [TEST OK])
  • A faire un ping. (Test réaliser: commenter l’autorisation et le ping est bloqué [TEST OK])
  • Je n’arrive pas à me connecter à mon serveur apache et à SSH

Les autres règles non pas été testé puisque deux des principaux ne fonctionne pas.

Je suis ouvert à toute amélioration!!! D’avance Merci.

Voici mon script:

#!/bin/sh

#
# Config firewall
# Mickael DURJEAU
#


#### Gestion start-up ####
NAME=iptables
DAEMON=/sbin/$NAME

test -x $DAEMON || exit 0





IFACE="eth0,eth1"
IPSERVER=192.168.1.101
IPCLASS_C="192.168.0.0/16"
BROADCAST="255.255.255.255"
LOOPBACK="127.0.0.0/8"


IPTABLES="/sbin/iptables"

case "$1" in
  start)
	##### Debut Initialisation #####
	
    echo .:: Setting Firewall Rules... ::.

    #Vider les tables actuelles, les règles personnelles, zero counters
    $IPTABLES -t filter -F
    $IPTABLES -t filter -X
	$IPTABLES -t filter -Z
    echo - Vidage des tables  [OK]

    # Interdire toute connexion entrante et sortante
    $IPTABLES -t filter -P INPUT DROP
    $IPTABLES -t filter -P FORWARD DROP
    $IPTABLES -t filter -P OUTPUT DROP
    echo - Interdire toute connexion entrant et sortante [OK]

    # Ne pas casser les connexions établies
    $IPTABLES -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    $IPTABLES -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    echo - Ne pas casser les connexions établies [OK]

    ##### Fin Initialisation #####
 
    ##### Debut regles #####

    # Autoriser le traffic sur le reseau local
    $IPTABLES -t filter -A INPUT -i lo -j ACCEPT
    $IPTABLES -t filter -A OUTPUT -o lo -j ACCEPT
    echo - Autoriser le traffic sur réseau local [OK]

    # ICMP (ping) TEST OK
    $IPTABLES -t filter -A INPUT -i $IFACE -s $IPSERVER -p icmp -j ACCEPT
    $IPTABLES -t filter -A OUTPUT -o $IFACE -s $IPSERVER -p icmp -j ACCEPT
    echo - Autoriser le ping ICMP [OK]

    # NOIP  TEST OK
    $IPTABLES -t filter -A OUTPUT -o $IFACE -s $IPSERVER -p tcp --dport 8245 -j ACCEPT
    echo - Autoriser NOIP [OK]

    # HTTP et HTTPS [TEST FAIL]
    $IPTABLES -t filter -A OUTPUT -o $IFACE -s $IPSERVER -p tcp --dport 80 -j ACCEPT
    $IPTABLES -t filter -A OUTPUT -o $IFACE -s $IPSERVER -p tcp --dport 443 -j ACCEPT
    $IPTABLES -t filter -A INPUT -i $IFACE -s $IPSERVER -p tcp --sport 80 -j ACCEPT
    $IPTABLES -t filter -A INPUT -i $IFACE -s $IPSERVER -p tcp --sport 443 -j ACCEPT
    $IPTABLES -t filter -A INPUT -i $IFACE -s $IPSERVER -p tcp --sport 8443 -j ACCEPT
    echo - Autoriser HTTP et HTTPS [OK]
	
    # SSH [TEST FAIL]
    $IPTABLES -t filter -A OUTPUT -o $IFACE -s $IPSERVER -p tcp --dport 22 -j ACCEPT
    $IPTABLES -t filter -A INPUT -i $IFACE -s $IPSERVER -p tcp --sport 22 -j ACCEPT
    echo - Autoriser SSH [OK]

    # DNS 
    $IPTABLES -t filter -A OUTPUT -o $IFACE -s $IPSERVER -p tcp --dport 53 -j ACCEPT
    $IPTABLES -t filter -A OUTPUT -o $IFACE -s $IPSERVER -p udp --dport 53 -j ACCEPT
    $IPTABLES -t filter -A INPUT -i $IFACE -s $IPSERVER -p tcp --sport 53 -j ACCEPT
    $IPTABLES -t filter -A INPUT -i $IFACE -s $IPSERVER -p udp --sport 53 -j ACCEPT
    echo - Autoriser les DNS [OK]

    # NTP Out : pour la mise a jour automatique de l'heure
    $IPTABLES -t filter -A OUTPUT -o $IFACE -s $IPSERVER -p udp --dport 123 -j ACCEPT
    echo - Autoriser NTP [OK]

    # Whos is
    $IPTABLES -t filter -A OUTPUT -o $IFACE -s $IPSERVER -p tcp --dport 43 -j ACCEPT
    $IPTABLES -t filter -A INPUT -i $IFACE -s $IPSERVER -p tcp --sport 80 -j ACCEPT
    echo - Autoriser Whos is [OK]


    # Mail SMTP : on ne tient pas compte de POP(S) et IMAP(S) dans notre tuto
    $IPTABLES -t filter -A INPUT -i $IFACE -s $IPSERVER -p tcp --sport 25 -j ACCEPT
    $IPTABLES -t filter -A OUTPUT -o $IFACE -s $IPSERVER -p tcp --dport 25 -j ACCEPT
    echo - Autoriser SMTP [OK]

    # Monit
    $IPTABLES -t filter -A INPUT -i $IFACE -s $IPSERVER -p tcp --sport 1337 -j ACCEPT
    echo - Autoriser le monitoring [OK]

    ##### Fin regles #####

    echo .:: Firewall updated ::.

  ;;
  stop)
    # On supprimer les règles du firewall
    # Mais on accept les règles par defaut
    $IPTABLES -P INPUT ACCEPT
    $IPTABLES -P OUTPUT ACCEPT
    $IPTABLES -F
    $IPTABLES -X
    echo - Vidage des tables [OK]
    echo .:: Firewall Disallowed ::.
  ;;
  restart)
    $0 start 
  ;;
  *)

    echo Usage: $0 {start|stop|restart} 
    exit 1
esac
exit 0

Salut, je vais me risquer à faire quelques critiques juste sur les points que tu souligne (http/s et ssh)
Le port source du client qui se connecte à ton serveur web, tu le connais pas, il est aléatoire, et c’est surtout pas le 80, 443 (tu fait un gros trou de sécurité meme, en autorisant l’accès a ta machine par les ports source des clients, pour peu que la requête utilise un port source 80 ou 443 !!). Donc c’est pas la dessus que tu peux autoriser. C’est sur le port de destination qui lui est connu.
J’ai l’impression aussi que tu fais une confusion entre INPUT, sport, OUTPUT, dport :

HTTP et HTTPS [TEST FAIL]

$IPTABLES -t filter -A OUTPUT -o $IFACE -s $IPSERVER -p tcp --dport 80 -j ACCEPT
$IPTABLES -t filter -A OUTPUT -o $IFACE -s $IPSERVER -p tcp --dport 443 -j ACCEPT

==> La j’en suis pas sur, mais je pense que t’as voulu autoriser les réponses aux requêtes des clients (a cause du -o) mais a ce moment là, le dport devrait être le port source du client, que tu ne connais pas, mais pas le 80, donc ca ne marche pas. En fait, cette règles autorise le serveur à se connecter au web. (ca peut servir, remarque)

Pour ne pas avoir besoin de t’occuper des réponses aux requêtes entrantes autorisées, tu peux rajouter au début de ton script comme tu l’as fait pour INPUT les règles de suivi de connexion sur OUTPUT :
$IPTABLES -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Sur les 3 autres règles, si tu met -s $ipserveur, tu n’autorises la connexion au serveur web qu’au client qui a l’adresse $ipserveur donc ca peut pas marcher depuis un client du lan autre que le serveur lui meme. Tu peux les remplacer par :
$IPTABLES -t filter -A INPUT -i $IFACE -p tcp --dport 80 -j ACCEPT
$IPTABLES -t filter -A INPUT -i $IFACE -p tcp --dport 443 -j ACCEPT
$IPTABLES -t filter -A INPUT -i $IFACE -p tcp --dport 8443 -j ACCEPT

echo - Autoriser HTTP et HTTPS [OK]

pour ssh, même probleme :

SSH [TEST FAIL]

La premiere tu la supprimes car le suivi de connexion autorisera les paquets retour des requêtes ssh des clients, et la deuxième tu la remplaces par :
$IPTABLES -t filter -A INPUT -i $IFACE -p tcp --dport 22 -j ACCEPT
echo - Autoriser SSH [OK]

EDIT : comme tu as apparemment édité et modifié tes règles entre temps, l’histoire des dport/sport dont je parlais au debut n’est plus vrai… :confused:

RE EDIT : Ah, tu as remis comme c’était ^^ Mais on va pas s’en sortir si tu les modifies sans arrêt !

[quote=“dric64”]EDIT : comme tu as apparemment édité et modifié tes règles entre temps, l’histoire des dport/sport dont je parlais au debut n’est plus vrai… :confused:

RE EDIT : Ah, tu as remis comme c’était ^^ Mais on va pas s’en sortir si tu les modifies sans arrêt ![/quote]
Oui désolé, c’est pas ici que je voulais éditer, mais bien /etc/ini.d/firewall :119

Et bien cela à résolu mon acces ssh. Je vais continué de creuser.

Plus facile ptet pour lire tes règles, envoie

iptables-save

[quote=“ricardo”]Plus facile ptet pour lire tes règles, envoie

iptables-save[/quote]

Tu trouves que c’est plus lisible, le iptables-save ? :open_mouth:
Remarque, ca doit être une question d’habitude…

Et bien faite la conexion ssh ne fonctionne pas.
En faite, j’avais laissé une connexion ouverte dans une fenetre de firefox (fireftp) lors du restart du script du firewall.

[code]/root$ iptables-save

Generated by iptables-save v1.4.2 on Sun Dec 19 01:28:29 2010

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [1:140]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0,eth1 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i eth0,eth1 -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -i eth0,eth1 -p tcp -m tcp --dport 8443 -j ACCEPT
-A INPUT -i eth0,eth1 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0,eth1 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i eth0,eth1 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i eth0,eth1 -p tcp -m tcp --dport 1337 -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o eth0,eth1 -p icmp -j ACCEPT
-A OUTPUT -o eth0,eth1 -p tcp -m tcp --dport 8245 -j ACCEPT
-A OUTPUT -o eth0,eth1 -p udp -m udp --dport 123 -j ACCEPT
-A OUTPUT -o eth0,eth1 -p tcp -m tcp --dport 43 -j ACCEPT
-A OUTPUT -o eth0,eth1 -p tcp -m tcp --dport 25 -j ACCEPT
COMMIT

Completed on Sun Dec 19 01:28:29 2010[/code]