Le firewall ipfw
Le firewall intégré de Mac OS X peut être configurer via les préférences systèmes. Jusqu'à Panther, ces préférences étaient assez sommaire. C'est toujours le cas avec Tiger, mais un peu moins (il est entre autre possible de gérer les ports udp).
Pour certains, celà ne suffit pas, et ils souhaitent pouvoir utiliser le firewall intégré dans toute sa spendeur. Il faut alors mettre les mains dans le cambouis, ce qui n'est pas toujours évident et, je l'espère, bien documenté dans cet article.
Installation
Il est possible de manipuler les règles du firewall directement avec la commande ipfw. Cependant les règles rajoutées de cette manière ne sont pas persistantes et disparaîteront au premier redémarrage.
Pour résoudre ce problème, il faut installer un script qui se chargera de restaurer des règles préenregistrées au démarrage (télécharger le script). Il faut ensuite décompresser l'archive dans le dossier /Library/StartupItems/ :
shell% cd /Library/StartupItems/ shell% tar -xzf /chemin/vers/firewall_startupitem.tgzLa configuration s'effectue via les fichiers
/etc/firewall.conf (pour l'IPv4, l'IP couramment utiliser) et /etc/firewall6.conf (pour l'IPv6). Un fichier absent signifie que le firewall IPv4 ou IPv6 est désactivé.
Format d'une règle
Une règle se présente sous la forme suivante :
add «numéro» «action» «protocole» from «source» to «destination» «options» «interface»
Le numéro sert à définir l'ordre dans lequel les règles seront exécutés sur le trafic réseau. Cela permet aussi de supprimer une seule règle identifié par son numéro via la commande ipfw delete «numéro».
L'action peut prendre plusieurs valeur dont les plus utile sont : allow ou deny, respectivement pour autoriser ou interdire le type de trafic définie par la suite de la règle.
Les valeurs les plus courantes prises par le champ protocole sont ip (qui signifie tout type de trafic), tcp ou udp.
La source et la destination ont le même format qui peut être :
any: toutany 1234: toute ip sur le port 1234me: n'importe quelle de mes IPs10.0.0.1: machine d'ip 10.0.0.110.0.0.0/8: machine du sous réseau 10.0.0.0 de masque 255.0.0.0 (/16 = masque 255.255.0.0 et /24 = masque 255.255.255.0)123.45.56.78 2000-2003,2005,2006machine d'ip 123.45.56.78 sur un port entre 2000 et 2003 ou sur les ports 2005 et 2006 (il ne peut y avoir qu'un seul intervale, et il doit être mis en premier)
Les options sont très nombreuses et permettent de définir plus précisément quels types de paquets seront reconnus par une règle. Je ne citerais que les options setup et established, applicables uniquement sur le trafic tcp, qui permettent de différentier les paquets d'initialisation de connexion et ceux d'une connexion déjà établie.
Le champs interface (optionnel) permet de différencier les paquets passant par des interfaces différentes :
via en0: paquets passant par l'interface en0in via en0: paquets entrant par l'interface en0out via en0: paquets sortant par l'interface en0in: paquets entrant par n'importe quelle interfaceout: paquets sortant par n'importe quelle interface
Exemple de configuration
IPv4, fichier /etc/firewall.conf :
# allow existing & local traffic add 01000 check-state add 01010 allow ip from any to any via lo0 # deny evil traffic (these rules are not really useful) add 02000 deny log ip from 127.0.0.0/8 to any in # local ip not through lo0 add 02010 deny log ip from any to 127.0.0.0/8 in # local ip not through lo0 add 02020 deny log ip from 224.0.0.0/3 to any in # source is multicast ip add 02030 skipto 02039 udp from any to 224.0.0.0/3 in add 02031 skipto 02039 igmp from any to 224.0.0.0/3 in add 02037 deny log all from any to 224.0.0.0/3 in # multicast, but neither udp nor igmp add 02040 deny log ip from any to any ipoptions ssrr,lsrr in # source routed paquets add 02050 deny log ip from any to any not verrevpath in # (MacOS X 10.4 only) # allow ip control traffic add 03000 allow icmp from any to me icmptypes 0,3,4,5,9,11,12,14 in # réponse et icmp important add 03010 allow icmp from any to me icmptypes 8 in # demande de ping add 03020 allow igmp from any to 224.0.0.0/3 in # igmp (pour le multicast) # allow resolving protocols add 04000 allow udp from any to any 5353 in # mDNS (Bonjour) add 04000 allow udp from any 5353 to me in add 04010 allow udp from any to any 427 in # svrloc (Bonjour) add 04020 allow udp from any to any 68 in # DHCP add 04030 allow udp from any to any 137 in # Samba (NetBIOS) # when using internet sharing add 05000 allow udp from any to 255.255.255.255 67 in # DHCP server add 05010 allow udp from any to me 53 in # DNS server add 05020 allow ip from any to any bridged # forwarded packets # allow connexions on my servers add 10000 allow tcp from any to me 22 in # SSH add 10010 allow tcp from any to me 49200-49300,21 in # FTP (control & passive data) add 10020 allow tcp from any to me 80 in # HTTP add 10030 allow tcp from any to me 139 in # SMB (Windows File Sharing) add 10040 allow tcp from any to me 548 in # AFP (File Sharing) add 10050 allow tcp from any to me 515,631 in # Printer Sharing add 10050 allow tcp from any to me 3689 in # iTunes add 10060 allow tcp from any to me 8770 in # iPhoto add 10070 allow tcp from any to me 113 in # ident/auth # allow peer-to-peer connexions add 20000 allow tcp from any to me 5297,5298,5190 in # iChat Bonjour & File transfert add 20010 allow udp from any to me 16384-16403,5060 in # iChat AV add 20020 allow tcp from any to me 4000 in # ICQ (File transfert) add 20030 allow tcp from any to me 6891-6900 in # MSN (File transfert) add 20050 allow tcp from any to me 32768-32788 in # IRC (File Transfert) # default rules add 60000 allow tcp from any to me tcpflags fin in add 60010 allow tcp from me to any keep-state out add 60020 allow udp from me to any keep-state out add 60030 allow icmp from me to any out add 60040 allow gre from me to any keep-state out # for VPN connections add 65534 deny log ip from any to any
IPv6, fichier /etc/firewall6.conf (exemple simpliste) :
# allow local traffic add 01000 allow all from any to any via lo* # allow packets from existing connections add 03000 allow tcp from any to any established add 03010 allow all from any to any frag # allow icmp important icmp and reply to ping # BSD users : icmptype should be replaced by icmp6type add 05000 count ipv6-icmp from any to any in icmptype 128 add 05010 allow ipv6-icmp from any to any in icmptype 1,2,3,4,128,129,130,134,135,136,137 # allow connexions to my servers add 10000 allow tcp from any to any 548 in # afpovertcp add 10010 allow tcp from any to any 122 in # ssh add 10040 allow tcp from any to any 80 in # http # default rules add 60000 allow tcp from any to any out add 60010 allow udp from any to any out add 60020 allow ipv6-icmp from any to any out add 60030 deny log all from any to any
