OpenWRT

Hardware

Cheat sheet

Gestionnaire de packet:
# Le update et upgrade
opkg update
opkg upgrade

# Installation/Configuration
opkg install <pkg>

# Nettoyage
opkg remove <pkg>

# Recherche
opkg list  # Liste tous les packets du repo
opkg search # Fait une recherche

Il faut mettre sa clé SSH public pour DropBear(fichier /etc/dropbear/authorized_keys)

OpenWRT on badass hardware

OpenWRT in Qemu, le sumum de la beaute :)

Acces a l'admin depuis le WAN

Pour acceder a SSH et a l'interface web depuis l'exterieur, on fait ca:
export WAN=eth1

iptables -t nat -A prerouting_rule -i $WAN -p tcp --dport 22 -j ACCEPT
iptables        -A input_rule      -i $WAN -p tcp --dport 22 -j ACCEPT

iptables -t nat -A prerouting_rule -i $WAN -p tcp --dport 80 -j ACCEPT
iptables        -A input_rule      -i $WAN -p tcp --dport 80 -j ACCEPT

iptables -t nat -A prerouting_rule -i $WAN -p tcp --dport 443 -j ACCEPT
iptables        -A input_rule      -i $WAN -p tcp --dport 443 -j ACCEPT

Packets standards

Voici les packets a installer pour transformer OpenWRT en distrib complete:

  • Tools
    • vim-full
    • less
    • htop
    • bash
    • iperf
    • mtr
    • ncat
    • ncat-ssl
    • netperf
    • pciutils
    • screen
    • sfdisk
    • socat
    • ss
    • unrar/unzip/tar/xz
    • tcpdump
    • zsh
    • wget
  • System
    • ip
    • coreutils-*
    • tc
  • Advanced
    • monit
    • vnstat
    • collectd
    • snmpd
  • Services
    • bind
    • uhttpd/apache/nginx
    • luci-*
    • openvpn
    • keepalived
    • sslh
    • polipo
    • squid
    • tor
  • Other
    • python

Architecture Qemu

  • Hyperviseur - eth0: Main interface - virbr1: net1 - virbr2: net2

Les bonnes configs

Cette partie représente une piste pour les bonnes pratiques. Elle s'appuie sur des conventions, et des configurations.

OverView

  • DNS: Gestion des DNS locaux avec FQDN et résolution sans FQDN
  • SSH: Administration sécurisée
  • HTTPS: Administration sécurisée en interne et externe
  • DHCP: Configuration globale, options pratiques
  • NTP: Bah c'est bien d'avoir des machines à l'heure :-)
  • UPnP: C'est toujours pratique

Conventions

  • Ouverture de ports:
    • Ports bas niveau: réservé à l'administrateur
    • Ports privés NAT: dans le range 2xxyy ou 3xxyy ou 4xxyy ou 5xxyy
      • où xx: deux derniers chiffres de l'IP du client
      • où yy: deux derniers chiffres du protocole
    • Ports UPnP: autoriser partout sauf dans les ranges 0-1024 et 30000-39999
  • Attribution des IPs:
    • 1-19: services internes, serveurs, pour l'admin, IP via DHCP (static lease) ou IP statique
    • 20-99: attribution via DHCP avec un enregistrement MAC statique (client lambda enregistré)
    • 100-199: attribution automatique via DHCP (client lambda)
    • 199-220: Zone pour faire tests client avec IP statique (sans DHCP)
  • Stop 192.168.0.0/24 et 192.168.1.0/24 et 192.168.254.0/24 ... y'a d'autres numéros, non? Et puis c'est plus pratique si vous avez plusieurs réseaux locaux ou si vous faites des tests avec d'autres routeurs ...

L'accès SSH

Un pour l'interne, et un pour l'externe, le tout avec DropBear:
root@router:/# cat /etc/config/dropbear

config dropbear
	option PasswordAuth 'on'
	option Port '22'
	option Interface 'lan'

config dropbear
	option Interface 'wan'
	option Port '30122'
	option PasswordAuth 'off'

On rajoute les clés SSH qui vont bien:

root@router:/# cat /etc/dropbear/authorized_keys
ssh-rsa AAAAB3NzaC...DxH0RwZwWYSmUsQW7 jez@montopdomaine.com

L'environnement

Moi, j'aime pas laisser les trucs par défaut. Voila de la petite config pour simplement rendre votre système un peu plus admin-friendly.

On installe les packets suivants (attention à votre espace disque):
opkg install vim-full # Pitié, faut pas déconner
opkg install htop # classique
opkg install less # un pager, c'est toujours utile
opkg install netcat # vrai utilitaire netcat
Dans le fichier /etc/profile, on met quelques alias qui vont bien, du prompt, et de la coloration:

# Les bon alias
alias ls='ls --color=auto'
alias dir='dir --color=auto'
alias vdir='vdir --color=auto'
alias grep='grep --color=auto'

alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'

# Prompt
PS1='\[\033[0;31m\]\u\[\033[0;32m\]@\[\033[0;32m\]\h\[\033[0m\]:\w# \e[0m'

# OPKG coloration
opkg () {
	BOLD=$(echo -e '\033[35;1m');
	NORM=$(echo -e '\033[0m');
	COL="no";
	for arg in $*; do
		if [ $arg == "whatdepends" -o $arg == "list" \
		-o $arg == "list-installed" -o $arg == "list-upgradable" \
		-o $arg == "list-changed-conffiles" -o $arg == "status" \
		-o $arg == "info" -o $arg == "find" ]; then
			COL="yes";
			break;
		fi
	done
	if [ $COL == "yes" ]; then
		# (|\t*) added for 'whatdepends'
		/bin/opkg $* | sed -re "s/^(|\t*)[a-z0-9-]*/$BOLD&$NORM/g";
	else
		/bin/opkg $*;
	fi
}

Le DNS

L'idée est d'avoir un domaine pour l'IP principale de sortie, un hostname pour chaque membre du réseau, une résolution simple avec FQDN et sans FQDN.

Le DNS Dynamique

Bon, c'est relativement simple, coté serveur, on génère la clé, puis on crée la configue dans le fichier /etc/bind/named.conf.local:

$ dnssec-keygen -C -a hmac-md5 -b 512 -n HOST sub.xxx.im
$ cat Ksub.xxx.im.+157+29592.key
sub.xxx.im. IN KEY 512 3 157 gtkjVIwTNkiVorPh1CZjIMaPi/Qib5HfRbw9ZVpfvyb9+HwpHGghtyww dWVcqRG3m5gg6FggTCggsdGbHTJwoV/Q==
// DNSSec Keys config
///////////////
key "sub.xxx.im." {
        algorithm hmac-md5;
        secret "gtkjVIwTNkiVorPh1CZjIMaPi/Qib5HfRbw9ZVpfvyb9+HwpHGghtyww dWVcqRG3m5gg6FggTCggsdGbHTJwoV/Q==";
};


// Main domains
///////////////

zone "xxx.im" {
        type master;
        file "/etc/bind/zones/xxx.im";

        // DynDNS update
        update-policy {
                grant sub.xxx.im. name sub.xxx.im. A TXT;
        };
};
Sur OpenWRT, on doit copier les clés privées (ici, je les ai mises dans /etc/bind/keys/) et on fait un script hotplug:
root@router:/# cat /etc/hotplug.d/iface/30-nsupdate
[ "$INTERFACE" != "wan" ] && ( [ "$ACTION" != "ifup" ] || [ "$ACTION" != "update" ] ) && exit 0

# Parameters
KEY='/etc/bind/keys/client.key'
SERVER='jeznet.org'
ZONE='xxx.im.'
DOMAIN='sub.xxx.im.'
TTL='3600'

# Get current wan IP
. /lib/functions/network.sh
network_get_ipaddr IPADDR wan
echo "Updating domain $DOMAIN to $IPADDR on $SERVER"

# Build and send DNS update query
echo "server $SERVER
zone $ZONE
update delete $DOMAIN A
update add $DOMAIN $TTL A $IPADDR
show
send" | nsupdate -k $KEY
Si vous voulez une version un peu plus sofistiquée, qui installe un cron et le script hotplug, il y'a mon préféré, c'est quand même le script d'init :D Attention, c'est du fait maison:
root@router:/etc/init.d# cat dyndns
#!/bin/sh /etc/rc.common
# Dynamic DNS with Bind9 client
# BSD License

# Script parameters
START=10
STOP=15
SCRIPT_PATH=/etc/init.d/dyndns
CRON_PATH=/etc/crontabs/root
CRON_REFRESH='*/5 *'
HOTPLUG_PATH=/etc/hotplug.d/iface
HOTPLUG_NAME=30-dyndns-update

# Parameters
KEY='/etc/bind/keys/client.key'
SERVER='jeznet.org'
ZONE='xxx.im.'
DOMAIN='sub.xxx.im.'
TTL='3600'

# Libraries
dyndns_enable_cron() {
	sed -e "/InitFlag/ d" -i $CRON_PATH
	echo "$CRON_REFRESH  * * *  $SCRIPT_PATH reload # InitFlag -- Do not delete this ..." >> $CRON_PATH
}
dyndns_disable_cron() {
	sed -e "/InitFlag/ d" -i $CRON_PATH

}

dyndns_enable_hotplug() {
	echo "# Do not edit this file, it is managed by dyndns service (enable/disable)" > $HOTPLUG_PATH/$HOTPLUG_NAME
	echo '[ "$INTERFACE" != "wan" ] && ( [ "$ACTION" != "ifup" ] || [ "$ACTION" != "update" ] ) && exit 0' >> $HOTPLUG_PATH/$HOTPLUG_NAME
	echo "$SCRIPT_PATH reload" >> $HOTPLUG_PATH/$HOTPLUG_NAME
}

dyndns_disable_hotplug() {
	rm $HOTPLUG_PATH/$HOTPLUG_NAME 2>/dev/null
}

dyndns_update() {
	# Get current wan IP
	. /lib/functions/network.sh
	network_get_ipaddr IPADDR wan

	# Debug message
	echo "Updating domain $DOMAIN to $IPADDR on $SERVER ... "

	# Build and send DNS update query
	echo "server $SERVER
	zone $ZONE
	update delete $DOMAIN A
	update add $DOMAIN $TTL A $IPADDR
	show
	send" | nsupdate -k $KEY 1>/dev/null
}

# Actions
start() {

	reload
	echo "Enabling cron ..."
	dyndns_enable_cron
	echo "Done"
}

reload() {

	dyndns_update
	echo "Updated"
}

enable() {
	echo "Installing cron ..."
	dyndns_enable_cron

	echo "Installing hotplug script ..."
	dyndns_enable_hotplug
	echo "Done"
}

disable() {
	echo "Uninstalling cron ..."
	dyndns_disable_cron

	echo "Uninstalling hotplug script ..."
	dyndns_disable_hotplug

	echo "Done"
}

stop() {
        echo "Disabling cron ..."
	dyndns_disable_cron
	echo "Done"
}

Un lien en plus: http://www.foell.org/justin/diy-dynamic-dns-with-openwrt-bind/ Si on n'a pas de serveur DNS, on peut le faire avec |afraid.org

Le DHCP

Voici une jolie config pour le domaine montopdomain.fr. On a configuré le topdomaine.com et la plage d'IP à utiliser.

root@router:/etc/config# cat dhcp

config dnsmasq
	option domainneeded '1'
	option boguspriv '1'
	option localise_queries '1'
	option rebind_protection '1'
	option rebind_localhost '1'
	option expandhosts '1'
	option authoritative '1'
	option readethers '1'
	option leasefile '/tmp/dhcp.leases'
	option resolvfile '/tmp/resolv.conf.auto'
	option local '/montopdomain.fr/'
	option auth_peer '127.0.0.1'
	option domain 'montopdomain.fr'
	option cachesize '500'

config dhcp 'lan'
	option interface 'lan'
	option start '100'
	option limit '199'
	option leasetime '48h'
	option force '1'

config dhcp 'wan'
	option interface 'wan'
	option ignore '1'

Les options DHCP et BootP

Pour ceux qui les comprennent et qui les utilise. La liste complète est dispo ici: http://www.networksorcery.com/enp/protocol/bootp/options.htm. Ces lignes sont à mettre dans la section config dnsmasq , à modifier selon vos cas:

# Default route
	list dhcp_option "3,192.168.1.2"
# Server NTP
	list dhcp_option "4,192.168.1.2"
# DNS server
	list dhcp_option "6,192.168.1.2"
# Top domain
	list dhcp_option "15,montopdomain.com"
# WINS server (NetBIOS name server)
	list dhcp_option "44,192.168.1.2"
# WPAD url pour configuration auto d'un proxy
	list dhcp_option '252,http://wpad.montopdomain.fr/wpad.dat' # wpad

# Options de boot
	option dhcp_boot 'pxelinux.0,mark-desktop,192.168.1.107'

Autre:

  • 19: IP forward
  • 33: Static routes
  • 42: NTP Servers

Note: Je ne suis pas sûre que tous les codes fonctionnent, ni qu'ils soient correctement implémentés ... En gros à tester :-) Par ailleurs, certaines de ces options sont directement gérées par le daemon, pas besoin de trop y toucher normalement.

Le Wake On Lan

Il suffit d'installer le packet luci-app-wol, et un menu apparait dans Network > Wake On Lan. Après, c'est trivial. Si ça ne fonctionne pas, il faut essayer avec etherwake.

ATESTER

UPnP

Voici la config par défaut. Il ne faudra pas oublier de sortir le range que vous avez choisit pour le forward du NAT sur les port 3xxyy ... Il y'a peut de chance qu'il y'ai un conflit, mais faisons les choses bien :-)

==> upnpd <==

config perm_rule
	option comment 'Deny on internal NAT'
	option ext_ports '30000-39999'
	option int_addr '0.0.0.0/0'
	option int_ports '0-65535'
	option action 'deny'

config perm_rule
	option action 'allow'
	option int_addr '0.0.0.0/0'
	option comment 'Allow high ports'
	option ext_ports '4092-65535'
	option int_ports '4092-65535'

config perm_rule
	option action 'deny'
	option ext_ports '0-65535'
	option int_addr '0.0.0.0/0'
	option int_ports '0-65535'
	option comment 'Default deny'

config upnpd 'config'
	option download '1024'
	option upload '512'
	option external_iface 'wan'
	option internal_iface 'lan'
	option port '5000'
	option upnp_lease_file '/var/upnp.leases'
	option uuid '364836fa-3804-42cf-92f1-xxxx'

Wifi

Network Boot

Il faut rajouter dans le fichier en question:

#vim /etc/config/dhcp
config boot linux
        option filename 'pxelinux.0'
        option serveraddress '192.168.1.xxx'
        option servername 'mypxeserver'

Votre serveur PXE devra être configuré et répondre derrière l'IP 192.168.1.xxx, de préférence pas sur le routeur (c'est mieux d'un point de vu sécurité).

ATESTER, la méthode semble deprecated ... il vaut mieux utiliser option dhcp_boot 'pxelinux.0,mark-desktop,192.168.1.107'

NTP

C'est tout con, faut activer le client et le serveur sur le routeur:

  • Client: Aller dans System > System > Time Synchronization et Enable NTP client
  • Serveur: Aller dans System > System > Time Synchronization et Enable NTP server

En dessous, vous avez la liste des serveurs à interroger ...

Accès HTTPS avec redirection HTTP

Pour utiliser LuCI en HTTPS, il faut faire un opkg install luci-ssl puis on relance le serveur web /etc/init.d/uhttpd restart. L'interface est dispo en HTTPS maintenant.

Les configurations plus plus

Changer la couleur du thème

C'est bien simple, quand on a plusieurs routeurs OpenWRT à gérer, ça peut être pas mal de changer la couleur de la barre principale pour savoir sur quel routeur on est. Les modifications à apporter sont les suivantes:

  • Ouvrir le fichier /www/luci-static/bootstrap/cascade.css avec vim.
  • Cherchez la config de l'élément header .fill (aux environs de la ligne 785)
  • A coup de substitutions, dans le bloc de l'élément:
    # Vert
    :'<,'>s/#333333/#99CC00/g
    :'<,'>s/#222222/#99CC01/g
    # Bleu foncé
    :'<,'>s/#333333/#455372/g
    :'<,'>s/#222222/#455373/g
    
  • Pour le vert, c'est pas mal de changer pour ça dans le bloc header a (couleur du texte du menu) :
            color: #EFF4EE;
    

Statistiques et monitoring

On peut

Wifi avec plusieurs AP et unique SSID

Asterix et téléphonie

Hotspot invité

Sortie OpenVPN

Sortie TOR

Privoxy et bloqueur de pub

Configuration du WPAD (dans le cas d'un proxy)

Faire fonctionner box multimedia (Free)

Autres Services

Perso, j'utilise Debian, à vous d'adapter à votre distrib!

Serveur de fichier Samba

Serveur HTTP

Serveur Torrent (Seedbox)

Serveur de fichier

Serveur de boot réseau

Serveur de statistiques

Collectd peut être configuré comme serveur:

Sécurité

Mettre une authentification basique sur l'interface web

C'est une petite porte à clé générique, mais ça protège toujours un peu plus en cas de faille de sécu sur le formulaire de connexion.

  1. Vérifiez bien que vous la ligne suivante est bien présente dans le fichier /etc/config/uhttpd (section config uhttpd main): option config /etc/httpd.conf
  2. Activer la demande du mot de passe root:echo '/:root:$p$root' >> /etc/httpd.conf
  3. Je vous conseille même de mettre un autre mot de passe. Voir ici ou ici.
Page last modified on December 25, 2016, at 02:49 PM EST