/ Accueil / Logiciels libres, et autres créations plus modestes
     | Ecrire

Firewall et adsl de Free Telecom

Tout ce qui suit commence à dater un peu, mais doit rester valable pour une connexion non dégroupée avec le modem sagem. Depuis ma ligne a été dégroupée et je suis l'heureux utilisateur d'une freebox. Je la connecte en ethernet et continue de router et filtrer mon traffic réseau sur le même principe. Le réseau est également en cours d'évolution vers le Wifi. Cette page sera mise à jour quand ceci sera complètement terminé (c'est à dire quand j'aurai réussi à faire un vrai point d'accès).

Le firewall est en fait mon ancien PC recyclé :

  • Carte mère A-Trend : chipset 440BX
  • Pentium II 400 MHz
  • 128 Mo SDram (je n'avais pas moins en stock !)
  • Disque dur seagate 800 Mo
  • Et puisqu'on ne peut pas booter un PC sans carte graphique : une Matrox G100.
  • Carte réseau ISA Etherlink II (3Com 3c503)
  • Le fameux modem adsl fourni par free : le sagem F@st 800

Le tout est posé en vrac dans une boite en carton, sans clavier sans écran

Le système est un Linux From Scratch doté d'un noyau 2.4.20.

Pour le filtrage des paquets IP, activer netfilter et l'ensemble des modules associés : suivi de session, suivi ftp, nat, masquerade... Patcher le noyau selon les recommandations netfilter.

#
# Networking options
#
CONFIG_PACKET=y
# CONFIG_PACKET_MMAP is not set
# CONFIG_NETLINK_DEV is not set
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
# CONFIG_FILTER is not set
CONFIG_UNIX=y
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_ROUTE_FWMARK=y
CONFIG_IP_ROUTE_NAT=y
CONFIG_IP_ROUTE_MULTIPATH=y
CONFIG_IP_ROUTE_TOS=y
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_ROUTE_LARGE_TABLES=y
# CONFIG_IP_PNP is not set
CONFIG_NET_IPIP=m
CONFIG_NET_IPGRE=m
CONFIG_NET_IPGRE_BROADCAST=y
# CONFIG_IP_MROUTE is not set
# CONFIG_INET_ECN is not set
# CONFIG_SYN_COOKIES is not set
#
#   IP: Netfilter Configuration
#
CONFIG_IP_NF_CONNTRACK=m
CONFIG_IP_NF_FTP=m
CONFIG_IP_NF_IRC=m
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_MATCH_LIMIT=m
CONFIG_IP_NF_MATCH_MAC=m
CONFIG_IP_NF_MATCH_PKTTYPE=m
CONFIG_IP_NF_MATCH_MARK=m
CONFIG_IP_NF_MATCH_MULTIPORT=m
CONFIG_IP_NF_MATCH_TOS=m
CONFIG_IP_NF_MATCH_ECN=m
CONFIG_IP_NF_MATCH_DSCP=m
CONFIG_IP_NF_MATCH_AH_ESP=m
CONFIG_IP_NF_MATCH_LENGTH=m
CONFIG_IP_NF_MATCH_TTL=m
CONFIG_IP_NF_MATCH_TCPMSS=m
CONFIG_IP_NF_MATCH_HELPER=m
CONFIG_IP_NF_MATCH_STATE=m
CONFIG_IP_NF_MATCH_CONNTRACK=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_NAT=m
CONFIG_IP_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_IP_NF_TARGET_REDIRECT=m
CONFIG_IP_NF_NAT_LOCAL=y
CONFIG_IP_NF_NAT_IRC=m
CONFIG_IP_NF_NAT_FTP=m
CONFIG_IP_NF_MANGLE=m
CONFIG_IP_NF_TARGET_TOS=m
CONFIG_IP_NF_TARGET_ECN=m
CONFIG_IP_NF_TARGET_DSCP=m
CONFIG_IP_NF_TARGET_MARK=m
CONFIG_IP_NF_TARGET_LOG=m
CONFIG_IP_NF_TARGET_ULOG=m
CONFIG_IP_NF_TARGET_TCPMSS=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
# CONFIG_IP_NF_COMPAT_IPCHAINS is not set
# CONFIG_IP_NF_COMPAT_IPFWADM is not set
# CONFIG_VLAN_8021Q is not set
# CONFIG_IPX is not set
# CONFIG_ATALK is not set

Le modem sagem nécessite le support USB, avec support du système de fichier usbdev. Le noyau accèdera au modem via des interfaces standard de périphérique d'entrée série.

#
# Input core support
# 
CONFIG_INPUT=y
#
# Character devices 
#
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
CONFIG_SERIAL=y
CONFIG_SERIAL_CONSOLE=y
# CONFIG_SERIAL_EXTENDED is not set
CONFIG_SERIAL_NONSTANDARD=y
# CONFIG_COMPUTONE is not set
# CONFIG_ROCKETPORT is not set
# [...] nothing set in this section
# CONFIG_RIO is not set
# CONFIG_STALDRV is not set
CONFIG_UNIX98_PTYS=y
CONFIG_UNIX98_PTY_COUNT=256

# File systems
CONFIG_PROC_FS=y
CONFIG_DEVPTS_FS=y 

#
# USB support
#
CONFIG_USB=y
# CONFIG_USB_DEBUG is not set
CONFIG_USB_DEVICEFS=y
# CONFIG_USB_BANDWIDTH is not set
# CONFIG_USB_LONG_TIMEOUT is not set
# CONFIG_USB_EHCI_HCD is not set
CONFIG_USB_UHCI_ALT=y
# CONFIG_USB_OHCI is not set
# CONFIG_USB_AUDIO is not set
# [...]
# CONFIG_USB_STORAGE_SDDR55 is not set
# CONFIG_USB_STORAGE_JUMPSHOT is not set
CONFIG_USB_ACM=y
# CONFIG_USB_PRINTER is not set
# CONFIG_USB_HID is not set
# [...]

Créer s'il n'existe pas le répertoire /dev/pts

Vérifier que le fichier /etc/fstab contient les montages de proc pts et usbdev :

none                    /dev/pts        devpts          gid=4,mode=620  0 0
none                    /proc           proc            defaults        0 0
usbdevfs                /proc/bus/usb   usbdevfs        defaults        0 0 

Le but du firewall est de faire disparaître tout ce qui vient de l'extérieur qui n'a pas été sollicité. Il protège ainsi des malveillance du dehors mais pas des imprudences du dedans !

  • Pour fonctionner il a besoin des modules netfilter :
    modprobe ip_tables
    modprobe iptable_filter
    modprobe ip_conntrack
    modprobe ip_conntrack_ftp
    modprobe ipt_state
    modprobe iptable_nat
    modprobe ip_nat_ftp
    modprobe ipt_MASQUERADE
    modprobe ipt_LOG
    modprobe ipt_REJECT
  • Autoriser les connexions locales, et celles du réseau privé :
    IF_PRIV=eth0 # nom de l'interface connectée au réseau privé
    IF_GW=ppp+ # nom de l'interface réseau connectée au reste du monde
    NET_PRIV=10.0.0.0/8 # masque du reseau interne
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A OUTPUT -o lo -j ACCEPT
    iptables -A INPUT -i $IF_PRIV -j ACCEPT
    iptables -A OUTPUT -o $IF_PRIV -j ACCEPT
  • Relayer les paquets sauf les établissements de connexion provenant de l'extérieur. On masque les adresse interne pour les remplacer par celle de l'interface publique :
    iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A FORWARD -m state --state NEW -i ! $IF_GW -j ACCEPT
    iptables -t nat -A POSTROUTING -o $IF_GW -j MASQUERADE
    iptables -A FORWARD -i $IF_PRIV -j ACCEPT
    iptables -A INPUT -i $IF_GW -m state --state ESTABLISHED,RELATED -j ACCEPT
  • Tenter de déjouer les petits malins qui de l'extérieur essaient de se faire passer pour un membre du réseau interne :
    iptables -A INPUT -p all -s localhost  -i $IF_GW -j DROP
    iptables -A INPUT -p all -s 10.0.0.0/8 -i $IF_GW -j DROP
  • Eliminer tout le reste :
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT DROP
  • Activer les modules
    echo 2 > /proc/sys/net/ipv4/ip_dynaddr
    echo 0 > /proc/sys/net/ipv4/tcp_ecn
    for f in /proc/sys/net/ipv4/conf/*/rp_filter
    do
    	echo 1 > $f
    done
    echo 1 > /proc/sys/net/ipv4/ip_forward

Ceci ne protège évidemment pas de tout puisque toutes les connexions en provenance du réseau interne sont relayées vers l'extérieur. Les vers et autre chevaux de Troyes ne sont donc pas affectés outre mesure à partir du moment où ils ont réussi à s'infiltrer jusqu'à l'intérieur (ce qui n'est pas très difficile quand ils exploitent les fonctionnalités douteuses de certains navigateurs et messageries). Le firewall n'est pas la protection absolue : ce n'est qu'un minimum.

Le driver le plus avancé est maintenant disponible ici : http://eagle-usb.fr.st/. J'utilise actuellement la version 1.0.4. Suivre les instruction d'installation à la lettre, cela fonctionne même avec ma LFS. Attention toutefois, un LFS ne dispose pas en général de la commande which nécessaire pour le make install. Un simple script faisant office de pseudo alias sur type -p fera l'affaire (voir blfs pour plus de détail).
Enfin, une LFS ne dispose pas de tous les mécanismes hotplug de l'USB (normalement aucun problème pour l'ajouter) mais ce n'est pas un problème : le driver, le firmware, voire la puce du modem présentent un bug. Il y a des problèmes au démarrage selon les délais de mise en route (voire doc du driver pour plus de détail). Mais comme il s'agit pour moi d'une installation fixe, je n'ai aucun besoin du hotplug. On fait le premier démarrage à la main pour tester l'installation et plus tard, tout cela sera pris en charge par un script au démarrage.

# chargement du driver
modprobe adiusbadsl
# init modem : chargement code DSP
adictrl -d
# démarrer la connexion
startadsl

mis à jour le : 15/04/2006 - 21:58