Installation d'un réseau wifi sous openbsd

Dans cette documentation, nous allons voir comment installer et configurer une
carte wifi sous openbsd. Je n'utilise pas le wep, par contre, je protege 
l'accés au réseau à l'aide d'authpf.

La carte:
pour les cartes supportées, voir man 4 wi.
dans cette documentation, la carte utilisée est une dlink dwl 520

Installation:
brancher la carte, au démarage, si vous avez le message suivant:

wi0 at pci0 dev 9 function 0 "Intersil PRISM2.5 Mini-PCI WLAN" rev 0x01: irq 12
wi0: PRISM2.5 ISL3874A(Mini-PCI), Firmware 1.0.7 (primary), 1.3.6 (station), address xx:xx:xx:xx:xx:xx

c'est que la carte est bien installée et reconnu par le système. Sinon, soit 
votre carte n'est pas supportée, soit utilisez google pour voir ce qui cloche.

Configuration de la carte:
mon réseau est composé de 4 machines, et il est découpé de la façon suivante:
machine A: la passerelle, avec 3 interfaces réseau:
 - vr0 pour le lan cablé (avec une ip en 192.168.0.x)
 - ne3 pour le modem adsl
 - wi0 pour le lan wireless (avec une ip en 10.0.0.x)

machine B et C sont connectées par le reseau cablé, en passant par un switch.
machine D passe par le reseau wifi.

Pour configurer la carte, créer un fichier `hostname.wi0`, avec le contenu 
suivant:

inet 10.0.0.1 255.255.255.0 10.0.0.255
!/sbin/wicontrol \$if -n nomreseauwifi -s nomhote -p 6

la commande wicontrol (man 8 wicontrol) controle les opérations du lan wireless
pour les cartes utilisant le driver `wi` (man 4 wi).
l'option -n spécifie le nom du réseau wireless, -s le nom de la machine, -p 6 
pour déclarer la carte en 'hostap mode', c'est à dire en point d'accès.
L'IP de cette carte est 10.0.0.1

Le réseau possède un serveur dns et un serveur dhcp.
La configuration du dhcp est la suivante:

shared-network LOCAL-NET {
        option  domain-name "nomdureseau";
        option  domain-name-servers 192.168.100.xx;

        subnet 10.0.0.0 netmask 255.255.255.0 {
                option routers 10.0.0.1;
                option broadcast-address 10.0.0.255;
                range 10.0.0.3 10.0.0.127;
        }

        subnet 192.168.100.0 netmask 255.255.255.0 {
                option routers 192.168.100.xx;
                range 192.168.100.127 192.168.100.200;
        }
}

Il y a donc 2 réseaux, un réseau pour le wifi, avec des IP 10.0.0.x et un autre
réseau avec les ip 192.168.100.x. 

La configuration du dns est tout ce qu'il y a de plus classique. (consulter 
la doc suivante: http://www.openbsd-france.org/documentations/OpenBSD-bind.html)

Configuration du firewall:
Je n'utilise pas le wep, mais je n'ai pas pour autant envie que tout le monde
se connecte à mon réseau. Pour cela, j'utilise un magnifique outil: authpf. 
Les utilisateurs voulant se connecter sur mon réseau wifi, doivent avoir un 
compte sur la gateway, et se logguer en ssh dessus.
Pour cela, j'ai procédé de la maniere suivante:

D'abord, un petit proxy web. Ajouter cette ligne dans votre inetd.conf:
#www proxy
127.0.0.1:5000 stream tcp nowait nobody /usr/bin/nc nc -w 20 192.168.100.xx 8080

On utilise nc pour en faire un petit proxy web, qui redirige toutes les requetes web sur un site se
trouvant sur votre lan, sur le port 8080. Cela vous permet de mettre un joli petit texte sur ce site du style:
"pour utiliser mon réseau wireless, vous devez vous autentifier d'abord via authpf."

Ensuite, la configuration d'authpf:
le fichier authpf.conf doit exister, s'il n'est pas présent, un simple
touch /etc/authpf.conf
ensuite, dans authpf.allow, le nom des utilisateurs qui peuvent se connecter en utilisant authpf
et authpf.message un petit texte (pas utile, mais pratique), du style:

Welcome on xxxxx, the 802.11 OpenBSD's gateway

with this access point you can:
    - http(s)
    - smtp
    - pop3
    - irc

dans /etc/login.conf, créer une classe "wifi":
wifi:\
        :shell=/usr/sbin/authpf:\
        :tc=default:

ensuite, dans le répertoire /etc/authpf/users, vous créez un repertoire par utilisateur que vous souhaitez
voir connecté via authpf. Dans ce repertoire, placer un fichier authpf.rules, avec les regles suivantes:

wifi_if = "wi0"
ext_if = "tun0"
dns_servers = "{ 10.10.10.1 }"

nat on $ext_if from $user_ip to any -> ($ext_if)

no rdr on wi0 proto tcp from $user_ip to any port 80

pass in quick on $wifi_if proto udp from $user_ip to $dns_servers \
    port domain keep state

pass in quick on $wifi_if proto tcp from $user_ip to any port { smtp, pop3 } \
    flags S/SA keep state
pass in quick on $wifi_if proto tcp from $user_ip to port { ssh, http, https } \
    flags S/SA keep state

Ces regles permettent à l'utilisateur de faire du ssh, http, https, pop3 et smtp. On rajoute une regle
également pour le NAT. 

Maintenant la configuration de /etc/pf.conf:
($wi0_if est wi0 chez moi, $int_if est vr0, $priv_nets est 127.0.0.0/8, 10.0.0.0/24, 192.168.100.0/24)

Dans la section "nat/rdr":

rdr-anchor authpf
nat-anchor authpf
### toutes les requetes vers le port 80 sont rdr sur une page locale
rdr on $wi0_if proto tcp from $priv_nets to any port 80 \
        -> 127.0.0.1 port 5000

dans la section network policy:

### authpf pour le wireless
### on laisse passer le dhcp, dns, web et ssh
pass in quick   on $wi0_if  proto tcp          from $wi0_if/24 to $int_if/32  port = 22  flags S/SA keep state
pass in quick   on $wi0_if  proto tcp          from $wi0_if/24 to $loo_if     port = 5000 flags S/SA keep state
pass in quick   on $wi0_if  proto { tcp,udp }  from $wi0_if/24 to $int_if/32  port = 67  keep state
pass in quick   on $wi0_if  proto { tcp,udp }  from $wi0_if/24 to $int_if/32  port = 53  flags S/SA keep state
block in quick  on $wi0_if                     from any        to $wi0_if/24

# OUTGOING: pass all.
pass out quick  on $wi0_if  proto { tcp,udp } from any to $wi0_if/24            keep state
pass out        on $wi0_if  inet proto icmp all keep state

# Appel les regles d'authpf pour l'utilisateur
anchor authpf

maintenant, votre utilisateur n'a plus qu'à se connecter en ssh sur la passerelle, et il pourra ainsi surfer.
Quelqu'un qui essayerai de se connecter sur votre réseau n'aura accès (pour le web) qu'à la page que vous aurez définis
par votre proxy web