Création d'un point d'accès wifi ouvert mais protègé grâce à pf

Ou comment empêcher les air-lutins étrangers de se promener nimporte où dans votre jardin.

Matériel réquis:

  1. une babasse
  2. une carte wifi
  3. un *BSD
  4. pf
  5. un cerveau

Matériel conseillé:

  1. une amulette porte-bonheur faites avec des morceaux de chemises de loic lemeur
  2. une photo de pinpin

Introduction

Dans ce how-to nous allons faire un point d'accès ouvert, permettant à nimporte qui de se connecter mais en filtrant les ports utilisés par les ordinateurs connectés à l'AP. Nous installerons aussi un squid et un dnsmasq respectivement pour le cache http et dns. Pour cela, nous allons utiliser un pc avec NetBSD-4 muni d'une carte wifi atheros et d'une carte ethernet. Certaines commandes *peuvent* ne pas être valide avec d'autres BSD/autres cartes.

Nous supposerons 2 sous-réseaux, 192.168.1.0/24 le réseau câblé connecté à un modem adsl, et 192.168.2.0/24 le sous réseau comprenant les peers connectés au réseau wifi. Nous supposerons aussi que le futur point d'accès wifi est déjà correctement configuré au niveau du réseau câblé au niveau des dns, route tout ça. L'ip du serveur sur l'interface câblée sera 192.168.1.40 et sur le sans fil ce sera 192.168.2.1.

Préparation

Commencez par installer la catapulte à airlutins dans votre babasse, et configurez là ainsi:

ifconfig macarte0 ssid MONSSID mediaopt hostap 192.168.2.1 up

Voilà, maintenant les GENS peuvent se connecter à votre AP mais ils ne vont pas pouvoir faire grand chose…

Nous allons aussi avoir besoin de pf, faire:

modload /usr/lkm/pf.o # pour cette session

Et pour loader pf au boot, ajouter lkm=YES au /etc/rc.conf et mettre ceci dans le /etc/lkm.conf

/usr/lkm/pf.o - - - - BEFORENET

Ceci est valide pour NetBSD, pour OpenBSD et FreeBSD je ne sais pas.

Configuration du dhcpd

Supposons 2 ordinateurs nous appartennant qui vont accèder au réseau wifi, dénommés lutin et pinpin. Comme nous avons le contrôle sur ces ordinateurs, nous souhaitont qu'ils aient le droit d'utiliser tous les ports sur le réseau. Nous allons leur attribuer des adresses ip dans une range spéciale, allant de 192.168.2.2 à 192.168.2.10 pour laquele pf autorisera tous les ports. Le dhcpd identifiera ces ordinateurs par leurs adresses mac.

Voici le dhcpd.conf utilisé:

default-lease-time 60000;
max-lease-time 72000;

authoritative;
ddns-update-style none;
log-facility local7;

subnet 192.168.1.0 netmask 255.255.255.0 {
  option domain-name-servers 192.168.1.40;
  option routers 192.168.1.1; # 192.168.1.1 = modem adsl
  range 192.168.1.100 192.168.1.150;
  # votre conf pour le subnet 192.168.1.0/24
}

subnet 192.168.2.0 netmask 255.255.255.0 {
  option domain-name-servers 192.168.2.1;
  option routers 192.168.2.1;
  range 192.168.2.100 192.168.2.150;

  host pinpin {
    hardware ethernet DE:AD:BE:EF:42:42; # adresse mac de pinpin
    fixed-address 192.168.2.10; # ip assignee à pinpin
  }

  host lutin {
    hardware ethernet 00:01:02:03:04:05;  
    fixed-address 192.168.2.9;
  }
}

Voilà, maintenant, lancez le dhcpd avec:

/etc/rc.d/dhcpd start

Vous pouvez automatiser son lancement en faisant:

echo dhcpd=YES >> /etc/rc.conf

Maintenant, sur pinpin, connectez-le à l'AP avec le ssid qui va bien et faites un

dhclient interfacewifidepinpin

Et *théoriquement*, le dhcpd donnera à pinpin l'ip telle que spécifiée dans le dhcpd.conf

Si pinpin ne reçoit pas d'ip vérifiez que le dhcpd est lancé et que pinpi est sur le bon réseau wifi.

Si il reçoit une mauvaise ip vérifiez que vous avez entré la bonne adresse mac dans le dhcpd.conf.

Dans tous les casm vérifiez que votre amulette est bien faite de morceaux de chemises et non pas de morceaux de caleçons.

Configuration de squid

Installons squid (NetBSD):

cd /usr/pkgsrc/www/squid
make install clean

Passons à la configuration de squid, à mettre dans /usr/pkg/etc/squid/squid.conf :

http_port 3128 transparent
cache_dir null /tmp
cache_access_log /usr/local/squid/logs/access.log
cache_log /usr/local/squid/logs/cache.log
ftp_user squid@
ftp_passive off

# redirect_program /usr/local/squid/redirect.pl

hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
cache_mem 128 MB

maximum_object_size 80000 KB
# ipcache_size 1024
# ipcache_low 90
# ipcache_high 95
cache_dir ufs /usr/local/squid/cache 2000 16 256 # paramètres du cache voir la doc de squid

acl all src 192.168.0.0/255.255.0.0 # on autorise tout le réseau local à y accèder
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl SSL_ports port 443 563
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443 563     # https, snews
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

http_access allow all
http_reply_access allow all

Maintenant, on va copier le script d'init de squid dans rc.d:

cp /usr/pkg/share/examples/rc.d/squid /etc/rc.d/squid

Sous netbsd, le port de squid a un bug, il faut créer manuellement les répértoires suivant:

mkdir -p /usr/local/squid/{cache,logs}/

Lançons squid:

/etc/rc.d/squid create-dirs # crée les répértoires de cache
/etc/rc.d/squid start

Pour le lancer au boot:

echo squid=YES >> /etc/rc.conf

Configuration de pf

Dans /etc/pf.conf

ext_if="wm0" # interface ethernet
int_if="ath0" # interface  wifi
# il y a des ip en plus dans la table gentils au cas ou on voudrait ajouter une machine aux gentils.
table <gentils> { 192.168.2.1, 192.168.2.2, 192.168.2.3, 192.168.2.4,\
 192.168.2.5, 192.168.2.6, 192.168.2.7, 192.168.2.8, 192.168.2.9, 192.168.2.10 }
table <inconnus> { 192.168.2.100, 192.168.2.101, 192.168.2.102, 192.168.2.103,\
  192.168.2.104, 192.168.2.105, 192.168.2.106, 192.168.2.107, 192.168.2.108,\
  192.168.2.109, 192.168.2.110, 192.168.2.111, 192.168.2.112, 192.168.2.113,\
  192.168.2.114, 192.168.2.115, 192.168.2.116, 192.168.2.117, 192.168.2.118,\
  192.168.2.119, 192.168.2.120, 192.168.2.121, 192.168.2.122, 192.168.2.123,\
  192.168.2.124, 192.168.2.125, 192.168.2.126, 192.168.2.127, 192.168.2.128,\
  192.168.2.129, 192.168.2.130, 192.168.2.131, 192.168.2.132, 192.168.2.133,\
  192.168.2.134, 192.168.2.135, 192.168.2.136, 192.168.2.137, 192.168.2.138,\
  192.168.2.139, 192.168.2.140, 192.168.2.141, 192.168.2.142, 192.168.2.143,\
  192.168.2.144, 192.168.2.145, 192.168.2.146, 192.168.2.147, 192.168.2.148,\
  192.168.2.149, 192.168.2.150 } # on peut pas faire de range d'ip dans pf donc entre toutes les ip.

set skip on lo # on filtre pas lo

# on crée le NAT du subnet wifi en direction de l'interface ethernet  
nat pass on $ext_if from $int_if:network to any -> $ext_if
# on redirige le traffic http vers un squid transparent
rdr on $int_if proto tcp from $int_if:network to any port 80 -> 127.0.0.1 port 3128
# on autorise le port de squid
pass in quick on $int_if proto tcp from $int_if:network to 127.0.0.1 port 3128 keep state
block in on $int_if # par défaut on bloque tout sur le réseau wifi
# on autorise que certains ports tcp aux inconnus
pass in quick on $int_if proto tcp from <inconnus> to any port { ssh, domain, http, https, smtp, imap, imaps, pop3, pop3s } flags S/SA keep state
# on ouvre tout pour les gentils (lutin et pinpin)
pass in quick on $int_if proto tcp from <gentils> to any  flags S/SA keep state
# tous les ports udp et icmp ouverts à tous.
pass in quick on $int_if proto {udp, icmp} all keep state

Application des rules pf:

pfctl -f /etc/pf.conf

Maintenant, les inconnus sont filtrés et tout le traffic web est dirigé sur le squid.

Configuration du dnsmasq

Installation (NetBSD):

cd /usr/pkgsrc/net/dnsmasq/
make install clean
cp /usr/pkg/share/examples/rc.d/dnsmasq /etc/rc.d/dnsmask
echo dnsmask=YES >> /etc/rc.conf

Configuration (/usr/pkg/etc/dnsmasq.conf):

domain-needed
bogus-priv
expand-hosts

domain=mondomaine.prout

cache-size=150

Notez qu'il est inutile de spécifier les dns de votre FAI à dnsmasq, il ira les chercher dans le resolv.conf.

Démarrez dnsmasq:

/etc/rc.d/dnsmasq start

Et voilà ! Votre aéroport à air-lutins est ouvert à tous les lutins, mais sécurisé pour ceux qui ne montrent pas patte blanche.

Note: spoofer une adresse mac c'est relativement facile, et si le méchant hacker se configure en ip fixe et prend une ip dans la range des gentils, il aura effectivement accès à tous les ports. Mais encore faut-il qu'il trouve quelle ip prendre pour ne pas être bloqué etc. Ce n'est donc pas très sécure, c'est surtout une protection contre les GENS pour pas qu'ils ne sucent toute votre bande passante avec leur p2p de méchant pirate de l'internet. Une meilleure solution aurait été de faire 2 ssid à l'aide de 2 cartes avec un ouvert et un fermé, ou alors, si vous n'avez pas de machines, de filtrer les ports de toutes les adresses sur le sous-réseau wifi.

Micro-tip bash pour générer une table pf avec une range d'ip:

echo -n "table <nom-de-la-table> { "; for i in `seq debut_range fin` ; do echo -n 192.168.2.$i", " ; done ; echo -e "\b\b }"

mial

bsd/ap_wifi_ouvert.txt · Last modified: 2010/01/12 13:29 (external edit)