Réseau@elaboratoire
Architecture physique
Contexte
Deux lieux :
- l'Élaoratoire (17B av du chardonnet, 48.108587 : -1.645598)
- le "48" (48 av Villebois-Mareuil, 48.106852 : -1.651019)
Une freebox dans chaque lieu. Des lieux communs, des ateliers, des habitations réparties.
48
Page à part : Réseau@48
Élabo
Une freebox dans le bureau, arrose tout le bâtiment.
Il faut mettre un relai plus près des chap'.
Distance de la salle de danse au début du terrain des chaps' : 45m. Jusqu'au fond : 140m.
Architecture logique
Une première proposition pourrait ressembler à ça:
Adressage IP
- Réseau: 10.42.0.0/20
- Infrastructure : 10.42.0.0/23
- Serveurs etc : 10.42.0.0 /24
- Routeur: 10.42.0.1
- Serveurs: 10.42.0.2-254
- Reservé : 10.42.1.0 /24
- Serveurs etc : 10.42.0.0 /24
- Infrastructure : 10.42.0.0/23
- Hackerspace : 10.42.2.0/23
- 10.42.2.1/24
- Routeur : 10.42.2.1
- Clients : 10.42.2.2-254
- Reservé: 10.42.3.0/24
- 10.42.2.1/24
- Hackerspace : 10.42.2.0/23
- 48 : 10.42.4.0/23
- Normal : 10.42.4.0/24
- Routeur : 10.42.4.1
- Clients : 10.42.4.2-254
- Anonyme : 10.42.5.0/24
- Routeur : 10.42.5.1
- Clients : 10.42.5.2-254
- Normal : 10.42.4.0/24
- 48 : 10.42.4.0/23
- Chardonet : 10.42.6.0/23
- Normal : 10.42.6.0/24
- Routeur : 10.42.6.1
- Clients : 10.42.6.2-254
- Anonyme : 10.42.7.0/24
- Routeur : 10.42.7.1
- Clients : 10.42.7.2-254
- Normal : 10.42.6.0/24
- Chardonet : 10.42.6.0/23
- Reservé: 10.42.8.0/23
- Reservé: 10.42.8.0/24
- Reservé: 10.42.9.0/24
- Reservé: 10.42.8.0/23
- Reservé: 10.42.10.0/23
- Reservé: 10.42.10.0/24
- Reservé: 10.42.11.0/24
- Reservé: 10.42.10.0/23
- Reservé: 10.42.12.0/23
- Reservé: 10.42.12.0/24
- Reservé: 10.42.13.0/24
- Reservé: 10.42.12.0/23
- Reservé: 10.42.14.0/23
- Reservé: 10.42.14.0/24
- Reservé: 10.42.15.0/24
- Reservé: 10.42.14.0/23
- DN42: 172.22.108.0/23
- Infra: 172.22.108.0/24
- Routeur: 172.22.108.1
- Réservé: 172.22.108.2-254
- TODO: /25 pour les serveurs ?
- Infra: 172.22.108.0/24
- Clients hackerspace: 172.22.109.0/24
- Routeur: 172.22.109.1
- Clients: 172.22.109.2-254
- Clients hackerspace: 172.22.109.0/24
Topologie
- 2 Vlan / SSIDs proposés sur le wifi:
- 1 vlan pour les clients normaux
- 1 vlan pour les clients anonymes.
Notes
- Connexion anonyme via VPN toile-libre.
- Accès IPv6 pour clients normaux.
- Accès DN42 pour les clients normaux.
- Chardonnet et 48 relié par pont wifi + VPN en backup (limité à 1Mb/s)
- Pourquoi un/des serveur(s): Pour proposer quelques services, typiquement partage de fichier, boot réseaux vers des livecds etc
- Pourquoi plein d'adresses reservées ? Pour prévoir une config un peu large permettant de ne pas avoir à tout casser en cas de nouveau besoin (typiquement, interco avec un autre site)
TODO
- Documenter, documenter, documenter, documenter ...
- Inventaire matos
- Mise en place routeur
- Mise en place premier AP wifi
Inventaire materiel
- 1x Firebox x550: PC 1ghz 512 Mb ram 8 ports réseau 100Mb/s
- 1x poweredge 1950: PC 2x Xeon 3Ghz , 2 go de ram , 2x36Go SCSI.
- 2x NSLU2
Configurations
Routeur 1
Materiel
Firebox x550: PC 1ghz 512 Mb ram 8 ports réseau 100Mb/s
OS
Debian squeeze.
Partionnement:
- /dev/sda5 : /boot => 100Mo
- /dev/sda6 : LVM => Reste
- / => 1Go
- /usr => 2Go
- /var => 2Go
- swap => 1Go
- reste => inutilisé
Interfaces
auto lo iface lo inet loopback #infra normal etc auto eth1 iface eth1 inet static address 10.42.0.1 netmask 255.255.255.0 # Hackerspace auto eth2 iface eth2 inet static address 10.42.2.1 netmask 255.255.255.0 # 48 normal auto eth3 iface eth3 inet static address 10.42.4.1 netmask 255.255.255.0 # 48 Anonyme auto eth4 iface eth4 inet static address 10.42.5.1 netmask 255.255.255.0
IPv6
nano /etc/network/interfaces --- auto he-ipv6 iface he-ipv6 inet6 v4tunnel endpoint 216.66.84.42 address TODO netmask 64 up ip -6 route add 2000::/3 dev he-ipv6 down ip -6 route add 2000::/3 dev he-ipv6 mtu 1480 auto dummy0 iface dummy0 inet6 static address TODO netmask 64 --- apt-get install radvd
VPN
https://www.toile-libre.org/fr/node/102
Firewall
(work in progress)
######################################################################################################### # RAZ ######################################################################################################### iptables -F iptables -X ip6tables -F ip6tables -X iptables -t nat -F iptables -t nat -X ######################################################################################################### # On commence par definir une serie de variable pour associer les interfaces au type de réseau. ######################################################################################################### # interfaces physiques INTERNET=eth0 SERVEURS=eth1 HACKERSPACE=eth2 CLIENTS=eth3 ANONYMES=eth4 # interfaces virtuelles VPN=tap0 DN42=tap1 INTERNET6=he-ipv6 ######################################################################################################### # On definit quelques fonctions utilitaires ######################################################################################################### # iptables pour ipv6 et ipv4 ip46tables () { iptables $@ ip6tables $@ } # aliases FW = ip46tables FW4 = iptables FW6 = ip6tables # log et refuse le paquet $FW -N LOGREJECT $FW -A LOGREJECT -j LOG $FW -A LOGREJECT -j REJECT # log et efface le paquet $FW -N LOGDROP $FW -A LOGDROP -j LOG $FW -A LOGDROP -j DROP # log et accepte le paquet $FW -N LOGACCEPT $FW -A LOGACCEPT -j LOG $FW -A LOGACCEPT -j ACCEPT ######################################################################################################### # Cas du traffic entrant sur le routeur ######################################################################################################### $FW -A INPUT -i $HACKERSPACE -j ACCEPT $FW -A INPUT -i $CLIENTS -j ACCEPT $FW -A INPUT -i $ANONYMES -j ACCEPT $FW -A INPUT -i $SERVEURS -j ACCEPT $FW -N INPUT_INTERNET $FW -N INPUT_DN42 $FW -A INPUT -i $INTERNET -j INPUT_INTERNET $FW -A INPUT -i $DN42 -j INPUT_DN42 $FW -A INPUT -j LOGDROP ######################################################################################################### # Cas du traffic sortant depuis le routeur ######################################################################################################### # on accepte tout $FW -A OUTPUT $INTERNET -j ACCEPT ######################################################################################################### # Cas du traffic que le routeur transfere ######################################################################################################### ########################### # Clients ########################### $FW -A FORWARD -i $CLIENTS -o $INTERNET -j ACCEPT $FW -A FORWARD -i $CLIENTS -o $HACKERSPACE -j ACCEPT $FW -A FORWARD -i $CLIENTS -o $SERVEURS -j ACCEPT $FW -A FORWARD -i $CLIENTS -o $ANONYMES -j ACCEPT ########################### # Clients Anonymes ########################### $FW -A FORWARD -i $ANONYMES -o $VPN -j ACCEPT $FW -A FORWARD -i $ANONYMES -o $HACKERSPACE -j ACCEPT $FW -A FORWARD -i $ANONYMES -o $SERVEURS -j ACCEPT $FW -A FORWARD -i $ANONYMES -o $CLIENTS -j ACCEPT ########################### # hackerspace ########################### $FW -A FORWARD -i $HACKERSPACE -o $INTERNET -j ACCEPT $FW -A FORWARD -i $HACKERSPACE -o $INTERNET6 -j ACCEPT $FW -A FORWARD -i $HACKERSPACE -o $CLIENTS -j ACCEPT $FW -A FORWARD -i $HACKERSPACE -o $ANONYMES -j ACCEPT $FW -A FORWARD -i $HACKERSPACE -o $SERVEURS -j ACCEPT $FW -A FORWARD -i $HACKERSPACE -o $DN42 -j ACCEPT ########################### # Serveurs ########################### $FW -A FORWARD -i $SERVEURS -o $INTERNET -j ACCEPT $FW -A FORWARD -i $SERVEURS -o $CLIENTS -j ACCEPT $FW -A FORWARD -i $SERVEURS -o $ANONYMES -j ACCEPT $FW -A FORWARD -i $SERVEURS -o $HACKERSPACE -j ACCEPT ########################### # Internet ########################### $FW -A FORWARD -i $INTERNET -m state --state RELATED,ESTABLISHED -j ACCEPT $FW -A FORWARD -i $INTERNET6 -m state --state RELATED,ESTABLISHED -j ACCEPT $FW -N FWD_INTERNET $FW -A FORWARD -i $INTERNET -J FWD_INTERNET $FW -A FORWARD -i $INTERNET6 -J FWD_INTERNET ########################### # VPN ########################### $FW -A FORWARD -i $VPN -m state --state RELATED,ESTABLISHED -j ACCEPT ########################### # DN42 ########################### $FW -A FORWARD -i $DN42 -m state --state RELATED,ESTABLISHED -j ACCEPT $FW -N FWD_DN42 $FW -A FORWARD -i $DN42 -J FWD_DN42 ########################### # RESTE ########################### $FW -A FORWARD -j LOGDROP ######################################################################################################### # Cas particuliers ######################################################################################################### # trafic internet -> routeur $FW4 -A INPUT_INTERNET -p icmp -j ACCEPT $FW6 -A INPUT_INTERNET -p icmpv6 -j ACCEPT $FW -A INPUT_INTERNET -p tcp -m tcp --dport 22 -j ACCEPT # trafic dn42 -> routeur $FW4 -A INPUT_DN42 -p icmp -j ACCEPT $FW6 -A INPUT_DN42 -p icmpv6 -j ACCEPT $FW -A INPUT_DN42 -p tcp -m tcp --dport 22 -j ACCEPT # TODO: mettre ici l'hébergement de services. ######################################################################################################### # NAT ######################################################################################################### $FW4 -t nat -P PREROUTING ACCEPT $FW4 -t nat -P POSTROUTING ACCEPT $FW4 -t nat -P OUTPUT ACCEPT $FW4 -t nat -A POSTROUTING -d -i $SERVEURS -o $INTERNET -j MASQUERADE $FW4 -t nat -A POSTROUTING -d -i $HACKERSPACE -o $INTERNET -j MASQUERADE $FW4 -t nat -A POSTROUTING -d -i $CLIENTS -o $INTERNET-j MASQUERADE $FW4 -t nat -A POSTROUTING -d -i $ANONYMES -o $VPN -j MASQUERADE $FW4 -t nat -A POSTROUTING -d -i $HACKERSPACE -o $DN42-j MASQUERADE ######################################################################################################### # END ! ######################################################################################################### iptables-save > /etc/iptables.conf ip6tables-save > /etc/ip6tables.conf
DHCP
ddns-update-style none; update-static-leases on; //option domain-name "@DOMAIN"; //option domain-name-servers @DNSIP1, @DNSIP2; option netbios-name-servers 10.42.0.2; default-lease-time 600; max-lease-time 7200; authoritative; log-facility local7; // We don't use dhcp in the server range //subnet 10.42.0.0 netmask 255.255.255.0 { // option routers 10.42.0.1; // option domain-name-servers 10.42.0.1, 10.42.0.2; // // pool { // range 10.42.0.2 10.42.0.254; // } //} //hackerspace subnet 10.42.2.0 netmask 255.255.255.0 { option routers 10.42.2.1; option domain-name-servers 10.42.2.1, 10.42.0.2; pool { range 10.42.2.2 10.42.2.254; range 172.22.109.2 172.22.109.254 // c'est valide ça ? } } // clients 48 subnet 10.42.4.0 netmask 255.255.255.0 { option routers 10.42.4.1; option domain-name-servers 10.42.4.1, 10.42.0.2; pool { range 10.42.4.2 10.42.4.254; } } // anonymes 48 subnet 10.42.3.0 netmask 255.255.255.0 { option routers 10.42.3.1; option domain-name-servers 10.42.3.1, 10.42.0.2; pool { range 10.42.5.2 10.42.5.254; } }
DNS
apt-get install bind nano /etc/bind/named.conf.options nano /etc/bind/named.conf.local
Monitoring
apt-get install logcheck nano /etc/cron.d/logcheck apt-get install rkhunter apt-get install munin-node
QoS
Script tc :
#!/bin/sh # for further informations, see the doc text file. TC=`which tc` ######################################################## ############# Download policy # On nettoie toute ancienne trace sur eth1 $TC qdisk del dev eth1 root # set the root, handle -> 1: $TC qdisc add dev eth1 root handle 1: htb default 99 r2q 5 ## 2 sous classes, communication locale (100 mbps ?) ou externe -> locale # communication locale, class + filtre, on rajoute un qdisk si besoin est... $TC class add dev eth1 parent 1:0 classid 1:1337 htb rate 100mbit ceil 100mbit $TC filter add dev eth1 parent 1:0 protocol ip prio 1000 handle 1337 fw flowid 1:1337 # communication WAN -> LAN, qdisc # ceil > rate si jamais y'a plus de débit, on sait jamais, ça peut aider... $TC class add dev eth1 parent 1:0 classid 1:1 htb rate 6mbit ceil 10mbit # de là, 4 sous classes, DNS/ACK, SSH, Web, Other # DNS/ACK, pfifo $TC class add dev eth1 parent 1:1 classid 1:10 htb rate 100kbit ceil 500kbit burst 5k prio 1 $TC qdisc add dev eth1 parent 1:10 handle 110: pfifo limit 1000 $TC filter add dev eth1 parent 1:0 protocol ip prio 1 handle 10 fw flowid 1:10 # SSH, sfq $TC class add dev eth1 parent 1:1 classid 1:20 htb rate 200kbit ceil 1mbit prio 2 $TC qdisc add dev eth1 parent 1:20 handle 120: sfq perturb 10 $TC filter add dev eth1 parent 1:0 protocol ip prio 2 handle 20 fw flowid 1:20 # Web (http/https), sfq dst $TC class add dev eth1 parent 1:1 classid 1:30 htb rate 4mbit ceil 6mbit prio 3 $TC qdisc add dev eth1 parent 1:30 handle 130: sfq perturb 10 hash keys dst $TC filter add dev eth1 parent 1:0 protocol ip prio 3 handle 30 fw flowid 1:30 # Other, sfq $TC class add dev eth1 parent 1:1 classid 1:99 htb rate 1mbit ceil 3mbit prio 99 $TC qdisc add dev eth1 parent 1:99 handle 199 sfq perturb 10 hash keys dst $TC filter add dev eth1 parent 1:0 protocol ip prio 99 handle 99 fw flowid 1:99 ##################################################### ############### Upload policy # On nettoie toute ancienne trace sur eth0 $TC qdisc del dev eth0 root # On fait un root qdisc sur eth0, 200kbit en up $TC qdisc add dev eth0 root handle 1: htb default 99 r2q 5 # Si jamais on décide de faire d'autres sous classes..., je ceil un peu au dessus si jamais on en a plus... $TC class add dev eth0 parent 1:0 classid 1:1 htb rate 200kbit ceil 300kbit # Sous classes : ack+dns, ssh, web, other. # DNS/ACK, pfifo $TC class add dev eth0 parent 1:1 classid 1:10 htb rate 20kbit ceil 75kbit burst 5k prio 1 $TC qdisc add dev eth0 parent 1:10 handle 110: pfifo limit 1000 $TC filter add dev eth0 parent 1:0 protocol ip prio 1 handle 10 fw flowid 1:10 # SSH, sfq $TC class add dev eth0 parent 1:1 classid 1:20 htb rate 30kbit ceil 100kbit prio 2 $TC qdisc add dev eth0 parent 1:20 handle 120: sfq perturb 10 $TC filter add dev eth0 parent 1:0 protocol ip prio 2 handle 20 fw flowid 1:20 # Web (http/https), sfq $TC class add dev eth0 parent 1:1 classid 1:30 htb rate 100kbit ceil 200kbit prio 3 $TC qdisc add dev eth0 parent 1:30 handle 130: sfq perturb 10 $TC filter add dev eth0 parent 1:0 protocol ip prio 3 handle 30 fw flowid 1:30 # Other, sfq $TC class add dev eth0 parent 1:1 classid 1:99 htb rate 50kbit ceil 100kbit prio 99 $TC qdisc add dev eth0 parent 1:99 handle 199 sfq perturb 10 $TC filter add dev eth0 parent 1:0 protocol ip prio 99 handle 99 fw flowid 1:99
Script iptables :
#!/bin/sh IT=`which iptables` # mangle flush $IPT -t mangle -F ######################### #### Download policy - eth1 # mark : 10 -> ACK or DNS # 20 -> SSH # 30 -> Web (HTTP/HTTPS) # 99-> Other (marquage auto par le qdisc par défaut) # 1337 -> LAN to LAN # 1337 -> LAN to LAN $IPT -t mangle -A POSTROUTING -o eth1 -d 10.0.0.0/8 -j CONNMARK --tcp-flags SYN,ACK SYN,ACK --set-mark 1337 # 30, Web $IPT -t mangle -A POSTROUTING -o eth1 -p tcp -m multiport --sport 80,443,8080 -j CONNMARK --tcp-flags SYN,ACK SYN,ACK --set-mark 30 # 20 SSH $IPT -t mangle -A POSTROUTING -o eth1 -p tcp --dport 22 -j CONNMARK --tcp-flags SYN,ACK SYN,ACK --set-mark 20 $IPT -t mangle -A POSTROUTING -o eth1 -p tcp --sport 22 -j CONNMARK --tcp-flags SYN,ACK SYN,ACK --set-mark 20 # propagation des marques $IPT -t mangle -A POSTROUTING -j CONNMARK -o eth1 --restore-mark # 10 DNS/ACK $IPT -t mangle -A POSTROUTING -o eth1 -p udp --sport 53 -j CONNMARK --set-mark 10 $IPT -t mangle -A POSTROUTING -o eth1 -p tcp --tcp-flags URG,ACK,PSH,RST,SYN,FIN ACK -m length --length 40:64 -j MARK --set-mark 10 ######################### #### Upload policy - eth0 # mark : 10 -> ACK ou DNS # 20 -> SSH # 30 -> Web # 99 -> Autre, marquage auto par le qdisc # 30, Web $IPT -t mangle -A POSTROUTING -o eth0 -p tcp -m multiport --dport 80,443,8080 -j CONNMARK --tcp-flags SYN,ACK SYN,ACK --set-mark 30 # 20 SSH $IPT -t mangle -A POSTROUTING -o eth0 -p tcp --dport 22 -j CONNMARK --tcp-flags SYN,ACK SYN,ACK --set-mark 20 $IPT -t mangle -A POSTROUTING -o eth0 -p tcp --sport 22 -j CONNMARK --tcp-flags SYN,ACK SYN,ACK --set-mark 20 # propagation des marques $IPT -t mangle -A POSTROUTING -j CONNMARK -o eth0 --restore-mark # 10 DNS/ACK $IPT -t mangle -A POSTROUTING -o eth0 -p udp --dport 53 -j CONNMARK --set-mark 10 $IPT -t mangle -A POSTROUTING -o eth0 -p tcp --tcp-flags URG,ACK,PSH,RST,SYN,FIN ACK -m length --length 40:64 -j MARK --set-mark 10
Mini doc pas claire :
On part du principe qu'il n'y a que deux interfaces : WAN (eth0) et LAN (eth1). Pour l'upload (out de eth0), on utilise des SFQ avec des HTB et priorisation des ack et du ssh (dport ou sport 22). On marque les paquets en aval via iptables. Pour le download, au lieu d'utiliser l'ingress de eth0 qui serait… inutilisable, on utilise l'out (out de eth1, vers le LAN) pour réguler le tout, ce n'est peut être pas la solution optimale, mais c'est mieux que rien… Donc en down, on priorise le ssh (dport ou sport 22), les ports HTTP/HTTPS (?) puis le reste. Dessus on met des SFQ. qui filtrent par rapport à l'ip de dest (donc du client local). On a donc ça : {WAN} <-----> FBX <-------> Routeur <--------> Clients (eth0) (eth1) |_ qos up |_ qos down Niveau débit, au dernier pointage on avait 5,5 Mbps en down et ~ 250 kbps en up.
Serveur
Materiel
poweredge 1950: PC 2x Xeon 3Ghz , 2 go de ram , 2x36Go SCSI.
OS
Debian squeeze.
2 disques partionnés de manière identique pour raid
- 1x Raid 1 100 Mo => /boot
- 1x Raid 1 X Go => LVM
- / => 1Go
- /usr => 2Go
- /var => 2Go
- Reste => TODO
- 2x Swap 1Go
Disque de données ?
- /srv/data
- /srv/data/shared
- /srv/data/homes
Monitoring
apt-get install logcheck nano /etc/cron.d/logcheck apt-get install rkhunter apt-get install munin munin-node
Samba
apt-get install samba nano /etc/samba/smb.conf --- security = TODO wins support = yes [partage] path = /srv/data/shared read only = no create mask = 0777 directory mask = 0777 guest ok = yes ---
NFS
apt-get install nfs-kernel-server nano /etc/exports --- # TODO: corriger /srv/data/ 10.42.*.*(rw,async,fsid=0,no_subtree_check,root_squash) ---
FTPD
apt-get install pure-ftpd
TFTP
TODO
apache
apt-get install apache2
php (fcgid)
apt-get install php-cgi libapache2-mod-fcgi
mysql
apt-get install mysql-server mysql-client