Partage connexion

Un article de Linuxette.

Jump to: navigation, search

De temps en temps, j'ai besoin de connecter un ordinateur à l'Internet, via mon portable. J'utilise donc, sur celui-ci, un script pour faire un partage de connexion. A lancer sous root, bien sur.

   #!/bin/sh
   
   IPTABLES=/sbin/iptables
   # définition de l'interface ayant la connexion vers l'Internet:
   EXT_HARD="eth1"
   # interface pour le réseau local (du portable vers la machine à connecter au Net):
   LAN_HARD="eth0"
   # adresse du réseau entre le portable et la machine à connecter au Net:
   LAN_NETWORK="192.168.5.0/255.255.255.0"
   
   pf_init() {
           #### Initialisations
           # Initialisation de la table FILTER
           $IPTABLES -t filter -F
           $IPTABLES -t filter -X
           $IPTABLES -t filter -P INPUT   DROP
           $IPTABLES -t filter -P OUTPUT  DROP
           $IPTABLES -t filter -P FORWARD DROP
           
           # Initialisation de la table NAT
           $IPTABLES -t nat -F
           $IPTABLES -t nat -X 
           $IPTABLES -t nat -P PREROUTING  ACCEPT
           $IPTABLES -t nat -P POSTROUTING ACCEPT
           $IPTABLES -t nat -P OUTPUT      ACCEPT
           
           # Initialisation de la table MANGLE
           $IPTABLES -t mangle -F
           $IPTABLES -t mangle -X 
           $IPTABLES -t mangle -P PREROUTING  ACCEPT
           $IPTABLES -t mangle -P INPUT       ACCEPT
           $IPTABLES -t mangle -P OUTPUT      ACCEPT
           $IPTABLES -t mangle -P FORWARD     ACCEPT
           $IPTABLES -t mangle -P POSTROUTING ACCEPT
           
           # Jusqu'ici, rien ne passe, dans aucun sens
           
           # on autorise la boucle locale
           $IPTABLES -t filter -A OUTPUT -o lo -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT
           $IPTABLES -t filter -A INPUT  -i lo -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT
   }
   
   pf_start() {
   
   	# on autorise tout le trafic pour le reseau local vers l'Internet
   	$IPTABLES -t filter -A OUTPUT -o $LAN_HARD -s $LAN_NETWORK -d $LAN_NETWORK -j ACCEPT
   	$IPTABLES -t filter -A INPUT  -i $LAN_HARD -s $LAN_NETWORK -d $LAN_NETWORK -j ACCEPT
   	# on autorise tout le trafic pour le reseau local vers le serveur
   	$IPTABLES -A INPUT -i $LAN_HARD -j ACCEPT
   	$IPTABLES -A OUTPUT -o $LAN_HARD -j ACCEPT
   	$IPTABLES -A FORWARD -i $LAN_HARD -j ACCEPT
   	$IPTABLES -A FORWARD -o $LAN_HARD -j ACCEPT 
   #----------------------------------------------
       # on autorise les connexions avec internet uniquement si elles sont initialisees par les process locaux
       $IPTABLES -t filter -A OUTPUT -o $EXT_HARD -s 0.0.0.0/0 -d 0.0.0.0/0 -p all -m state --state ! INVALID           -j ACCEPT
       $IPTABLES -t filter -A INPUT  -i $EXT_HARD -s 0.0.0.0/0 -d 0.0.0.0/0 -p all -m state --state RELATED,ESTABLISHED -j ACCEPT
        
       # on autorise le connexions venant du reseau local vers le net
       $IPTABLES -t filter -A FORWARD -i $LAN_HARD -o $EXT_HARD -s $LAN_NETWORK -d 0.0.0.0/0 -m state --state ! INVALID           -j ACCEPT
       $IPTABLES -t filter -A FORWARD -i $EXT_HARD -o $LAN_HARD -s 0.0.0.0/0 -d $LAN_NETWORK -m state --state ESTABLISHED,RELATED -j ACCEPT
         
       # Et on masque les adresses du reseau local par celle de la "machine pare-feu"
       $IPTABLES -t nat -A POSTROUTING -o $EXT_HARD -s $LAN_NETWORK -j MASQUERADE
          
       echo 1 > /proc/sys/net/ipv4/ip_forward
   
   	# Autorisation de connexion ssh sur la machine
  	/sbin/iptables -A INPUT -p tcp --dport 22 -i eth0 -j ACCEPT
   	/sbin/iptables -A OUTPUT -p tcp --sport 22 -o eth0 -j ACCEPT
   
   }
   # --------------------------------------------
   # 
   pf_restart() {
           pf_init
           sleep 2
           pf_start
   }
   
   pf_status() {
           $IPTABLES -L -v -t filter
           $IPTABLES -L -v -t nat
           $IPTABLES -L -v -t mangle
           $IPTABLES -t nat -L PREROUTING 
           $IPTABLES -L FORWARD
   }
   
   # fin des fonctions, debut du script
   case "$1" in
           'start')
                   pf_start
           ;;
           'stop')
                   pf_init
           ;;
           'restart')
                   pf_restart
           ;;
           'status')
                   pf_status
           ;;
                   *)
           echo "Usage: $0 {start|stop|restart|status}"
   esac