Outils pour utilisateurs

Outils du site


informatique_openwrt

Brouillon

FIXME : a terminer !

OpenWRT

Liens:

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!)

  1. Debrancher le routeur du courant
  2. Presser le bouton reset 30 secondes
  3. 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 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:

  1. On utilise le marquage des paquets
  2. 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:

  1. Editer le fichier /etc/init.d/S35firewall
  2. 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:

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=<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.

Ouvrir OpenWrt

Le but de ce chapitre:

  1. Ouvrir l'accès au monde entier, enfin presque.
  2. 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:

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:

  1. telecharger le paquet wget … freeradius-dialupadmin
  2. forcer l'installation du paquet: # dpkg –force-depends -i freeradius-dialupadmin
  3. 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:

  1. accounting
  2. 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:

  1. Creer les tables en important ça: zcat /usr/share/doc/freeradius/examples/mysql.sql.gz
  2. 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"

<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.

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: <IP du client>
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

informatique_openwrt.txt · Dernière modification : 2007/08/07 19:32 de thierry