#!/bin/sh # # Configuration iptables de double partage de connexion PPtP, FreeBox et firewall par Bibi 24/05/2004 # Déclaration des variables # Interfaces externes # Pour l'accès 9telecom PPtP NEUF_IP=`ifconfig | grep inet | grep P- | cut -d : -f 2 | cut -d P -f 1` NEUF_IFACE="ppp0" # Dans le cas de l'accès Free par Freebox Ethernet (adresse IP fixe) FREE_IP="82.226.217.65" FREE_IFACE="eth1" # Adresses du LAN LAN_IP=`ifconfig | grep inet | grep 192 |grep B | cut -d : -f 2 | cut -d B -f 1` LAN_IP_RANGE="192.168.0.0/24" LAN_BCAST_ADDRESS="192.168.0.255" LAN_IFACE="eth0" # Localhost LO_IFACE="lo" LO_IP="127.0.0.1" # Définition du chemin d'iptables IPTABLES="/sbin/iptables" # Modules à utiliser /sbin/depmod -a # Modules nécessaires /sbin/modprobe ip_tables /sbin/modprobe ip_conntrack /sbin/modprobe iptable_filter /sbin/modprobe iptable_mangle /sbin/modprobe iptable_nat /sbin/modprobe ipt_LOG /sbin/modprobe ipt_limit /sbin/modprobe ipt_state /sbin/modprobe ip_conntrack_ftp /sbin/modprobe ip_nat_ftp /sbin/modprobe ip_conntrack_irc /sbin/modprobe ip_nat_irc # Modules non nécessaires # /sbin/modprobe ipt_owner # /sbin/modprobe ipt_REJECT # /sbin/modprobe ipt_MASQUERADE # Activation du routage echo 1 > /proc/sys/net/ipv4/ip_forward # Activation de l'anti spoofing echo 2 > /proc/sys/net/ipv4/conf/all/rp_filter # Interdiction des pings en broadcast echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # Interdit le source routing #echo 0 > /proc/sys/net/ipv4/accept_source_route # Interdire les timestamps echo 0 > /proc/sys/net/ipv4/tcp_timestamps # Autoriser les SYN Cookies echo 1 > /proc/sys/net/ipv4/tcp_syncookies # Interdire les redirects echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects # Logger les martians source (adresses impossibles) echo 1 > /proc/sys/net/ipv4/conf/all/log_martians # Activation du proxy ARP #echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp # Activation de l'utilisation d'IPs dynamiques #echo "1" > /proc/sys/net/ipv4/ip_dynaddr # Réduire les timeouts pour éviter les DOS echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time echo 1 > /proc/sys/net/ipv4/tcp_window_scaling echo 0 > /proc/sys/net/ipv4/tcp_sack echo 1280 > /proc/sys/net/ipv4/tcp_max_syn_backlog # Mise en place des règles ########################################################### #Mise en place de la table FILTER (input, forward, output)# ########################################################### # Mise en place de la politique DROP pour toutes les tables $IPTABLES -F $IPTABLES -t nat -F $IPTABLES -t mangle -F $IPTABLES -P INPUT DROP $IPTABLES -P FORWARD DROP $IPTABLES -P OUTPUT DROP # Création des tables personnalisées $IPTABLES -X log-and-drop $IPTABLES -N log-and-drop $IPTABLES -X rfc-compliant $IPTABLES -N rfc-compliant $IPTABLES -X icmp-ok $IPTABLES -N icmp-ok $IPTABLES -X lan-vers-lan $IPTABLES -N lan-vers-lan $IPTABLES -X net-vers-net $IPTABLES -N net-vers-net $IPTABLES -X lan-vers-net $IPTABLES -N lan-vers-net $IPTABLES -X net-vers-lan $IPTABLES -N net-vers-lan $IPTABLES -X vient-du-lan $IPTABLES -N vient-du-lan $IPTABLES -X vient-du-net $IPTABLES -N vient-du-net # On autorise le dialogue de ou avec l'interface loopback $IPTABLES -A INPUT -i $LO_IFACE -d $LO_IP -j ACCEPT $IPTABLES -A OUTPUT -o $LO_IFACE -s $LO_IP -j ACCEPT # Chaine log-and-drop # On log et on drop ! # Cette chaine sera appelée par défaut dès qu'un paquet ne match pas les autres règles $IPTABLES -A log-and-drop -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES DROP] : ' $IPTABLES -A log-and-drop -j DROP # Chaine RFC-1918 # On refuse tout ce qui a une adresse RFC 1918 $IPTABLES -A rfc-compliant -s 10.0.0.0/8 -j log-and-drop $IPTABLES -A rfc-compliant -s 127.0.0.0/8 -j log-and-drop $IPTABLES -A rfc-compliant -s 172.16.0.0/12 -j log-and-drop $IPTABLES -A rfc-compliant -s 192.168.0.0/16 -j log-and-drop # Chaine icmp-ok # Que les icmp dont on a besoin (RFC compliant) $IPTABLES -A icmp-ok -m state --state RELATED -p icmp -j ACCEPT $IPTABLES -A icmp-ok -p icmp --icmp-type destination-unreachable -j ACCEPT $IPTABLES -A icmp-ok -p icmp --icmp-type source-quench -j ACCEPT $IPTABLES -A icmp-ok -p icmp --icmp-type time-exceeded -j ACCEPT $IPTABLES -A icmp-ok -p icmp --icmp-type echo-request -j ACCEPT $IPTABLES -A icmp-ok -p icmp --icmp-type echo-reply -j ACCEPT $IPTABLES -A icmp-ok -j log-and-drop # Chaine vient-du-lan # On accepte les icmp-ok et tout le reste $IPTABLES -A vient-du-lan -p icmp -j icmp-ok $IPTABLES -A vient-du-lan -j ACCEPT # Chaine vient-du-net # On n'accepte que les icmp-ok, le SSH, et le HTTP/S $IPTABLES -A vient-du-net -m state --state ESTABLISHED,RELATED -p tcp -j ACCEPT $IPTABLES -A vient-du-net -m state --state ESTABLISHED,RELATED -p udp -j ACCEPT $IPTABLES -A vient-du-net -m state --state NEW -p tcp --dport ssh --syn -j ACCEPT $IPTABLES -A vient-du-net -m state --state NEW -p tcp --dport 80 --syn -j ACCEPT $IPTABLES -A vient-du-net -m state --state NEW -p tcp --dport 443 --syn -j ACCEPT $IPTABLES -A vient-du-net -p icmp -j icmp-ok $IPTABLES -A vient-du-net -j log-and-drop # Chaine lan-vers-lan # On autorise les rebonds en interne $IPTABLES -A lan-vers-lan -j LOG --log-prefix "ipt Rebond lan " $IPTABLES -A lan-vers-lan -j ACCEPT # Chaine net-vers-net # On n'autorise pas les rebonds depuis le net $IPTABLES -A net-vers-net -j LOG --log-prefix "ipt Rebond net " $IPTABLES -A net-vers-net -j DROP # Chaine lan-vers-net # On autorise tout en sortie $IPTABLES -A lan-vers-net -j ACCEPT # Chaine net-vers-lan # On autorise les flux serveur de l'interne (Warcraft3, P2P etc.) $IPTABLES -A net-vers-lan -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A net-vers-lan -m state --state NEW -p tcp --dport 6112 -j ACCEPT $IPTABLES -A net-vers-lan -m state --state NEW -p tcp --dport 4662 -j ACCEPT $IPTABLES -A net-vers-lan -m state --state NEW -p tcp --dport 4672 -j ACCEPT $IPTABLES -A net-vers-lan -j log-and-drop # Règles de la table INPUT # On appelle les chaines précédemment créées selon la provenance $IPTABLES -A INPUT -m state --state INVALID -j log-and-drop $IPTABLES -A INPUT -i $FREE_IFACE -j vient-du-net $IPTABLES -A INPUT -i $NEUF_IFACE -j vient-du-net $IPTABLES -A INPUT -i $LAN_IFACE -j vient-du-lan # Règles de la chaine OUTPUT $IPTABLES -A OUTPUT -o $FREE_IFACE -j vient-du-net $IPTABLES -A OUTPUT -o $NEUF_IFACE -j vient-du-net $IPTABLES -A OUTPUT -o $LAN_IFACE -j vient-du-lan # Règles de la chaine FORWARD $IPTABLES -A FORWARD -m state --state INVALID -j log-and-drop $IPTABLES -A FORWARD -i $NEUF_IFACE -o $LAN_IFACE -j net-vers-lan $IPTABLES -A FORWARD -i $FREE_IFACE -o $LAN_IFACE -j net-vers-lan $IPTABLES -A FORWARD -i $LAN_IFACE -o $NEUF_IFACE -j lan-vers-net $IPTABLES -A FORWARD -i $LAN_IFACE -o $FREE_IFACE -j lan-vers-net $IPTABLES -A FORWARD -i $FREE_IFACE -o $FREE_IFACE -j net-vers-net $IPTABLES -A FORWARD -i $FREE_IFACE -o $NEUF_IFACE -j net-vers-net $IPTABLES -A FORWARD -i $NEUF_IFACE -o $FREE_IFACE -j net-vers-net $IPTABLES -A FORWARD -i $NEUF_IFACE -o $NEUF_IFACE -j net-vers-net $IPTABLES -A FORWARD -i $LAN_IFACE -o $LAN_IFACE -j lan-vers-lan ########################################################### # Mise en place de la table MANGLE # ########################################################### # Règle d'ajout d'un au TTL pour plus de furtivité du firewall (traceroute) # SEMBLE GENERER DES ERREURS !!! A VOIR !!! # $IPTABLES -t mangle -A PREROUTING -i $INET_IFACE -j TTL --ttl-inc 1 # Marquage des paquets routés différemment selon le port destination # La marque est prise en compte par iproute2 $IPTABLES -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 80 $IPTABLES -t mangle -A PREROUTING -i eth0 -p tcp --dport 21 -j MARK --set-mark 21 $IPTABLES -t mangle -A PREROUTING -i eth0 -p tcp --dport 443 -j MARK --set-mark 443 $IPTABLES -t mangle -A PREROUTING -i eth0 -p tcp --dport 6112 -j MARK --set-mark 6112 ########################################################### # Mise en place de la table NAT # ########################################################### # SNAT des @IP internes $IPTABLES -t nat -A POSTROUTING -o $FREE_IFACE -j SNAT --to-source $FREE_IP $IPTABLES -t nat -A POSTROUTING -o $NEUF_IFACE -j SNAT --to-source $NEUF_IP # Mise en place de port forwarding pour les applis TCP, remplacer le --dport XX # par le port de l'appli, et le --to-destination XXX.XXX.XXX.XXX par l'adresse de la becane # interne et enlever le # s'il y en a un $IPTABLES -t nat -A PREROUTING -p tcp -d $FREE_IP --dport 6112 -j DNAT --to-destination 192.168.0.1 $IPTABLES -t nat -A PREROUTING -p tcp -d $NEUF_IP --dport 6112 -j DNAT --to-destination 192.168.0.1 $IPTABLES -t nat -A PREROUTING -p tcp -d $FREE_IP --dport 4662 -j DNAT --to-destination 192.168.0.87 $IPTABLES -t nat -A PREROUTING -p tcp -d $NEUF_IP --dport 4662 -j DNAT --to-destination 192.168.0.87 # Mise en place de port forwarding pour les applis UDP $IPTABLES -t nat -A PREROUTING -p udp -d $FREE_IP --dport 4672 -j DNAT --to-destination 192.168.0.87 $IPTABLES -t nat -A PREROUTING -p udp -d $NEUF_IP --dport 4672 -j DNAT --to-destination 192.168.0.87 # That's all folks...