: a terminer !
Liens:
Il s'agit de changer le firmware d'un routeur Linksys WRT54G v2.0
On remet le routeur dans un etat par défaut (parce que je n'ai plus le mot de passe!)
Il existe une demi-dizaine de versions de routeur WRT54G.
D'aprés ce 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.
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/
)
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é.
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 !
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 !
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
# 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
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
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…
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
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:
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.
La regle créé ci-dessus, n'est activé qu'a partir du Firewall, on va proceder ainsi:
/etc/init.d/S35firewall
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)
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.
Lien:
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
# nvram set wan_hostname=MyHostName
# ipkg install ntpclient
Donner l'adresse du serveur ntp
:
# nvram set ntp_server=<IP_du_serveur_NTP>
Verifier:
# nvram show | grep ntp ntp_enable=1 ntp_server=<IP_du_serveur_NTP> 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.
Le but de ce chapitre:
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.
On va installer sur un serveur, le service FreeRadius
, que le service ChilliSpot
(chapitre suivant) interrogera pour autoriser les accés Wifi.
Liens:
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:
wget … freeradius-dialupadmin
# dpkg –force-depends -i freeradius-dialupadmin
/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…
On va se placer dans /etc/freeradius
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 }
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:
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:
zcat /usr/share/doc/freeradius/examples/mysql.sql.gz
On redemarre le radius
:
# /etc/init.d/freeradius restart
On peut regarder les logs dans /var/log/freeradius/
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%
Installer le service dans apache: (Par exemple)
# cat /etc/apache2/sites-available/freeradius-dialupadmin.conf Alias /radius "/var/www/freeradius-dialupadmin" <Directory /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 </Directory>
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.
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: <IP du client> nas1_port_num: 16 nas1_community: public
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.
On se place sur le routeur wifi…
Chillispot
ayant son propre serveur DHCP, on vire l'existant:
# chmod a-x S60dnsmaq # killall dnsmasq
On va installer ChilliSpot
sur l' OpenWrt
:
# ipkg update # ipkg install kmod-tun # ipkg chillispot
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