Les paquets bloqués récurrents sont du multicast DNS émis par une autre machine du réseau local.
C’est du pipeau complet. Je viens de tester, résultats ridicules aussi. D’ailleurs “visible ports”, ça ne veut rien dire.
Les paquets bloqués récurrents sont du multicast DNS émis par une autre machine du réseau local.
C’est du pipeau complet. Je viens de tester, résultats ridicules aussi. D’ailleurs “visible ports”, ça ne veut rien dire.
[quote=“PascalHambourg”]C’est du pipeau complet.[/quote]
Il y a un paquet de sites qui proposent ce genre de scan “online”…
Quels sont les sites sérieux ?
[quote=“lol”]Il y a un paquet de sites qui proposent ce genre de scan “online”…
Quels sont les sites sérieux ?[/quote]Rien ne vaut nmap avec les bonnes options depuis une machine extérieure.
Pour en revenir au script, j’ai plusieurs firewall à gérer, chacun ayant des ports différents (souvent non standards) pour un même service. Afin de rendre un –status plus compréhensible j’ajoute toujours un commentaire à la commande iptables pour retrouver mes jeunes. J’utilise un script Lua mais le principe en dash est le même.
Petite suggestion de modification cosmétique:
[code]TCP_SERVICES=“monFtp:211 ssh:223 serveur_web:808 cupsHome:631 jabberPerso:422”
for PORT in $TCP_SERVICES; do
iptables -A INPUT -p tcp --dport ${PORT#:} -j ACCEPT -m comment --comment ${PORT%:}
done[/code]
Un iptables -nL donnera:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:211 /* monFtp */
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:223 /* ssh */
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:808 /* serveur_web */
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:631 /* cupsHome */
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:422 /* jabberPerso */
En passant, il vaut mieux faire iptables -nL (ou -nvL, plus complet) qui donnera le port en numérique plutôt que le port standard tel que défini dans /etc/services. Pour ceux qui préfèrent une sortie iptables-save, elle sera également plus explicite.
Bonsoir,
J’aimerai votre avis pour ajouter cette règle à mon iptables (contre l’usurpation d’adresse IP ) :
Est-ce trop restrictif,inutile,farfefu …
Je me demandais, le script doit-il être modifié pour l’ipv6?
Et comment?
Oui, et pas seulement en remplaçant iptables par ip6tables, icmp par icmpv6…
Il faut notamment ajouter des règles pour autoriser les types ICMPv6 liés au protocole Neighbour Discovery (qui est plus ou moins l’équivalent d’ARP en IPv4) avec HL=255 :
Le NAT IPv6, qui est disponible (hélas) depuis le tout récent noyau 3.7 (dans experimental) avec iptables 1.4.17 (pas encore dans Debian), est probablement à revoir mais je n’ai pas encore regardé. De toute façon il ne devrait pas être nécessaire dans la plupart des cas, normalement les FAI allouent suffisamment d’adresses globales pour ne pas avoir à utiliser du NAT.
Merci de ta réponse.
Par contre, tu veux bien donner un petit exemple, s’il te plaît? Pour être sûr que j’ai bien compris
[code]# pour toute interface de type broadcast (ethernet, wifi…)
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-solicitation -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-advertisement -m hl --hl-eq 255 -j ACCEPT
ip6tables -A OUTPUT -p icmpv6 --icmpv6-type neighbour-solicitation -j ACCEPT
ip6tables -A OUTPUT -p icmpv6 --icmpv6-type neighbour-advertisement -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -m hl --hl-eq 255 -j ACCEPT
ip6tables -A OUTPUT -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type router-solicitation -m hl --hl-eq 255 -j ACCEPT
ip6tables -A OUTPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT[/code]
S’il n’y a pas de filtrage en sortie, les règles dans OUTPUT ne sont pas utiles.
Je crois qu’un expert va devoir se charger d’adapter le script. Parce que là, ça me dépasse…
Quel est le souci ? Ce ne sont que quelques règles.
Salut,
Je suis loin de saisir toute la portée des règles, mais effectivement il “suffit” de les ajouter (au bon endroit si possible) au script.
Je suis débordé, mais d’ici une semaine j’écrirais le script si personne ne le fait entre temps.
Alors je veux bien les ajouter, mais comme je ne les comprend pas bien, je ne suis pas sûr de faire ça bien.
Je tenterai des modifs sur le wiki ces jours-ci, pour que chacun puisse corriger.
Vous pourriez me corriger svp? Je n’ai pas inclu toutes les règles proposées par Pascal (parce que je ne comprend pas bien le rôle de chacune :s )
#!/bin/sh
### BEGIN INIT INFO
# Provides: mon_parefeu
# Required-Start: $local_fs
# Should-Start:
# Required-Stop: $local_fs
# Should-Stop:
# X-Start-Before: $network
# X-Stop-After: $network
# Default-Start: S
# Default-Stop: 0 6
# Short-description: Configure le parefeu
# Description: Met en place les règles iptables.
### END INIT INFO
#------------------------Explications----------------------------------#
#
# Défauts :
# - Cette configuration s'applique à toutes les interfaces réseau.
# Si vous voulez restreindre cela à une interface donnée,
# utilisez '-i INTERFACE' dans la variables $IPTABLES.
#
# - Par défaut, le script autorise tout en sortie.
# Pour changer ce comportement veuillez indiquer les numéros
# de port en question dans les variables
# $REMOTE_TCP_SERVICES
# et/ou $REMOTE_UDP_SERVICES
#
# - Pour configurer une machine routeur,
# changez la valeur de la variable
# ISROUTERNAT à true, ainsi que
# les interfaces ethx et ethy selon votre configuration
# ethx correspond à l'interface du LAN
# ethy correspond à l'interface reliée à la truc-box
#
# description: Active/Désactive le pare-feu au démarrage
#
#----------------------------------------------------------------------#
. /lib/lsb/init-functions
#------------------------VARIABLES-------------------------------------#
# Mettre à 1 si vous utilisez IPV6 :
IPV6=0
# Services que le système offrira au réseau, à séparer avec des espaces
# ftp : 21, ssh : 22, serveur web : 80, cups : 631, jabber : 5222
TCP_SERVICES=""
UDP_SERVICES=""
# Services que le système utilisera du réseau
# (défaut : autorise tout en sortie)
REMOTE_TCP_SERVICES=""
REMOTE_UDP_SERVICES=""
# Pour une machine faisant office de routeur avec NAT,
# changer la valeur de la variable ISROUTERNAT à 1.
ISROUTERNAT=false
# ethx correspond à l'interface du LAN
# ethy correspond à l'interface reliée à la truc-box
ethx="eth1"
ethy="eth0"
# Chemins vers iptables
readonly IPTABLES=/sbin/iptables
readonly IP6TABLES=/sbin/ip6tables
#----------------------------------------------------------------------#
if ! [ -x $IPTABLES ]; then
exit 0
fi
if [ $IPV6 -eq 1 ]; then
if ! [ -x $IP6TABLES ]; then
exit 0
fi
fi
#----------------------------FONCTIONS---------------------------------#
fw_start () {
# Vidage
fw_clear
# Parefeu - Suppression des règles
# Interdictions
$IPTABLES -t filter -P INPUT DROP
$IPTABLES -t filter -P FORWARD DROP
$IPTABLES -t filter -P OUTPUT DROP
# Parefeu - interdictions générales établies
# Loopback
$IPTABLES -t filter -A INPUT -i lo -j ACCEPT
# Trafic d'entrée :
$IPTABLES -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Refus du ping pour éviter de répondre aux scans des éventuels vilains
$IPTABLES -t filter -A INPUT -p icmp -j LOG
$IPTABLES -t filter -A INPUT -p icmp -j DROP
# Sortie autorisée, si aucun port autorisé en sortie n'est défini
if [ -z "$REMOTE_TCP_SERVICES"] && [ -z "$REMOTE_UDP_SERVICES" ]; then
$IPTABLES -t filter -P OUTPUT ACCEPT
fi
# Services à autoriser en entrée
for PORT in $TCP_SERVICES; do
$IPTABLES -A INPUT -p tcp --dport ${PORT} -j ACCEPT
done
for PORT in $UDP_SERVICES; do
$IPTABLES -A INPUT -p udp --dport ${PORT} -j ACCEPT
done
# Services à autoriser en sortie
for PORT in $REMOTE_TCP_SERVICES; do
$IPTABLES -A OUTPUT -p tcp --dport ${PORT} -j ACCEPT
done
for PORT in $REMOTE_UDP_SERVICES; do
$IPTABLES -A OUTPUT -p udp --dport ${PORT} -j ACCEPT
done
# Parefeu - Mise en place des règles
if $ISROUTERNAT ; then
$IPTABLES -A INPUT -i $ethx -j ACCEPT
$IPTABLES -A INPUT -p icmp -j ACCEPT
$IPTABLES -A FORWARD -i $ethy -o $ethx -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -o $ethy -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -o $ethy -j MASQUERADE
# Parefeu - Routeur avec NAT
fi
# Toutes les autres connexions sont enregistrées dans syslog
$IPTABLES -t filter -A INPUT -j LOG --log-level=4
# Configuration IPV6
if [ $IPV6 -eq 1 ]; then
# Interdictions
$IP6TABLES -t filter -P INPUT DROP
$IP6TABLES -t filter -P FORWARD DROP
$IP6TABLES -t filter -P OUTPUT DROP
# Loopback
$IP6TABLES -t filter -A INPUT -i lo -j ACCEPT
# Trafic d'entrée :
$IP6TABLES -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Refus du ping pour éviter de répondre aux scans des éventuels vilains
$IP6TABLES -t filter -A INPUT -p icmp -j LOG
$IP6TABLES -t filter -A INPUT -p icmp -j DROP
# Sortie autorisée, si aucun port autorisé en sortie n'est défini
if [ -z "$REMOTE_TCP_SERVICES"] && [ -z "$REMOTE_UDP_SERVICES" ]; then
$IP6TABLES -t filter -P OUTPUT ACCEPT
fi
# Services à autoriser en entrée
for PORT in $TCP_SERVICES; do
$IP6TABLES -A INPUT -p tcp --dport ${PORT} -j ACCEPT
done
for PORT in $UDP_SERVICES; do
$IP6TABLES -A INPUT -p udp --dport ${PORT} -j ACCEPT
done
# Services à autoriser en sortie
for PORT in $REMOTE_TCP_SERVICES; do
$IP6TABLES -A OUTPUT -p tcp --dport ${PORT} -j ACCEPT
done
for PORT in $REMOTE_UDP_SERVICES; do
$IP6TABLES -A OUTPUT -p udp --dport ${PORT} -j ACCEPT
done
# Parefeu - Mise en place des règles
if $ISROUTERNAT ; then
$IP6TABLES -A INPUT -i $ethx -j ACCEPT
$IP6TABLES -A INPUT -p icmp -j ACCEPT
$IP6TABLES -A FORWARD -i $ethy -o $ethx -m state --state RELATED,ESTABLISHED -j ACCEPT
$IP6TABLES -A FORWARD -o $ethy -j ACCEPT
$IP6TABLES -t nat -A POSTROUTING -o $ethy -j MASQUERADE
$IP6TABLES -A INPUT -p icmpv6 --icmpv6-type router-solicitation -m hl --hl-eq 255 -j ACCEPT
$IP6TABLES -A OUTPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT
fi
# Pour toute interface de type broadcast
$IP6TABLES -A INPUT -p icmpv6 --icmpv6-type neighbour-solicitation -m hl --hl-eq 255 -j ACCEPT
$IP6TABLES -A INPUT -p icmpv6 --icmpv6-type neighbour-advertisement -m hl --hl-eq 255 -j ACCEPT
$IP6TABLES -A OUTPUT -p icmpv6 --icmpv6-type neighbour-solicitation -j ACCEPT
$IP6TABLES -A OUTPUT -p icmpv6 --icmpv6-type neighbour-advertisement -j ACCEPT
# Toutes les autres connexions sont enregistrées dans syslog
$IP6TABLES -t filter -A INPUT -j LOG --log-level=4
fi
}
fw_stop () {
#$IPTABLES -F
#$IPTABLES -t nat -F
#$IPTABLES -t mangle -F
#$IPTABLES -P INPUT DROP
#$IPTABLES -P FORWARD DROP
#$IPTABLES -P OUTPUT ACCEPT
iptables-save > /etc/firewall
}
fw_clear () {
$IPTABLES -t filter -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -t raw -F
$IPTABLES -t filter -P INPUT ACCEPT
$IPTABLES -t filter -P OUTPUT ACCEPT
$IPTABLES -t filter -P FORWARD ACCEPT
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT
$IPTABLES -t mangle -P PREROUTING ACCEPT
$IPTABLES -t mangle -P OUTPUT ACCEPT
$IPTABLES -t mangle -P POSTROUTING ACCEPT
$IPTABLES -t mangle -P FORWARD ACCEPT
$IPTABLES -t mangle -P INPUT ACCEPT
$IPTABLES -t raw -P OUTPUT ACCEPT
$IPTABLES -t raw -P PREROUTING ACCEPT
$IPTABLES -F
if [ $IPV6 -eq 1 ]; then
$IP6TABLES -t filter -F
$IP6TABLES -t nat -F
$IP6TABLES -t mangle -F
$IP6TABLES -t raw -F
$IP6TABLES -t filter -P INPUT ACCEPT
$IP6TABLES -t filter -P OUTPUT ACCEPT
$IP6TABLES -t filter -P FORWARD ACCEPT
$IP6TABLES -t nat -P PREROUTING ACCEPT
$IP6TABLES -t nat -P POSTROUTING ACCEPT
$IP6TABLES -t nat -P OUTPUT ACCEPT
$IP6TABLES -t mangle -P PREROUTING ACCEPT
$IP6TABLES -t mangle -P OUTPUT ACCEPT
$IP6TABLES -t mangle -P POSTROUTING ACCEPT
$IP6TABLES -t mangle -P FORWARD ACCEPT
$IP6TABLES -t mangle -P INPUT ACCEPT
$IP6TABLES -t raw -P OUTPUT ACCEPT
$IP6TABLES -t raw -P PREROUTING ACCEPT
$IP6TABLES -F
fi
}
fw_status () {
$IPTABLES -L --line-numbers
if [ $IPV6 -eq 1 ]; then
$IP6TABLES -L --line-numbers
fi
}
#----------------------------------------------------------------------#
case "$1" in
start|restart)
log_daemon_msg "Starting firewall.."
fw_start
log_end_msg $?
;;
stop)
log_daemon_msg "Stopping firewall.."
fw_stop
log_end_msg $?
;;
clean)
log_daemon_msg "Clearing firewall rules.."
fw_clear
log_end_msg $?
;;
status)
log_daemon_msg "Firewall status"
fw_status
;;
*)
log_action_msg "Usage $0 {start|stop|restart|clean|status}"
exit 1
;;
esac
exit 0
Je ne sais pas où serait la meilleure place pour y transférer ce fil mais ce que je sais, c’est qu’il est dommage de le voir noyé dans PC.
T&A : “les scripts c’est par ici”
Programmation
SD
Pour l’instant, je le glisse vers SD, si vous le croyez mieux placé ailleurs, dites-le moi.
[quote=“ricardo”]Je ne sais pas où serait la meilleure place pour y transférer ce fil mais ce que je sais, c’est qu’il est dommage de le voir noyé dans PC.
T&A : “les scripts c’est par ici”
Programmation
SD
Pour l’instant, je le glisse vers SD, si vous le croyez mieux placé ailleurs, dites-le moi.[/quote]
Parce que tel qu’il est là, il n’est pas digne d’être au WIKI
C’est difficile de le classer.
SD : Non, il ne s’agit pas d’un problème.
T&A : Non, car il n’est pas parfait. Un lien à la rigueur?
Programmation : Ça dépend des moments, si le script est considéré comme fini ou non…
Je crois qu’il est bien dans SD.
Il y a plusieurs scripts dans T&A qui ont un fil de discussion ici.
On peut considérer que c’est un fil de discussion avant l’heure
Je commente juste les règles ip6tables.
Comme je l’ai écrit plus haut la table nat et sa cible MASQUERADE ne sont disponibles qu’avec les toutes dernières versions du noyau Linux et d’iptables, pas avec les versions disponibles dans Squeeze ni Wheezy. D’autre part l’utilisation de NAT comme en IPv4 ne devrait pas être nécessaire, chaque machine du réseau local disposant normalement d’une adresse IPv6 publique.
Si la machine ne sert pas de routeur, il y a de grandes chances qu’il faille accepter les types IMCPv6 pour SLAAC. Il faudrait donc ajouter une clause “else” au “if $ISROUTERNAT”.
Pour quelle raison accepter tout les paquets ICMPv6 en entrée si la machine sert de routeur ?
Étant donné que le videau requis pour le script dépasse désormais nettement mes compétences, j’ai déposé sur le wiki l’état actuel de la version supportant l’ipv6 : isalo.org/wiki.debian-fr/ind … rt_ipv6.29
Merci Pascal pour ta patience
Salut,
Merci pour le script.
Il faudrait rajouter comme c’était initialement le cas les listes blanches (ipv4 et ipv6 du coup).
for IP in $IPv6BLANC; do
$IP6TABLES -A INPUT -s ${IP} -j ACCEPT
done
Pour le ping, j’assoupli un peu:
$IPTABLES -t filter -A INPUT -p icmp -j LOG
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -m limit --limit 10/second -j ACCEPT
$IPTABLES -A INPUT -p icmp -j DROP
J’ai ajouté une règle pour le proxy, mais pas en ipv6 je ne me suis jamais penché sur la question…
[code]# Proxy ?
PROX=true
…
if $PROX ; then
$IPTABLES -t nat -A PREROUTING -i $ethx -p tcp --dport 80 -j REDIRECT --to-port 3128
# Parefeu - Routeur Proxy
fi[/code]
Il y a aussi le cas du VPN qu’il faudrait prendre en compte. Un true/false pour le vpn serait mieux que mon morceau de script.
[code]# ethx correspond à l’interface du LAN
ethx="eth1"
ethy="eth0"
vpn0=“tun0”
…
$IPTABLES -A INPUT -i $vpn0 -p icmp -j ACCEPT
$IPTABLES -A INPUT -i $vpn0 -p tcp -j ACCEPT
$IPTABLES -A INPUT -i $vpn0 -p udp -j ACCEPT
…
if $ISROUTERNAT ; then
$IPTABLES -A INPUT -i $vpn0 -j ACCEPT
$IPTABLES -A INPUT -p icmp -j ACCEPT
$IPTABLES -A FORWARD -i $ethy -o $vpn0 -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -o $ethy -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -o $ethy -j MASQUERADE
echo "Parefeu - Routeur avec NAT : [OK]"
fi
[/code]
Je me demande s’il ne serait pas plus judicieux, pour mieux s’y retrouver de faire deux scripts, un pour ipv4 et un pour ipv6 ?