====== Brouillon ====== FIXME : a terminer ! ====== OpenWRT ====== Liens: * http://openwrt.org/ * http://www.pervasive-network.org/SPIP/Installation-de-chillispot-sur-un,36 Il s'agit de changer le firmware d'un routeur Linksys WRT54G v2.0 ===== Installer firmware ===== ==== Reset du routeur ==== On remet le routeur dans un etat par défaut (parce que je n'ai plus le mot de passe!) - Debrancher le routeur du courant - Presser le bouton reset 30 secondes - Brancher sur le courant en maintenant le bouton reset pendant encore une dizaine de secondes. ==== Version du WRT54G ==== Il existe une demi-dizaine de versions de routeur WRT54G.\\ D'aprés ce [[http://www.linksysinfo.org/forums/showthread.php?t=40167|site]], il suffit de regarder les 4 premières lettres du n° de série: CDF1 = WRT54G v1.0 / ADM6996L Chipset / CPU 125Mhz C'est mon mien ! Un peu vieux, mais je l'aime bien. ==== Loading ==== On choisis l'image: pptp/ * Standard image (web interface, pptp) On telecharge: $ wget http://downloads.openwrt.org/whiterussian/newest/pptp/openwrt-wrt54g-squashfs.bin ( Dans un autre cas, j'ai choisit ''default/'' ) ==== upgrade ==== Brancher le routeur par les ports LAN.\\ Faire pointer son navigateur sur: **''http://192.168.1.1''** (IP en dur!).\\ A la demande du **''user''** taper **''admin''** et la même chose pour le mot de passe.\\ Choisir une mise à jour du **''firmware''** et donner le fichier précédement chargé. ==== Password ==== Une nouvelle interface web apparait, mais on va d'abord mettre un mot de passe: $ telnet 192.168.1.1 ... root@OpenWrt:/# passwd Changing password for root Enter the new password (minimum of 5 characters) Please use a combination of upper and lower case letters and numbers. Enter new password: Re-enter new password: Password changed. root@OpenWrt:/# On peut maintenant se reconnecter avec **''ssh''** ! $ ssh root@192.168.1.1 ... enjoy ! ===== Configurer le reseau ===== Selon un WRT54G v1 ou v2 et plus, on a ça: | Manufacturer | Model | Hardware version | LAN | WAN | WIFI | | Linksys | WRT54G | v1.x | vlan2 | vlan1 | eth2 | | Linksys | WRT54G | v2.x/v3.x/v4.0 | vlan0 | vlan1 | eth1 | D'abord, le routeur s'est attribué lui-même l'IP 192.168.1.1 sur le LAN ! pas bien ! ==== WAN ==== On va activer le WAN avec une IP en dur.\\ Il n'est pas nécessaire de faire: # nvram set wan_ifname=vlan1 Puisque c'est déjà le cas ! # nvram get wan_ifname vlan1 Mais il faut bien faire ça: # nvram set wan_proto=static # nvram set wan_ipaddr=192.168.0.52 # nvram set wan_netmask=255.255.255.0 # nvram set wan_gateway=192.168.0.254 # nvram set wan_dns=192.168.0.50 # nvram set lan_dns=192.168.0.50 L'IP du WAN est **''...52''** et la Freebox est en **''...254''** et on a un DNS en **''...50''**.\\ On sauvegarde dans la NVRAM (sinon, c'est simplement en RAM!) # nvram commit === Autoriser les connexions à SSH via le WAN === # vi /etc/firewall.user Et faire en sorte d'avoir: ### Open port to WAN ## -- This allows port 22 to be answered by (dropbear on) the router iptables -t nat -A prerouting_wan -p tcp --dport 22 -j ACCEPT iptables -A input_wan -p tcp --dport 22 -j ACCEPT === Autoriser l'interface web via le WAN === iptables -t nat -A prerouting_wan -p tcp --dport 80 -j ACCEPT iptables -A input_wan -p tcp --dport 80 -j ACCEPT Et puis: # /etc/init.d/S35firewall ==== LAN ==== On va mettre le LAN dans un réseau étrange: # nvram set lan_ipaddr=10.18.2.1 # nvram set lan_netmask=255.255.255.0 Et toujours: # nvram commit Mais: # ifup lan Et oui, pas besoin de reboot cette fois-ci... mais verifions quand même... ==== LAN libre ==== On est dans la configuration ou le côté WAN appartient en fait à un réseau local, et on veut faire en sorte que le LAN puisse atteindre le reseau WAN sans être NATé !\\ Pour cela, il suffit d'editer le fichier: /etc/init.d/S35firewall Et de faire en sorte de ne pas NATé en POSTROUTING du WAN:\\ (J'ai simplement mis en commentaire) iptables -t nat -A POSTROUTING -j postrouting_rule # TJ ---- # iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE # ---- Et en enfin: # /etc/init.d/S35firewall ==== LAN routé ==== === forcer la route === Le LAN est "libre", mais je veux qu'il atteigne directement une IP par defaut, sans autre possibilité.\\ Installons **''ip''** de **''iproute2''**: # ipkg update # ipkg install ip Ensuite, je fais un petit scripté nommé: **''/etc/init.d/S45iproute''** #!/bin/sh ## TJ ## 25/07/2007 TABLE=200 MARK=0xfff0001 XIP=/usr/sbin/ip WAN="$(nvram get wan_ifname)" GW_IP="192.168.166.1" test -x $XIP || exit 0 case $1 in start) $XIP rule add fwmark $MARK table $TABLE $XIP route add default via $GW_IP dev $WAN table $TABLE $XIP route flush cache ;; stop) $XIP route del default via $GW_IP dev $WAN table $TABLE $XIP route flush cache $XIP rule del fwmark $MARK table $TABLE ;; *) echo "usage: $0 (start|stop)" exit 1 ;; esac exit 0 Explication: - On utilise le **marquage** des paquets - On associe au **marquage** une route vers le "firewall/gateway". Notez que la table numero **''200''** a ete choisit en aveugle, parce que je n'ai pas trouvé l'equivalent de Debian:\\ /etc/iproute2/rt_tables Toutefois, on peut creer ce fichier, et ça marche aussi: cat /etc/iproute2/rt_tables 200 freebox Et voila. Je suis certain que quelques soient l'IP visé, elle sera routé vers le Firewall.\\ Le Firewall peut maintenant controler les echanges avec le reste du réseau. === Firewall === La regle créé ci-dessus, n'est activé qu'a partir du Firewall, on va proceder ainsi: - Editer le fichier **''/etc/init.d/S35firewall''** - marquer ce qui entre par l'interface LAN, et qui n'est pas destine au LAN Ce qui peut faire une regle IpTables de la forme: iptables -t mangle -A PREROUTING -i $LAN -p all -s 192.168.1.0/24 -d ! 192.168.1.0/24 -j MARK --set-mark 0xfff0001 (A adapter au cas par cas) ==== LAN libre 2 ==== Maintenant, je voudrais que tout le WAN puisse atteindre toutes les IP du LAN... mais ou est donc le controle du Firewall ? Il n'y en a plus. Enfin, ce controle est déporté sur un autre Firewall.\\ Bref, il faut editer le fichier: /etc/firewall.user Et ajouter: # TJ iptables -A forwarding_wan -p all -d 10.18.2.0/24 -j ACCEPT Rappel: c'est parce que la gateway va faire un rôle de Firewall. ==== WIFI simple en WPA ==== Lien: * http://wiki.openwrt.org/Faq#head-241867b49a4ff86751c7a12f3120a47bd939b10e Installer le package **''nas''**: # ipkg update # ipkg install nas Fixer le nom du reseau wifi: # nvram set wl0_ssid=tj Le crypto: # nvram set wl0_crypto="aes+tkip" # nvram set wl0_akm="psk psk2" Et le mot de passe super secret: # nvram set wl0_wpa_psk=le_mot_de_passe_super_secret_entre_8_et_63_caracteres Verifier qu'on a bien: # nvram get wl0_wep disabled # nvram get wl0_mode ap Et si on ne veut pas que l'on broadcast le nom du reseau: # nvram set wl0_closed=1 Et a la fin: # nvram commit Pour appliquer la nouvelle configuration du Wifi: # ifup wifi ou si ca ne fonctionne pas: # reboot ===== Trucs ===== ==== Hostname ==== # nvram set wan_hostname=MyHostName ==== A l'heure ! ==== # ipkg install ntpclient Donner l'adresse du serveur **''ntp''**: # nvram set ntp_server= Verifier: # nvram show | grep ntp ntp_enable=1 ntp_server= ntp_mode=auto Et puis: # nvram commit Faire en sorte que ca fonctionne au prochain reboot:\\ Dans **''/etc/init.d/''** , creer un fichier nommé: **''tz''** contenant: #!/bin/sh tz=$(nvram get time_zone) tz=${tz:-"CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00"} echo $tz > /etc/TZ Et faire aussi: # chmod a+x tz Et enfin: /etc/init.d/tz Et voila le fichier **''/etc/TZ''** , permettant enfin a **''date''** de retourner la bonne heure. ====== Ouvrir OpenWrt ====== Le but de ce chapitre: - Ouvrir l'accès au monde entier, enfin presque. - Installer un controle d'accès avec FreeRadius et ChilliSpot ===== Ouvrir le reseau ===== On 2 possibilités, soit on maintient un cryptage WPA (ou WEP, au pire), soit on ne fait aucun cryptage. Dans ce 2ieme cas, voila comment faire: # nvram set wl0_akm=open Et pour etre certain: # nvram set wl0_wpa_psk= # nvram set wl0_crypto= Et enfin: # nvram commit # ifup wifi Côté client sous Windows, supprimer l'ancienne reference au serveur portant le SSID de OpenWrt, sinon, le cryptage est desesperement attendu... et ca marche trés mal. ===== Freeradius ===== On va installer sur un serveur, le service **''FreeRadius''**, que le service **''ChilliSpot''** (chapitre suivant) interrogera pour autoriser les accés Wifi. Liens: * http://www.pervasive-network.org/SPIP/Installation-de-Freeradius-sur-une ==== Installer ==== Pour le serveur # apt-get install freeradius freeradius-mysql Pour l'administration des comptes # apt-get install freeradius-dialupadmin Si vous avez un problème avec **''php5''**, parce que ce paquet exige de maniere deraisonné **''php4''**, voici un petit truc: - telecharger le paquet ''wget ... freeradius-dialupadmin'' - forcer l'installation du paquet: ''# dpkg --force-depends -i freeradius-dialupadmin'' - Editer le fichier ''/var/lib/dpkg/status'' et rechercher la partie concernant le paquet ''freeradius-dialupadmin'' et modifier pour avoir: ''Depends: php4 | php5'' En esperant que cela ne casse pas trop les packages... ==== Configurer ==== On va se placer dans **''/etc/freeradius''** === Cryptage === **''FreeRadius''** préfère **''PAP''**, mais **''ChilliSpot''** ne sait parler que **''CHAP''**.\\ Alors on va mélanger un peu des 2... Dans **''radiusd.conf''** , la section ''modules'' verifier qu'on a: # PAP module to authenticate users based on their stored password pap { # TJ authtype = crypt # encryption_scheme = crypt } # CHAP module chap { authtype = CHAP } === MySQL === Dans **''radiusd.conf''** , la section ''authorize'' verifier qu'on a: # # Read the 'users' file # TJ #files # # Look in an SQL database. The schema of the database # is meant to mirror the "users" file. # # See "Authorization Queries" in sql.conf # TJ sql Et partout on l'on a besoin de taper dans ''mysql'', c'est a dire les sections: - accounting - session Faire: # TJ sql Dans le fichier, **''sql.conf''** avoir quelque chose comme ça: # Connect info server = "localhost" # TJ login = "freerad" password = "le_mot_de_passe" # -- # Database table configuration radius_db = "radius" Et toujours dans le même fichier, plus loin: # # Set to 'yes' to read radius clients from the database ('nas' table) # TJ readclients = yes Ah oui! Il faut creer un compte et les tables dans MySQL ! En gros: - Creer les tables en important ça: ''zcat /usr/share/doc/freeradius/examples/mysql.sql.gz'' - Creer un compte pour utiliser la base On redemarre le **''radius''**: # /etc/init.d/freeradius restart On peut regarder les logs dans ''/var/log/freeradius/'' === Clients === Préparer l'arriver du client local (pour commencer).\\ Editer le ficher **''clients.conf''** et s'assurer qu'on a: client 127.0.0.1 { secret = un_mot_de_passe_entre_radius_et_le_client_local shortname = localhost nastype = other # localhost isn't usually a NAS... } 28,1-8 26% ==== Dialup-Admin ==== === Apache === Installer le service dans apache: (Par exemple) # cat /etc/apache2/sites-available/freeradius-dialupadmin.conf Alias /radius "/var/www/freeradius-dialupadmin" AuthName "Restricted Area" AuthType Basic AuthUserFile /var/www_passwd/.htpasswd_radius require valid-user AllowOverride All order allow,deny allow from 127.0.0.1 allow from 192.168.0.0/24 192.168.1.0/24 Il faut creer un fichier **''.htpasswd_radius''**: # cd /var # mkdir www_passwd # cd www_passwd # htpasswd -c -m .htpasswd_radius root En realité, les pages www sont dans **''/usr/local/dialup_admin/htdocs''** ... a adapter. === dialup-admin === On se place dans **''/etc/freeradius-dialupadmin''**.\\ Editer le fichier **''admin.conf''** et faire en sorte d'avoir: # TJ general_domain: mon-domaine-a-moi.fr ... # TJ general_strip_realms : yes ... # TJ general_test_account_login: test general_test_account_password: le_mot_de_passe_du_compte_test ... # TJ sql_password_attribute: Crypt-Password Dans le doute, editer le fichier **''naslist.conf''** pour avoir: nas1_name: wrt54g.%{general_domain} nas1_model: Wrt54G thierry nas1_ip: nas1_port_num: 16 nas1_community: public === tester === Avec son navigateur, aller dans **''http://.../radius''**, si tout va bien, on saisie un login/password et on arrive sur **''dialup-admin''**.\\ Créer un client, par exemple ''test'' avec le mot de passe entré dans la config.\\ Ceci fait, un test avec **''MySQL''** doit montrer ça: mysql> use radius; mysql> select * from radcheck; +----+----------------------------+----------------+----+------------------------------------+ | id | UserName | Attribute | op | Value | +----+----------------------------+----------------+----+------------------------------------+ | 6 | thierry | Crypt-Password | := | $xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | | 7 | test | Crypt-Password | := | $xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | | 12 | 00-11-22-33-44-55suffix | Crypt-Password | := | $xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | +----+----------------------------+----------------+----+------------------------------------+ 3 rows in set (0.00 sec) Un test avec **''radclient''** en ligne de commande doit aussi etre satisfait. Voila un radius qui semble prêt. ===== ChilliSpot ===== On se place sur le routeur wifi... === DHCP === **''Chillispot''** ayant son propre serveur DHCP, on vire l'existant: # chmod a-x S60dnsmaq # killall dnsmasq === Installer === On va installer **''ChilliSpot''** sur l' **''OpenWrt''** : # ipkg update # ipkg install kmod-tun # ipkg chillispot === Configurer === Editer **''/etc/chilli.conf''** pour avoir: # TJ # pool 192.168.254.192 ... 255 net 192.168.254.192/26 Pour le reseau # TJ # pool dynamique: 192.168.254.224 ... 255 dynip 192.168.254.224/27 Pour la partie d'IP dynamique dans ce reseau # TJ dns1 192.168.0.50 # TJ dns2 192.168.0.50 A priori, le ''dns1'' est ignoré... mais bon... # TJ domain auth.wifi.local # TJ radiusserver1 192.168.0.50 # TJ radiusserver2 192.168.0.50 # TJ radiussecret le_secret_entre_chilli_et_freeradius # TJ dhcpif br0 Pour l'interface a ecouter... # TJ uamserver https://auth.wifi.local/cgi-bin/hotspotlogin.cgi Nous y reviendrons... # TJ uamsecret secret_entre_chilli_et_www # TJ uamallowed proxy1.babygo.fr,proxy2.babygo.fr Pour les serveurs autorisés sans authentification