Grenode utilise bird-lg, un looking glass pour Bird. Il est écrit en Python, et a été réalisé par Mehdi Abaakouk (de tetaneutral.net).

En pratique, nous utilisons un dépôt dérivé, quelques patches étant nécessaires au bon fonctionnement de l'outil.

Utilisation

Le looking glass est accessible publiquement à l'adresse https://lg.grenode.net.

Installation

bird-lg a deux composants :

  • un programme qui tourne sur ?batture, dont le but est de communiquer avec bird et de lancer des ping/traceroute
  • un programme qui tourne sur ?outils, qui sert de frontend web pour les utilisateurs

Sur batture

Ajout d'un utilisateur dédié :

$ sudo adduser --disabled-login --disabled-password --gecos birdlg birdlg
  # Pour pouvoir accéder aux sockets de contrôle de bird
$ adduser birdlg bird

Installation de pip (gestionnaire de paquet python), sans tirer tout build-essentials qui n'est pas utile pour nous :

$ sudo apt-get install --no-install-recommends python-pip

Installation de bird-lg, ainsi que de Flask (en utilisant pip en mode utilisateur) :

$ sudo su - birdlg
$ git clone git://github.com/zorun/bird-lg.git
$ pip install --user Flask

Configuration de lgproxy :

$ cd bird-lg
$ cp lgproxy.cfg.example lgproxy.cfg

Contenu de la configuration :

DEBUG = False

LOG_FILE = "/home/birdlg/lgproxy.log"
LOG_LEVEL = "WARNING"

# Which IP/port to listen to for the frontend
BIND_IP = "::"
BIND_PORT = 5678

# Who can connect to the proxy to launch Bird commands
# outils.grenode.net
ACCESS_LIST = ["2001:912:400:100::20"]

# Location of Bird control sockets, example for Debian > wheezy
BIRD_SOCKET = "/run/bird/bird.ctl"
BIRD6_SOCKET = "/run/bird/bird6.ctl"

# Source IP for traceroute/traceroute6
IPV4_SOURCE = "91.216.110.6"
IPV6_SOURCE = "2001:912::6"

On n'écoute qu'en IPv6, seul ?outils viendra parler avec nous. Il pourrait être intéressant de limiter l'accès au niveau du firewall.

Sur outils

Le début est similaire :

$ sudo adduser --disabled-login --disabled-password --gecos birdlg birdlg
$ sudo apt-get install --no-install-recommends python-pip
$ sudo su - birdlg
$ git clone git://github.com/zorun/bird-lg.git

Installation des dépendances :

$ pip install --user Flask pydot dnspython

Configuration :

$ cat lg.cfg
DEBUG = False

LOG_FILE="/home/birdlg/lg.log"
LOG_LEVEL="WARNING"

DOMAIN = "grenode.net"

# Which backend routers to connect to
PROXY = {
    "batture": 5678
}

# Used for bgpmap
ROUTER_IP = {
    "batture" : [ "91.216.110.6", "2001:912::6" ]
}

AS_NUMBER = {
    "batture" : "51083"
}

SESSION_KEY = 'something random'

Configuration d'Apache (d'après la documentation Flask) :

$ sudo apt-get install libapache2-mod-wsgi
$ cat /etc/apache2/site-enable/lg.grenode.net
<VirtualHost *:80>
    ServerName lg.grenode.net

    WSGIDaemonProcess lookingglass user=birdlg group=birdlg threads=5
    WSGIScriptAlias / /home/birdlg/bird-lg/lg.wsgi

    <Directory /home/birdlg/bird-lg>
        WSGIProcessGroup lookingglass
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>