2,7 → 2,10 |
# $Id$ |
# script de mise en place des regles du parefeu d'Alcasar (mode normal) |
# Rexy - 3abtux - CPN |
# there are three channels for log : 1 (default) for tracability, 2 for secure admin (ssh), 3 for exterior access attempts, |
# there are three channels for log : |
# 1 (default) for tracability; |
# 2 for secure admin (ssh); |
# 3 for exterior access attempts. |
|
IPTABLES="/sbin/iptables" |
FILTERING="no" |
12,7 → 15,9 |
TUNIF="tun0" |
PRIVATE_NETWORK_MASK="192.168.182.0/24" |
PRIVATE_IP="192.168.182.1" |
DNSSERVERS="208.67.220.220,208.67.222.222" |
|
# Effacement des règles existantes |
# Flush all existing rules |
$IPTABLES -F |
$IPTABLES -t nat -F |
20,37 → 25,45 |
$IPTABLES -F INPUT |
$IPTABLES -F FORWARD |
$IPTABLES -F OUTPUT |
$IPTABLES -N SYN-FLOOD |
|
# Suppression des chaines utilisateurs sur les tables filter et nat |
# Flush non default rules on filter and nat tables |
$IPTABLES -X |
$IPTABLES -t nat -X |
|
# Stratégies par défaut |
# Default policies |
$IPTABLES -P INPUT DROP |
$IPTABLES -P FORWARD DROP |
$IPTABLES -P OUTPUT ACCEPT |
$IPTABLES -P OUTPUT DROP |
$IPTABLES -t nat -P PREROUTING ACCEPT |
$IPTABLES -t nat -P POSTROUTING ACCEPT |
$IPTABLES -t nat -P OUTPUT ACCEPT |
|
# Flush non default rules on filter and nat tables |
$IPTABLES -X |
$IPTABLES -t nat -X |
# Création des chaînes utilisateur |
# User defined chains |
$IPTABLES -N SYN-FLOOD |
|
# Tout passe sur loopback |
# accept all on loopback |
$IPTABLES -A INPUT -i lo -j ACCEPT |
|
# Blocage des tentatives de spoofing de l'adresse de loopback |
# Block all attempts to spoof the loopback address |
$IPTABLES -A INPUT -s 127.0.0.0/8 -j DROP |
$IPTABLES -A INPUT -d 127.0.0.0/8 -j DROP |
|
# Blocage des tentatives de spoofing de l'adresse IP côté interne |
# Block all attempts to spoof the local IP address |
$IPTABLES -A INPUT -s $PRIVATE_IP -j DROP |
|
|
# Blocage des attaques de type SYN FLOOD |
# Block Syn Flood attacks |
$IPTABLES -A INPUT -p tcp -m tcp --syn -j SYN-FLOOD |
#$IPTABLES -A INPUT -p tcp -m tcp --syn -j SYN-FLOOD |
#$IPTABLES -A SYN-FLOOD -m limit --limit 1/s --limit-burst 4 -j RETURN |
#$IPTABLES -A SYN-FLOOD -j DROP |
|
# Syn flood filtering chain |
$IPTABLES -A SYN-FLOOD -m limit --limit 1/s --limit-burst 4 -j RETURN |
$IPTABLES -A SYN-FLOOD -j DROP |
|
# On élimine les paquets "NEW not SYN" |
# Ensure that TCP connections start with syn packets |
$IPTABLES -A INPUT -p tcp -m tcp ! --syn -m state --state NEW -j DROP |
|
57,8 → 70,11 |
############################# |
# INTIF rules # |
############################# |
# les requètes dhcp entrantes sont acceptées |
# accept dhcp |
$IPTABLES -A INPUT -i $INTIF -p udp -m udp --sport bootpc --dport bootps -j ACCEPT |
|
# La règle suivante interdit la sortie par INTIF. Elle n'est utile que lorsque chilli est arrêté. |
# INTIF is closed (all by TUNIF) |
$IPTABLES -A INPUT -i $INTIF -j ULOG --ulog-prefix "RULE Protect1 -- REJECT " |
$IPTABLES -A INPUT -i $INTIF -j REJECT |
66,31 → 82,41 |
############################# |
# Local protection rules # |
############################# |
# On stoppe les tentatives de NULLSCAN et XMAS (tous flags à 1) |
# Drop XMAS & NULLscans |
$IPTABLES -A INPUT -p tcp --tcp-flags FIN,URG,PSH FIN,URG,PSH -j DROP |
$IPTABLES -A INPUT -p tcp --tcp-flags ALL ALL -j DROP |
$IPTABLES -A INPUT -p tcp --tcp-flags ALL NONE -j DROP |
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP |
|
# On stoppe les broadcasts et multicast |
# Drop broadcast & multicast |
$IPTABLES -A INPUT -m addrtype --dst-type BROADCAST,MULTICAST -j DROP |
|
# Règles d'antispoofing |
# Antispoofing rules with log |
$IPTABLES -A INPUT -i $TUNIF ! -s $PRIVATE_NETWORK_MASK -j ULOG --ulog-prefix "RULE Antispoof1 -- DENY " |
$IPTABLES -A INPUT -i $TUNIF ! -s $PRIVATE_NETWORK_MASK -j DROP |
$IPTABLES -A INPUT -i $EXTIF -s $PRIVATE_NETWORK_MASK -j ULOG --ulog-prefix "RULE Antispoof2 -- DENY " |
$IPTABLES -A INPUT -i $EXTIF -s $PRIVATE_NETWORK_MASK -j DROP |
|
# On laisse passer les ICMP echo-request et echo-reply en provenance du LAN |
# Allow ping (icmp N°0 & 8) from LAN |
$IPTABLES -A INPUT -i $TUNIF -s $PRIVATE_NETWORK_MASK -p icmp --icmp-type 0 -j ACCEPT |
$IPTABLES -A INPUT -i $TUNIF -s $PRIVATE_NETWORK_MASK -p icmp --icmp-type 8 -j ACCEPT |
|
# Here, we add local rules (i.e. ssh from Internet) |
# Insertion de règles locales |
# Here, we add local rules (i.e. ssh from Internet) |
if [ -f /usr/local/etc/alcasar-iptables-local.sh ]; then |
. /usr/local/etc/alcasar-iptables-local.sh |
fi |
|
# Rejet des tentatives de création de tunnels DNS (même pour les utilisateurs authentifiés) |
# Deny forward DNS (even for authenticated users ...) |
$IPTABLES -A FORWARD -i $TUNIF -p udp --dport domain -j REJECT --reject-with icmp-port-unreachable |
$IPTABLES -A FORWARD -i $TUNIF -p tcp --dport domain -j REJECT --reject-with tcp-reset |
|
# On autorise les retours de connexions légitimes par FORWARD |
# Conntrack on forward |
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT |
|
98,6 → 124,7 |
# If protocols filter is activate # |
##################################### |
if [ $FILTERING = "yes" ]; then |
# Mise en place des exceptions (adresses IP des machines ne faisant pas l'objet de filtrage) |
# Compute exception IP |
nb_exceptions=`wc -w /usr/local/etc/alcasar-filter-exceptions | cut -d" " -f1` |
if [ $nb_exceptions != "0" ] |
104,11 → 131,12 |
then |
while read ip_exception |
do |
echo $ip_exception |
$IPTABLES -A FORWARD -i $TUNIF -s $ip_exception -m state --state NEW -j ULOG --ulog-prefix "RULE IP-exception -- ACCEPT " |
$IPTABLES -A FORWARD -i $TUNIF -s $ip_exception -m state --state NEW -j ACCEPT |
$IPTABLES -A PREROUTING -t nat -i $TUNIF -p udp -s $ip_exception -d $PRIVATE_IP --dport domain -j REDIRECT --to-port 54 |
done < /usr/local/etc/alcasar-filter-exceptions |
fi |
# Autorisation de protocoles non commentés |
# Allow non comment protocols |
while read svc_line |
do |
126,6 → 154,7 |
fi |
fi |
done < /usr/local/etc/alcasar-services |
# Rejet explicite (vers le LAN) des autres protocoles |
# reject the others |
$IPTABLES -A FORWARD -i $TUNIF -p tcp -j ULOG --ulog-prefix "RULE F_filter -- REJECT " |
$IPTABLES -A FORWARD -i $TUNIF -p tcp -j REJECT --reject-with tcp-reset |
140,14 → 169,15 |
. /usr/local/etc/alcasar-iptables-qos.sh |
fi |
|
# Autorisation des connections sortant du LAN |
# Allow forward connections with log |
$IPTABLES -A FORWARD -i $TUNIF -m state --state NEW -j ULOG --ulog-prefix "RULE F_all -- ACCEPT " |
$IPTABLES -A FORWARD -i $TUNIF -m state --state NEW -j ACCEPT |
|
#################################################################################### |
# Imput from local network (dns, ntp, https, http, ssh and 3990 (user disconnect) # |
#################################################################################### |
$IPTABLES -A INPUT -i $TUNIF -d $PRIVATE_IP -p udp --dport domain -j ACCEPT |
########################################################################################### |
# Direct input from local network (dns, ntp, https, http, ssh and 3990 (user disconnect) # |
########################################################################################### |
$IPTABLES -A INPUT -i $TUNIF -d $PRIVATE_IP -p udp --dport domain -j ACCEPT # dnsmasq pour tous |
$IPTABLES -A INPUT -i $TUNIF -d $PRIVATE_IP -p udp --dport ntp -j ACCEPT |
$IPTABLES -A INPUT -i $TUNIF -d $PRIVATE_IP -p tcp --dport https -j ACCEPT |
$IPTABLES -A INPUT -i $TUNIF -d $PRIVATE_IP -p tcp --dport http -j ACCEPT |
155,33 → 185,67 |
$IPTABLES -A INPUT -i $TUNIF -d $PRIVATE_IP -p tcp --dport ssh -j ACCEPT |
$IPTABLES -A INPUT -i $TUNIF -d $PRIVATE_IP -p tcp --dport 3990 -j ACCEPT |
|
# On autorise les retours de connexions légitimes par INPUT |
# Conntrack on INPUT |
$IPTABLES -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT |
|
# Deny direct connections on DansGuardian port (8080) |
# On interdit les connexions directes au port utilisé par DansGuardian (8080) et par dnsmasq-forward (54) |
# Les packets concernés ont fait l'objet d'un marquage dans la table mangle |
# lors d'une règle de PREROUTING (voir plus bas) |
# Deny direct connections on DansGuardian port (8080) and on dnsmasq-forward port (54) |
# The concerned paquets are marked by a pre-routing rule (see further) |
$IPTABLES -A INPUT -i $TUNIF -p tcp --dport 8080 -m mark --mark 1 -j DROP |
# Allow connections for DansGuardian |
$IPTABLES -A INPUT -i $TUNIF -p udp --dport 54 -m mark --mark 1 -j DROP |
# Autorisation des connexions à DansGuardian et dnsmasq-forward |
# Allow connections for DansGuardian and forward-mode dnsmasq |
$IPTABLES -A INPUT -i $TUNIF -p tcp --dport 8080 -m state --state NEW --syn -j ACCEPT |
$IPTABLES -A INPUT -i $TUNIF -p udp --dport 54 -j ACCEPT |
|
# Journalisation des requètes HTTP (seulement des paquets SYN) |
# Log HTTP requests (only syn) |
$IPTABLES -A PREROUTING -t nat -i $TUNIF -p tcp ! -d $PRIVATE_IP --dport http -m state --state NEW -j ULOG --ulog-prefix "RULE F_http -- ACCEPT " |
# On redirige les requêtes HTTP vers DansGuardian (transparent pour les utilisateurs) |
# Redirect HTTP request in DansGuardian (transparent proxy) |
$IPTABLES -A PREROUTING -t nat -i $TUNIF -p tcp ! -d $PRIVATE_IP --dport http -j REDIRECT --to-port 8080 |
# Mark the dansguardian bypass attempts |
# Journalisation et marquage des paquets qui tentent d'accéder directement à DansGuardian et à dnsmasq-forward |
# pour pouvoir les supprimer en INPUT (voir plus haut) |
# Mark the dansguardian or dnsmasq bypass attempts |
$IPTABLES -A PREROUTING -t nat -i $TUNIF -p tcp -d $PRIVATE_IP -m tcp --dport 8080 -j ULOG --ulog-prefix "RULE direct-proxy -- DENY " |
$IPTABLES -A PREROUTING -t nat -i $TUNIF -p udp -d $PRIVATE_IP -m udp --dport 54 -j ULOG --ulog-prefix "RULE direct-dns -- DENY " |
$IPTABLES -A PREROUTING -t mangle -i $TUNIF -p tcp -d $PRIVATE_IP -m tcp --dport 8080 -j MARK --set-mark 1 |
$IPTABLES -A PREROUTING -t mangle -i $TUNIF -p udp -d $PRIVATE_IP -m udp --dport 54 -j MARK --set-mark 1 |
|
# Journalisation et rejet des connexions (autres que celles autorisées) effectuées depuis le LAN |
# Deny and log on INPUT from the LAN |
$IPTABLES -A INPUT -i $TUNIF -m state --state NEW -j ULOG --ulog-prefix "RULE rej-int -- REJECT " |
$IPTABLES -A INPUT -i $TUNIF -p tcp -j REJECT --reject-with tcp-reset |
$IPTABLES -A INPUT -i $TUNIF -p udp -j REJECT --reject-with icmp-port-unreachable |
|
# Journalisation et rejet des connexions initiées depuis le réseau extérieur (test des effets du paramètre --limit en cours) |
# On EXTIF, the access attempts are log in channel 2 (we should test --limit option to avoid deny of service) |
$IPTABLES -A INPUT -i $EXTIF -m state --state NEW -j ULOG --ulog-nlgroup 3 --ulog-qthreshold 10 --ulog-prefix "RULE rej-ext -- DROP" |
# Drop on EXTIF |
$IPTABLES -A INPUT -i $EXTIF -j DROP |
|
############################# |
# filtering outside OUTPUT. # |
############################# |
|
# On laisse tout sortir sur toutes les cartes sauf celle qui est connectée sur l'extérieur |
# Everything is allowed but traffic through outside network interface |
$IPTABLES -A OUTPUT ! -o $EXTIF -j ACCEPT |
|
# On autorise le parefeu à requêter les DNS externes |
# Allow DNS requests to identified DNS servers |
$IPTABLES -A OUTPUT -o $EXTIF -d $DNSSERVERS -p udp --dport domain -m state --state NEW -j ACCEPT |
|
# On autorise les requêtes http sortantes |
# HTTP requests are allowed |
$IPTABLES -A OUTPUT -o $EXTIF -p tcp --dport http -j ACCEPT |
|
# On autorise les requêtes ntp |
# NTP requests are allowed |
$IPTABLES -A OUTPUT -o $EXTIF -p udp --dport ntp -j ACCEPT |
|
# Traduction dynamique d'adresse en sortie |
# Dynamic NAT on EXTIF |
$IPTABLES -A POSTROUTING -t nat -o $EXTIF -j MASQUERADE |
|