Ou comment empêcher les air-lutins étrangers de se promener nimporte où dans votre jardin.
Matériel réquis:
Matériel conseillé:
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.
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.
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.
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
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.
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