#! /bin/sh

##############################################################
### Adapté par Truong Phuong <tphuong@wol.be>              ###
### Date: jeu nov  7 13:09:43 CET 2002                     ###
##############################################################

###
### Documentation de références sur l'internet:
###
###  http://www.netfilter.org/documentation/tutorials/
###  http://www.linuxguruz.org/iptables
###
###  root:# man iptables
###  root:# iptables -m state --help
###  root:# iptables -j DNAT --help

### 
### Comment utiliser ce script sous Debian 3.0 (Woody), juillet 2002
###  (noyau 2.4.18 et iptables v1.2.7a)
### 
### root:# cp netfilter-fw.sh /etc/init.d/ 
### root:# chmod 700 /etc/init.d/netfilter-fw.sh
###

###
### tester si ça marche 
###
### root:# . /etc/init.d/netfilter-fw.sh 

###
### lancer automatiquement au démarrage
###
### root:# update-rc.d  netfilter-fw.sh  start 10 2 3 4 5 .

### 
### charger les modules de Netfilter
### 
  
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack

/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp

/sbin/modprobe ip_conntrack_irc  
/sbin/modprobe ip_nat_irc


### 
### définir l'interface réseau connecté au modem (côté le provider)
###  - pour modem câble DSL, ADSL Ethernet      : eth0  (via DHCP)
###  - pour modem ADSL USB (ex. SpeedTouch USB) : ppp0  (via PPP)
###
OUTSIDE_DEV=eth0

### 
### définir l'interface réseau connecté au réseau local (LAN)
### 
### Attention: voir le fichier /etc/network/interfaces.
###
INSIDE_DEV=eth1

### 
### désactiver le partage de connexion internet
### 
### car il se peut que le service DHCP (ou PPPoE, PPPoA) est relancé
### et les paramètres de réseaux seront changés.
###
echo "0" > /proc/sys/net/ipv4/ip_forward

###
### supprimer les chaines des filtrages
### supprimer les tables de Netfilter (iptables)
### supprimer les chaines des filtrages crées par utilisateurs
### mettre à zéros les compteurs des filtrages
###
iptables -F
iptables -t nat -F
iptables -X
iptables -Z


### 
### définir la politique de filtrage par défaut: BLOQUER TOUT
### 
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP


###
### partager la connexion internet avec réseau local 
###
### Attention: cette règle ne sera valable que uniquement lorsque la fonction
###            forwarding (ip_forward) est activée, à la fin de ce script.
iptables -t nat -A POSTROUTING -o  ${OUTSIDE_DEV} -j MASQUERADE

###
### accepter une session SSH à cette machine à partir d'une autre en local
### dont l'adresse IP est définie dans la variable $SSH_CLIENT.
###
### Attention: un port ouvert présente toujours un risque de sécurité.
###            Donc, à utiliser avec prudence.
SSH_CLIENT='192.168.1.22'
iptables -A INPUT -p tcp -i ${INSIDE_DEV} -s $SSH_CLIENT --dport 22  -j ACCEPT
iptables -A OUTPUT -p tcp -o ${INSIDE_DEV} -d $SSH_CLIENT --dport 22  -j ACCEPT

DEBUG_CLIENT=192.168.1.5
iptables -A INPUT -p icmp -i ${INSIDE_DEV} -s $DEBUG_CLIENT -j ACCEPT

###
### accepter le service du daemon identd
###
iptables -A INPUT -p TCP --dport 113 -i ${OUTSIDE_DEV} -j ACCEPT

###
### Forwarding des ports pour les services publiques
### Les serveurs sont derrière cette machine routeur/firewall
###
### Attention-1: pour savoir les ports prédéfinis, voir /etc/services
###
### Attention-2: les règles sont aussi valables pour une connexion ADSL
### avec IP dynamique; puisque elles sont appliquées sur l'interface
### extérieure mais pas en fonction de l'adresse IP.
###

###
### Pour rediger les connexions de VoIP (H.323) pour Gnomemeeting,
### 
### voir la FAQ de Gnomemeeting de Damien Sandras (Louvain-la-Neuve, Belgique)
###
###  http://www.gnomemeeting.org/
###

###
### Forwarding une session SSH venant de l'extérieur (via $OUTSIDE_DEV) 
### et via un port NON STANDARD (--dport 10022) vers $SSH_SERVER:22
###
SSH_NON_STD=10022
SSH_SERVER=192.168.1.22

iptables -t nat -A PREROUTING -i $OUTSIDE_DEV  -p tcp \
         --dport $SSH_NON_STD -j DNAT --to-destination $SSH_SERVER:22
			      
iptables -A FORWARD -p tcp -d $SSH_SERVER --dport 22 -o $INSIDE_DEV -j ACCEPT

###
### Forwarding le service SMTP venant de l'extérieur (via $OUTSIDE_DEV) 
### et via un port NON STANDARD (--dport 10025) vers $SMTP_SERVER:25
###

### Attention-1: certains providers bloquent les ports TCP: 21, 25, 80
### L'usage de ces services n'est pas permis selon le contrat.
### Utiliser à votre risque.
###

### Attention-2: l'adresse IP (ou nom de domain valide) et le port 
### NON_STANDARD (10025) de $OUTSIDE_DEV est définie dans le fichier
### /etc/postfix/transport (transport_map) d'un serveur Postfix extérieur. 
### Exemple une entrée dans /etc/potfix/transport:
### 
### exotiquedomain.be smtp:linuxsympa.dyndns.org:10025
###
### Merci à Alexandre_Dulaunoy <adulau-linux@cosnotix.com> ;)
###

### Attention-3: si l'adresse IP de $OUTSIDE_DEV est dynamique (via DHCP,
### PPPoA, PPPoE), on met dans le fichier /etc/postfix/transport du
### serveur Postfix extérieur le FQDN (un nom de domain publique valide)
### Le service DNS pour IP dynamique est proposé à dyndns.org, no-ip.com,..
###
SMTP_NON_STD=10025
SMTP_SERVER=192.168.1.25

iptables -t nat -A PREROUTING -i $OUTSIDE_DEV  -p tcp \
         --dport $SMTP_NON_STD -j DNAT --to-destination $SMTP_SERVER:25
			      
iptables -A FORWARD -p tcp -d $SMTP_SERVER --dport 25 -o ${INSIDE_DEV} -j ACCEPT

###
### Forwarding de $OUTSIDE_DEV:10080 vers 192.168.0.3:80
###
WEB_NON_STD=10080
WEB_SERVER=192.168.1.80

iptables -t nat -A PREROUTING -i ${OUTSIDE_DEV}  -p tcp \
         --dport $WEB_NON_STD -j DNAT --to-destination $WEB_SERVER:80
			      
iptables -A FORWARD -p tcp -d $WEB_SERVER --dport 80 -o ${INSIDE_DEV} -j ACCEPT


###
### bloquer le partage de fichiers via l'interface logiciel de NetBIOS
### (éviter les fuites des données du réseau local via NetBIOS, et Samba)
###
iptables -t nat -A PREROUTING -p TCP -i ${INSIDE_DEV} --dport 139 -j DROP
iptables -t nat -A PREROUTING -p UDP -i ${INSIDE_DEV} --dport 135:138 -j DROP

###
### bloquer les services automatiques via les ports de microsoft-ds
###
iptables -t nat -A PREROUTING -p TCP -i ${INSIDE_DEV} --dport 445 -j DROP
iptables -t nat -A PREROUTING -p UDP -i ${INSIDE_DEV} --dport 445 -j DROP

###
### Le suivi des états du forwarding (stateful of connection tracking).
###
iptables -A FORWARD -m state --state NEW -i ${INSIDE_DEV} -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state NEW,INVALID -i ${OUTSIDE_DEV} -j DROP

### 
### Le suivi des états des paquets entrant/sortant (ICMP, TCP, UDP)
###
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

###
### Pour les flags TCP (SYN, RESET) dans le cas PPPoE (câble DSL)
### 
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

### 
### bloquer les réseaux privés non routables
###   bloquer les paquets IP arrivant à l'interface extérieur dont les adresses
###   sources sont des adresses IP des réseaux privés non routables.
###   Ces réseaux sont définis par IANA, dans le RFC1918
###   <http://www.iana.org/ipaddress/ip_addresses.htm>.
### 
iptables -t nat -A PREROUTING -i ${OUTSIDE_DEV}  -s 10.0.0.0/8     -j DROP
iptables -t nat -A PREROUTING -i ${OUTSIDE_DEV}  -s 172.16.0.0/12  -j DROP
iptables -t nat -A PREROUTING -i ${OUTSIDE_DEV}  -s 192.168.0.0/16 -j DROP

###
### bloquer aussi les réseaux réservés et les réseaux multicast
###  <http://www.iana.org/ipaddress/ip_addresses.htm>.
### 
iptables -t nat -A PREROUTING -i ${OUTSIDE_DEV}  -s 127.0.0.0/8    -j DROP
iptables -t nat -A PREROUTING -i ${OUTSIDE_DEV}  -s 224.0.0.0/4    -j DROP
iptables -t nat -A PREROUTING -i ${OUTSIDE_DEV}  -s 240.0.0.0/5    -j DROP

###
### mettre en priotaire les paquets de ssh, ftp mais pas ftp-data (TCP/20)
###
### Ici, gestion de la bande de passant rudimentaire.
### Pour une meilleur gestion de QoS, utiliser iproute2 (tc, ip) et iptables
###
### Quelques liens de références sur l'internet:
# http://lartc.org 
# http://www.linux-france.org/prj/inetdoc/i/net/guides/Advanced-routing-Howto
# http://www.regit.org
###
iptables -A PREROUTING -t mangle -p tcp --sport ssh  -j TOS --set-tos Minimize-Delay
iptables -A PREROUTING -t mangle -p tcp --sport ftp -j TOS --set-tos Minimize-Delay
iptables -A PREROUTING -t mangle -p tcp --sport ftp-data -j TOS --set-tos Maximize-Throughput


###
### afficher les règles de filtrage
###
iptables -nL

###
### activer le suivi de l'adresse IP dynamique
###
echo 7 > /proc/sys/net/ipv4/ip_dynaddr

###
### Enfin, activer le partage de connexion internet
###
echo " "
echo "Activer IP forwarding."
echo " "
echo "1" > /proc/sys/net/ipv4/ip_forward

### EOF ###
