Futur Mac

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.tgz
La 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 :

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 :

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