Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
bsd:ap_wifi_ouvert [2007/01/26 23:16]
semial
bsd:ap_wifi_ouvert [2010/01/12 13:29] (current)
Line 1: Line 1:
 +====== 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:
 +  - une babasse
 +  - une carte wifi
 +  - un *BSD
 +  - pf
 +  - un cerveau
 +
 +Matériel conseillé:
 +  - une amulette porte-bonheur faites avec des morceaux de chemises de loic lemeur
 +  - du [[http://​j-walk.com/​other/​wifispray/​|wifi-spray]]
 +  - 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