Réseau@elaboratoire

De Breizh-Entropy
Aller à la navigation Aller à la recherche


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

Map elabo.png

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:

Elabo.png

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
    • 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
    • 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
    • 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
    • Reservé: 10.42.8.0/23
      • Reservé: 10.42.8.0/24
      • Reservé: 10.42.9.0/24
    • Reservé: 10.42.10.0/23
      • Reservé: 10.42.10.0/24
      • Reservé: 10.42.11.0/24
    • Reservé: 10.42.12.0/23
      • Reservé: 10.42.12.0/24
      • Reservé: 10.42.13.0/24
    • Reservé: 10.42.14.0/23
      • Reservé: 10.42.14.0/24
      • Reservé: 10.42.15.0/24


  • 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 ?
    • Clients hackerspace: 172.22.109.0/24
      • Routeur: 172.22.109.1
      • Clients: 172.22.109.2-254

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