OSPF: mise en place sous Raspberry Pi, Ubuntu et CentOS

De Pegasus45

Pour mes besoins personnels, je dois mettre en place du routage dynamique sur mon réseau chez moi. Adepte de la virtualisation, je simule des réseaux, des architectures de serveurs en créant pleins de vlan. Pour éviter de gérer des tables de routage manuellement, j'ai décidé de passer à du routage dynamique avec OSPF.


Mon réseau est constitué:

  • d'un vlan où se trouve ma box Internet,
  • d'un vlan où se trouve un Raspberry Pi (en tant que Firewall/Proxy/DNS/DHCP) et de mes périphériques perso.
  • d'un vlan où se trouve mes 3 serveurs de virtualisation (2 ESX et 1 Hyper-V)
  • d'un vlan dédié à OSPF

A partir de maintenant, pour créer un réseau d'entreprise pour un lab, j'utiliserai 3 vlans:

  • 1 vlan "externe"
  • 1 vlan "DMZ"
  • 1 vlan "interne"

Le plan d'adressage sera de classe C, découpé au minimum en 3, qui seront dans un vlan différent:

  • vlan "interne" = 192.168.XX.0/25 (126 IP possibles)
  • vlan "DMZ" = 192.168.XX.128/26 (62 IP possibles)
  • vlan "externe" = 192.168.XX.192/29 (6 IP possibles)

Et il me restera encore d'autres IP/vlan dans ce plan d'adressage

Mon réseau ressemble à cela
MonReseau.png


Raspberry Pi (Linux Raspbian)

Pour le Raspberry Pi, puisqu'il n'a qu'une seule carte réseau, je vais devoir créer une interface virtuelle par vlan. Donc, on commence par installer le package vlan.

Command
apt-get install vlan

Ensuite, on crée les différentes interfaces réseaux.

Configuration File vi /etc/network/interfaces
auto eth0
iface eth0 inet manual

auto eth0.5
iface eth0.5 inet static
        address 192.168.60.250
        netmask 255.255.255.0
        gateway 192.168.60.1

auto eth0.61
iface eth0.61 inet static
        address 192.168.61.254
        netmask 255.255.255.0
        vlan-raw-device eth0

auto eth0.62
iface eth0.62 inet static
        address 10.0.0.254
        netmask 255.255.255.0
        vlan-raw-device eth0

Et on relance le réseau:

Command
/etc/init.d/networking restart

Pour faire du routage OSPF, je vais utiliser le package Quagga qui permet de faire du RIP, de l'OSPF, du GGP, etc. Donc, on installe le paquet.

Command
apt-get install quagga

Pour chaque protocole de routage, on doit activer son daemon.

Configuration File vi /etc/quagga/daemons
zebra=yes
bgpd=no
ospfd=yes
ospf6d=no
ripd=no
ripngd=no
isisd=no
babeld=no

Ici, on active le daemon Zebra qui pilote les autres daemons et le daemon OSPFd.

On configure le daemon Zebra.

Configuration File vi /etc/quagga/zebra.conf
zebra.conf
!
! Zebra configuration saved from vty
!   2015/04/06 12:28:51
!
hostname fw1-rtr
password zebra
enable password zebra
log file /var/log/quagga/quagga.log
!
debug zebra events
debug zebra packet
!
interface eth0
 ipv6 nd suppress-ra
!
interface eth0.1
 description switch-lan
 ip address 192.168.1.254/24
 ipv6 nd suppress-ra
!
interface eth0.5
 description box-lan
 ip address 192.168.60.250/24
 ipv6 nd suppress-ra
!
interface eth0.61
 description perso-lan
 ip address 192.168.61.254/24
 ipv6 nd suppress-ra
!
interface eth0.62
 description ospf-lan
 ip address 10.0.0.254/24
 ipv6 nd suppress-ra
!
interface lo
!
ip forwarding
!
!
line vty
!

Ensuite, on configure le daemon OSPFd. En fait, on définit les routes qui seront diffusées aux autres routeurs OSPF.

Configuration File vi /etc/quagga/ospfd.conf
hostname ospfd
password zebra
log file /var/log/quagga/ospfd.log
log stdout
!
debug ospf event
debug ospf packet all
!
!
interface eth0
!
interface eth0.1
 description switch-lan
!
interface eth0.5
 description box-lan
!
interface eth0.61
 description perso-lan
!
interface eth0.62
 description ospf-lan
!
interface lo
!
router ospf
 ospf router-id 10.0.0.254
 network 10.0.0.0/24 area 0.0.0.0
 network 192.168.60.0/24 area 0.0.0.0
 network 192.168.61.0/24 area 0.0.0.0
!
line vty
!

On change le propriétaire des fichiers de conf:

Command
chown quagga.quagga *.conf

Et on relance le daemon Quagga.

Command
/etc/init.d/quagga restart


Pour la partie Firewall, j'utilise Shorewall qui me simplifie beaucoup la gestion des règles de Netfilter. En fait, j'autorise les paquets OSPF d'entrer et de sortir du Raspberry Pi, uniquement sur l'interface qui est reliée au vlan OSPF.

Configuration File vi /etc/shorewall/rules
OSPF(ACCEPT)    dmz             $FW
OSPF(ACCEPT)    $FW             dmz


Ubuntu

Le routeur/Firewall qui contrôle l'accès au vlan où se trouve mes 3 serveurs de virtualisation est sous Ubuntu 14.10. La procédure d'installation de configuration est à peu près la même que sous Raspberry Pi.

Par simplification, je vais faire toutes les manip directement sous root

Command
sudo su -

Ensuite, j'installe le paquet Quagga:

Command
apt-get install quagga

Et j'active les daemons Zebra et OSPFd.

Configuration File vi /etc/quagga/daemons
zebra=yes
bgpd=no
ospfd=yes
ospf6d=no
ripd=no
ripngd=no
isisd=no
babeld=no

A partir d'un modèle, je crée un fichier de configuration pour le daemon OSPF:

Command
cp /usr/share/doc/quagga/examples/ospfd.conf.sample ospfd.conf

Et que je l'édite:

Configuration File vi /etc/quagga/ospfd.conf
hostname olympe-rtr
password zebra
log file /var/log/quagga/ospfd.log
log stdout
!
debug ospf event
debug ospf packet all
!
!
interface eth0
 description ospf-lan
!
interface eth1
 description olympe-lan
!
interface eth2
 description olympe-dmz
!
interface lo
!
router ospf
 ospf router-id 10.0.0.10
 network 10.0.0.0/24 area 0.0.0.0
 network 192.168.8.0/24 area 0.0.0.0
 network 192.168.10.0/24 area 0.0.0.0
!
line vty
!

Et je fais la même chose pour le daemon Zebra:

Command
cp /usr/share/doc/quagga/examples/zebra.conf.sample zebra.conf

Configuration File vi /etc/quagga/zebra.conf
hostname olympe-rtr
password zebra
enable password zebra
log file /var/log/quagga/quagga.log
!
debug zebra events
debug zebra packet
!
interface eth0
 description ospf-lan
 ip address 10.0.0.10/24
 ipv6 nd suppress-ra
!
interface eth1
 description olympe-lan
 ip address 192.168.8.254/24
 ipv6 nd suppress-ra
!
interface eth2
 description olympe-dmz
 ip address 192.168.10.254/24
 ipv6 nd suppress-ra
!
interface lo
!
ip forwarding
!
!
line vty
!

Je chanqge le propriétaire des fichiers et je relance Quagga:

Command
chown quagga.quagga *.conf
service quagga restart

Et pour finir, j'autorise le trafic OSPF:

Configuration File vi /etc/shorewall/rules
OSPF(ACCEPT)    wan             $FW
OSPF(ACCEPT)    $FW             wan

Au bout de quelques secondes, on voit apparaître de nouvelles routes (metric 20)

Command route -n
Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
0.0.0.0         10.0.0.254      0.0.0.0         UG    0      0        0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.1.0     10.0.0.254      255.255.255.0   UG    20     0        0 eth0
192.168.8.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 eth2
192.168.60.0    10.0.0.254      255.255.255.0   UG    20     0        0 eth0
192.168.61.0    10.0.0.254      255.255.255.0   UG    20     0        0 eth0


CentOS

On peut aussi utiliser Quagga sous CentOS 7. Le paquet est dans le dépôt de base.

J'installe le paquet:

Command
yum install quagga

Contrairement sur Ubuntu et Raspbian, il n'y a pas de script d'init Quagga. Il faut lancer chaque daemon (zebra, ospfd, etc) indépendamment. J'active le daemon Zebra:

Command
systemctl enable zebra
systemctl start zebra
systemctl status zebra

 zebra.service - GNU Zebra routing manager
   Loaded: loaded (/usr/lib/systemd/system/zebra.service; enabled)
   Active: active (running) since lun. 2015-05-04 21:57:16 CEST; 11s ago
  Process: 11946 ExecStart=/usr/sbin/zebra -d $ZEBRA_OPTS -f /etc/quagga/zebra.conf (code=exited, status=0/SUCCESS)
  Process: 11944 ExecStartPre=/sbin/ip route flush proto zebra (code=exited, status=0/SUCCESS)
 Main PID: 11948 (zebra)
   CGroup: /system.slice/zebra.service
           └─11948 /usr/sbin/zebra -d -A 127.0.0.1 -f /etc/quagga/zebra.conf

Au lieu de configurer directement dans le fichier de configuration, je vais passer par l'outil vtysh, également disponible sous Ubuntu/Raspbian, qui fait un telnet sur le port du daemon. On a l'impression d'être sur un routeur Cisco:

Command vtysh
######################################
Hello, this is Quagga (version 0.99.22.4).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

rtr1# conf t
rtr1(config)# log file /var/log/quagga/quagga.log
rtr1(config)# exit
rtr1# write
Building Configuration...
Configuration saved to /etc/quagga/zebra.conf
[OK]

rtr1# show interface
Interface eth0 is up, line protocol detection is disabled
  index 2 metric 1 mtu 1500
  flags: <UP,BROADCAST,RUNNING,MULTICAST>
  HWaddr: 00:15:5d:3c:0c:27
  inet 10.0.0.12/24 broadcast 10.0.0.255
  inet6 fe80::215:5dff:fe3c:c27/64
Interface eth1 is up, line protocol detection is disabled
  index 3 metric 1 mtu 1500
  flags: <UP,BROADCAST,RUNNING,MULTICAST>
  HWaddr: 00:15:5d:3c:0c:31
  inet 192.168.80.198/29 broadcast 192.168.62.199
  inet6 fe80::215:5dff:fe3c:c31/64
Interface lo is up, line protocol detection is disabled
  index 1 metric 1 mtu 65536
  flags: <UP,LOOPBACK,RUNNING>
  inet 127.0.0.1/8
  inet6 ::1/128

rtr1# configure terminal
rtr1(config)# interface eth0
rtr1(config-if)# description ospf-lan
rtr1(config-if)# no shutdown
rtr1(config-if)# interface eth1
rtr1(config-if)# description lab01-lan
rtr1(config-if)# no shutdown
rtr1(config-if)# do show interface description
Interface       Status  Protocol  Description
eth0            up      unknown   ospf-lan
eth1            up      unknown   lab01-lan
lo              up      unknown

rtr1(config-if)# do write
Building Configuration...
Configuration saved to /etc/quagga/zebra.conf
[OK]

rtr1(config-if)# exit
rtr1(config)# exit
rtr1# exit

Et j'active le Forward de la couche réseau

Command
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

sysctl -p /etc/sysctl.conf
 net.ipv4.ip_forward = 1

Maintenant, je configure le daemon OSPFd:

Command
cp /usr/share/doc/quagga-0.99.22.4/ospfd.conf.sample /etc/quagga/ospfd.conf
chown quagga.quagga /etc/quagga/ospfd.conf
chmod 600 /etc/quagga/ospfd.conf

systemctl enable ospfd
systemctl start ospfd
systemctl status ospfd

ospfd.service - OSPF routing daemon
   Loaded: loaded (/usr/lib/systemd/system/ospfd.service; enabled)
   Active: active (running) since lun. 2015-05-04 22:31:32 CEST; 10s ago
  Process: 2903 ExecStart=/usr/sbin/ospfd -d $OSPFD_OPTS -f /etc/quagga/ospfd.conf (code=exited, status=0/SUCCESS)
 Main PID: 2904 (ospfd)
   CGroup: /system.slice/ospfd.service
           └─2904 /usr/sbin/ospfd -d -A 127.0.0.1 -f /etc/quagga/ospfd.conf

Et je passe par l'outil vtysh pour la configuration:

Command vtysh
Hello, this is Quagga (version 0.99.22.4).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

rtr1# conf t
rtr1(config)# router ospf
rtr1(config-router)# router-id 10.0.0.12
rtr1(config-router)# network 10.0.0.0/24 area 0
rtr1(config-router)# network 192.168.80.192/29 area 0
rtr1(config-router)# redistribute kernel
rtr1(config-router)# do write
Building Configuration...
Configuration saved to /etc/quagga/zebra.conf
Configuration saved to /etc/quagga/ospfd.conf
[OK]
rtr1(config-router)# exit
rtr1(config)# exit
rtr1# exit

L'option "redistribute kernel" permet d'inclure les routes statiques, présentes dans le kernel, ajoutées manuellement (avec la commande route) afin de pouvoir atteindre les zones Lan et DMZ du Lab.

Et on relance les 2 daemons:

Command
systemctl restart zebra
systemctl restart ospfd

Au bout de quelques secondes, on voit apparaître de nouvelles routes (metric 20)

Command
route -n
Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
0.0.0.0         10.0.0.254      0.0.0.0         UG    100    0        0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
192.168.80.0    0.0.0.0         255.255.255.248 U     100    0        0 eth1

route -n
Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
0.0.0.0         10.0.0.254      0.0.0.0         UG    100    0        0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
192.168.80.192  0.0.0.0         255.255.255.248 U     100    0        0 eth1
192.168.8.0     10.0.0.10       255.255.255.0   UG    20     0        0 eth0
192.168.10.0    10.0.0.10       255.255.255.0   UG    20     0        0 eth0
192.168.61.0    10.0.0.254      255.255.255.0   UG    20     0        0 eth0