TP-Link W9980 sous OpenWrt
Flasher OpenWrt
Connection serie
Pour cela, il faut une communication série avec le routeur. Il faut donc utiliser un adaptateur usb/ttl et brancher tout ça selon ces indications. On est pas obligé de souder, on peut utiliser des connecteur GPIO. Ils sont un peu plus fins donc ça bouge un peu dans les trous. Un moyen que ça tienne et de les plier en deux pour faire plus d'épaisseur. Attention donc de ne pas brancher de cable lié à l'alimentation ! Le dernier accès sur le port noté J7
de la board doit être vide (celui qui est détouré de manière carrée en circuit imprimé et qui est encadré en blanc).
Pour se connecter, utiliser putty
et mettre comme paramètres :
serial line : /dev/ttyUSB0 speed : 115200 data bits : 8 stop bits : 1 parity : none flow control : none
Lancer la connection puis allumer la machine. Dans la console série, il va s'afficher ceci :
ROM VER: 1.1.4 CFG 05 ROM VER: 1.1.4 CFG 05 DDR autotuning Rev 1.0 DDR size from 0xa0000000 - 0xa3ffffff DDR check ok... start booting... U-Boot 2010.06-svn9352-LANTIQ-v-2.3.08 (Dec 15 2014 - 11:05:49) CLOCK CPU 500M RAM 250M DRAM: 64 MiB Using default environment In: serial Out: serial Err: serial Net: Internal phy(GE) firmware version: 0x8434 vr9 Switch8192 KiB W25Q64 at 0:3 is now current device MAC: 30-b5-c2-cb-14-1d run "flash_flash" to bring up the kernel Hit any key to stop autoboot: 2
Il faut donc appuyer sur n'importe quelle touche pour stopper le boot et pour que la machine ne démmarre pas sur le firware propriétaire TP-Link. On arrive donc à un prompt de la sorte :
VR9 #
Préparer le flash du firmware
Il faut ensuite suivre les indications qui sont dans la section de cette page. Ltechnique de flasher directement la mémoire flash avec le firmware openwrt est interessante car au moins, on l'a à disposition (ici)
Il faut donc télécharger ce fichier sur sa machine, on dira dans /home/user/
.
Sur sa machine, il faut installer un serveur TFTP. Sous Debian, c'est comme ceci :
sudo apt-get install tftpd
Ensuite, il faut regarder le chemin qu'utilise tftpd pour stocker et servir les fichiers pour les clients TFTP qui s'y connecteraient. Ceci se trouve dans le fichier /etc/inetd.conf
. Chez moi j'ai cette ligne :
tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /srv/tftp
Ce qui veut dire que je dois mettre les fichiers à disposition dans le répertoire /srv/tftp
. Ça peut être ailleurs, pour cela, il suffit de modifier /srv/tftp
en ce que l'on veut.
Ensuite on va donc mettre le fichier téléchargé précédemment dans ce répertoire :
sudo mkdir /srv/tftp cd /home/user sudo cp openwrt-lantiq-xrx200-TDW8970-sysupgrade.image /srv/tftp/firmware-tdw8970.image
Il faut enfin configurer notre connection réseau pour la transmission du fichier au routeur. Pour cela, configurer une connection filaire avec ces paramètres :
IP fixe : Adresse : 192.168.1.100 Masque : 255.255.255.0 Passerelle : 192.168.1.1
Se déconnecter du wifi ou de toute autre connexion réseau pour éviter des erreurs d'adressage IP ou de routes.
Procédure de flash
On retourne sur l'interface de la console série et on va configurer les adresse IP du routeur en tappant ces commandes :
setenv ipaddr 192.168.1.1 setenv serverip 192.168.1.100 setenv bootargs 'board=WD9980'
Puis on charge le firware dans la RAM, on efface le rootfs de la flash et on écrit l'image sur la flash. Enfin, on redemmare et normalement ça va booter sur OpenWrt !
tftpboot 0x80800000 firmware-tdw8970.image sf erase 0x20000 0x7a0000 sf write 0x80800000 0x20000 0x680004 reset
Configurations de OpenWrt
On va configurer OpenWrt pour travailler plus facilement et lui donner un accès Internet via notre box en attendant que le DSL soit disponible. Pour cela, on peut rester sur la connection serie, ce qui évitera de se couper l'herbe sous le pied.
À la première connection, on va déjà modifier le mot de passe de root :
passwd
Ensuite, on va faire un peu de réseau pour donner l'accès Internet sur le port noté LAN4/WAN
et mettre le LAN sur les autres ports (LAN 1,2 et 3).
Cela permettra d'avoir un accès Internet sur le routeur si on laisse notre machin-box branchée. On pourra mettre à jour, télécharger des drivers, installer des paquets…
Éditer le fichier /etc/config/network
(vim /etc/config/network
, il faut donc savoir comment utiliser vim
ou vi
) :
config interface 'loopback' option ifname 'lo' option proto 'static' option ipaddr '127.0.0.1' option netmask '255.0.0.0' config globals 'globals' option ula_prefix 'fd33:ef02:86c7::/48' config interface 'wan' option proto 'dhcp' option type 'bridge' option ifname 'eth0.1' config interface 'lan' option proto 'static' option netmask '255.255.255.0' option ipaddr '192.168.2.1' option _orig_ifname 'eth0.1' option ifname 'eth0.2' config switch option name 'switch0' option reset '1' option enable_vlan '1' config switch_vlan 'eth0_1' option device 'switch0' option vlan '1' option vid '1' option ports '4 6t' config switch_vlan 'eth0_2' option device 'switch0' option vlan '2' option vid '2' option ports '0 2 5 6t'
Editer le fichier /etc/config/firewall
et y mettre :
config defaults option syn_flood '1' option input 'ACCEPT' option output 'ACCEPT' option forward 'REJECT' config zone option name 'lan' option input 'ACCEPT' option output 'ACCEPT' option forward 'ACCEPT' option network 'lan' option masq '1' config zone option name 'wan' option output 'ACCEPT' option masq '1' option mtu_fix '1' option input 'REJECT' option forward 'REJECT' config forwarding option src 'lan' option dest 'wan' config rule option name 'Allow-DHCP-Renew' option src 'wan' option proto 'udp' option dest_port '68' option target 'ACCEPT' option family 'ipv4' config rule option name 'Allow-Ping' option src 'wan' option proto 'icmp' option icmp_type 'echo-request' option family 'ipv4' option target 'ACCEPT' config rule option name 'Allow-DHCPv6' option src 'wan' option proto 'udp' option src_ip 'fe80::/10' option src_port '547' option dest_ip 'fe80::/10' option dest_port '546' option family 'ipv6' option target 'ACCEPT' config rule option name 'Allow-ICMPv6-Input' option src 'wan' option proto 'icmp' list icmp_type 'echo-request' list icmp_type 'echo-reply' list icmp_type 'destination-unreachable' list icmp_type 'packet-too-big' list icmp_type 'time-exceeded' list icmp_type 'bad-header' list icmp_type 'unknown-header-type' list icmp_type 'router-solicitation' list icmp_type 'neighbour-solicitation' list icmp_type 'router-advertisement' list icmp_type 'neighbour-advertisement' option limit '1000/sec' option family 'ipv6' option target 'ACCEPT' config rule option name 'Allow-ICMPv6-Forward' option src 'wan' option dest '*' option proto 'icmp' list icmp_type 'echo-request' list icmp_type 'echo-reply' list icmp_type 'destination-unreachable' list icmp_type 'packet-too-big' list icmp_type 'time-exceeded' list icmp_type 'bad-header' list icmp_type 'unknown-header-type' option limit '1000/sec' option family 'ipv6' option target 'ACCEPT' config include option path '/etc/firewall.user'
On ajoute les serveurs DNS de FDN et LDN pour le LAN
uci add_list dhcp.lan.dhcp_option="6,80.67.169.12,80.67.188.188" uci commit dhcp
On branche le port LAN4/WAN
à la box, on branche notre machine à un des ports libres.
On relance le réseau : /etc/init.d/network restart
et maintenant, le port 4 devrait reccupérer une IP depuis la box, notre machine devrait reccupérer une IP de la forme 192.168.2.xxx
depuis le routeur. On test depuis la console série : ping www.google.com
et depuis notre machine ping www.google.com
et ça devrait pinguer.
Quelques pages sur le sujet :
http://wiki.openwrt.org/toh/tp-link/td-w8980
http://wiki.openwrt.org/toh/tp-link/td-w8970
Rootfs sur cléUSB
Deux bonnes pages sur le sujet ici et là.
Étant donné que l'espace disponible pour installer des paquets d'OpenWrt est relativement restreint sur l'espace flash du routeur, on va installer la raçine du système (rootfs) sur une cléUSB branchée à l'arrière du routeur. Pour cela, il faut commencer par installer des paquets qui vont bien :
opkg update opkg install fdisk kmod-usb-core kmod-usb2 usbutils block-mount kmod-usb-storage kmod-fs-ext4
Redémmarer le routeur et pendant ce temps, formater sa clé au format de fichier ext4. Puis brancher la clé à l'arrière du routeur après redemmarrage.
Si nous sommes en accès série, on devrait voir des choses qui se passent lors de l'insertion de la clé. Pour vérifier que la clé est bien présente et reconnue par OpenWrt, lancer ces commandes :
lsusb fdisk -l
La dernière commande devrait nous donner le nom de device de la clé (par exemple /dev/sda1
)
On va maintenant monter la clé et copier tout le système de fichiers dessus :
mkdir /mnt/cleusb mount /dev/sda1 /mnt/cleusb mkdir -p /tmp/cproot mount --bind / /tmp/cproot tar -C /tmp/cproot -cvf - . | tar -C /mnt/cleusb -xf - umount /tmp/cproot
On configure maintenant fstab
pour monter au démmarrage en éditant le fichier /etc/config/fstab
pour y voir ces lignes :
config mount option target / option device /dev/sda1 option fstype ext3 option options rw,sync option enabled 1 option enabled_fsck 0
Rebooter et checker en lançant la commande df -h
et voir qu'on a maintenant ceci :
Filesystem Size Used Available Use% Mounted on rootfs 7.1G 35.3M 6.7G 1% /
et mount
nous donne :
/dev/sda1 on / type ext4 (rw,relatime,data=ordered)
Faire marcher le VDSL
Pour cela, il va falloir installer un firmware proprietaire. Pour cela, un script est prévu dans l'image (/sbin/vdsl_fw_install.sh
).
On va modifier un peu le début du fichier pour qu'il ressemble à ça :
#!/bin/sh . /lib/functions.sh FW="/tmp/Firmware_Speedport_W921V_1.21.000.bin" URL="http://hilfe.telekom.de/dlp/eki/downloads/Speedport/Speedport%20W%20921V/Firmware_Speedport_W921V_1.21.000.bin" FW_TAPI="vr9_tapi_fw.bin" FW_DSL="vr9_dsl_fw_annex_b.bin" MD5_FW="0a099d08dbf091c74d685b532cbb1390" MD5_TAPI="06b6ab3481b8d3eb7e8bf6131f7f6b7f" MD5_DSL="59dd9dc81195c6854433c691b163f757"
Et ensuite on lance ce script qui va télécharger le firmware pour le VDSL et l'installer au bon endroit :
/sbin/vdsl_fw_install.sh
On va ensuite mettre la bonne configuration dans le fichier /etc/config/network
:
config vdsl 'dsl' option annex 'a' option firmware '/lib/firmware/vdsl.bin' option tone 'av' option xfer_mode 'ptm' config atm-bridge 'atm' option unit '0' option atmdev '0' option encaps 'llc' option payload 'bridged' option vci '35' option vpi '8'
Enfin, il faut configurer l'interface WAN pour qu'elle puisse utiliser ce DSL et permettre aux autres machines branchées sur le LAN de joindre Internet. Du coup, on va modifier notre configuration précédente pour l'interface WAN :
config interface 'wan' option ifname 'ptm0.835' option proto 'pppoe' option ipv6 '1' option username 'fti/xxxxxxxxx' option password 'xxxxxxx' config interface 'wan6' option ifname '@wan' option proto 'dhcpv6'
On remarquera que c'est ici que l'on met nos identifiants de connexion de notre fournisseur d'accès Internet. Cette conf correspond à Orange : on utilise le Vlan 835 (d'où l'interface ptm0.835
)
Client OpenVpn
Le but est d'installer un client OpenVpn pour faire profiter tout le LAN d'une connexion VPN par un vrai fournisseur d'accès Internet : Rézine.
Installer les paquets qui vont bien :
opkg update opkg install openvpn-openssl wget
Ajouter dans le fichier /etc/config/network
ces lignes :
config interface 'VPN' option proto 'none' option ifname 'tun0'
Se placer dans le répertoire des configs d'OpenVPN et y mettre le certificat de Rézine :
cd /etc/openvpn wget www.rezine.org/documentation/tunnels_chiffres/tunnel.rezine.org.pem
Créer un fichier /etc/openvpn/vpn-id.cnf
contenant l'utilisateur vpn et le mot de passe sur deux lignes :
vpn87 Ceciestlemotdepasseduvpn==
Créer un fichier de conf pour openvpn /etc/openvpn/vpn-conf.ovpn
et y mettre dedans :
client dev tun proto tcp resolv-retry infinite remote tun.rezine.org 443 nobind persist-key persist-tun script-security 2 cipher BF-CBC comp-lzo auth-user-pass /etc/openvpn/vpn-id.cnf ca /etc/openvpn/tunnel.rezine.org.pem verb 3
(pour utiliser le port 1194, remplacer proto tcp
par proto udp
et remote tun.rezine.org 443
par remote tun.rezine.org 1194
)
Modifier le fichier /etc/config/openvpn
pour que le début ressemble à ça :
################################################# # Sample to include a custom config file. # ################################################# config openvpn custom_config # Set to 1 to enable this instance: option enabled 1 # Include OpenVPN configuration option config /etc/openvpn/vpn-conf.ovpn
Il faut bien vérifier que toutes les lignes du fichier contenant option enable
soit bien à zéro (sauf celle-ci)
Maintenant, on peut lancer les commandes suivantes pour tester puis redemmarer pour voir si tout se lance bien au boot (parfois le montage de l'interface tun0
peut prendre du temps, c'est normal.
/etc/init.d/network restart /etc/init.d/openvpn stop /etc/init.d/openvpn start
On vérifie que l'interface est bien montée avec ifconfig
et on vérifie que les routes sont bonnes avec route
. On devrait alors avoir un truc du genre :
Destination Gateway Genmask Flags Metric Ref Use Iface default gw-tun.rezine.o 0.0.0.0 UG 0 0 0 tun0 192.168.1.0 * 255.255.255.0 U 0 0 0 br-wan 192.168.2.0 * 255.255.255.0 U 0 0 0 eth0.2 193.33.56.0 * 255.255.255.0 U 0 0 0 tun0 193.33.56.28 192.168.1.1 255.255.255.255 UGH 0 0 0 br-wan
Il y a un bug après l'utilisation du vpn : le reboot ne marche plus depuis une console car le vpn monté l'empêche. Pour cela, il faut rentrer ces commandes pour permettre le reboot ou l'arrêt :
ps | grep openvpn | head -n 1 | awk '{print $1}' | xargs kill -9 reboot
Pour me contacter : julpec@gresille.org