Table des matières
lg - looking glass
lg est une machine virtuelle sous OpenBSD et met à disposition des administrateurs réseau et curieux un looking-glass bgp qui permet de consulter la table de routage internet vue par le réseau de grifon.
Le looking-glass est disponible en web sur https://lg.grifon.fr et également en ssh (ssh -l rviews lg.grifon.fr).
Administrateurs
- alarig
- gizmo
- nemo
- petrus
Services
- bgpd : 2x full view IPv4 + IPv6 de chacun des asbr
- httpd : pour l'interface web du looking-glass
- sshd : interne + public
Setup
lg doit récupérer une full view bgp des deux ASBR grifon, et les fournir à bgplg via un socket restreint.
bgplg peut ensuite être utilisé en tant que cgi sur l'interface web, ou bien en tant que shell via bgplgsh en ssh.
Les pages de man de bgplg et de bgplgsh décrivent presque toute la configuration nécessaire au looking-glass.
config réseau
em0 est l'interface privée qui permet l'administration en ssh ainsi que la supervision de la machine. Elle se trouve dans une table de routage (rdomain) particulière, afin de faire tourner un sshd dans cette dernière. em1 est l'interface publique.
- /etc/hostname.em0
rdomain 1 inet 172.17.0.35/24 inet6 fd00:1e02:40::c/64
- /etc/hostname.em1
inet 89.234.186.9/27 inet6 2a00:5884::a/64
lg$ ifconfig em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> rdomain 1 mtu 1500 lladdr 8e:92:b4:c4:a3:78 index 1 priority 0 llprio 3 media: Ethernet autoselect (1000baseT full-duplex) status: active inet 172.17.0.35 netmask 0xffffff00 broadcast 172.17.0.255 inet6 fe80::8dcc:ae61:ef77:7eb2%em0 prefixlen 64 scopeid 0x1 inet6 fd00:1e02:40::c prefixlen 64 em1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 lladdr d6:06:c0:fa:a0:5f index 2 priority 0 llprio 3 groups: egress media: Ethernet autoselect (1000baseT full-duplex) status: active inet 89.234.186.9 netmask 0xffffffe0 broadcast 89.234.186.31 inet6 fe80::8ac5:854b:3556:6d18%em1 prefixlen 64 scopeid 0x2 inet6 2a00:5884::a prefixlen 64
sshd
Deux daemons ssh tournent sur la machine : un sur em0 dans le rdomain/rtable 1 qui permet l'administration de la machine, et l'autre sur em1 / rdomain 0 (oui je sais…) qui permet de se connecter avec l'utilisateur rviews pour consulter le looking-glass.
- sshd coté privé (em0) : <code> lg$ doas cp /etc/ssh/sshdconfig /etc/ssh/sshdconfigprivate lg$ doas cp /etc/rc.d/sshd /etc/rc.d/sshdprivate lg$ doas rcctl enable sshdprivate lg$ doas rcctl set sshdprivate flags -f /etc/ssh/sshdconfigprivate lg$ doas rcctl set sshd_private rtable 1
lg$ diff -u /etc/ssh/sshdconfig.orig /etc/ssh/sshdconfigprivate
— /etc/ssh/sshdconfig.orig Mon Mar 18 11:37:47 2019
+++ /etc/ssh/sshdconfigprivate Mon Mar 18 10:21:06 2019
@@ -10,8 +10,8 @@
#Port 22 #AddressFamily any -#ListenAddress 0.0.0.0 -#ListenAddress :: +ListenAddress 172.17.0.35 +ListenAddress fd00:1e02:40::c
#HostKey /etc/ssh/sshhostrsakey #HostKey /etc/ssh/sshhostecdsakey @@ -91,3 +91,6 @@ # AllowTcpForwarding no # PermitTTY no # ForceCommand cvs server + +# config pour verrouillage +AllowGroups wheel
lg$ doas rcctl start sshd_private </code>
- sshd coté public (em1) : <code> lg$ doas mv /etc/rc.d/sshd /etc/rc.d/sshdpublic # pour ne pas se tromper lg$ doas rcctl enable sshdpublic lg$ doas rcctl disable sshd
lg$ diff -u /etc/ssh/sshdconfig.orig /etc/ssh/sshdconfig — /etc/ssh/sshdconfig.orig Mon Mar 18 11:37:47 2019 +++ /etc/ssh/sshdconfig Mon Mar 18 20:49:20 2019 @@ -10,8 +10,8 @@
#Port 22 #AddressFamily any -#ListenAddress 0.0.0.0 -#ListenAddress :: +ListenAddress 89.234.186.9 +ListenAddress 2a00:5884::a
#HostKey /etc/ssh/sshhostrsakey #HostKey /etc/ssh/sshhostecdsakey @@ -27,7 +27,7 @@ # Authentication:
#LoginGraceTime 2m -PermitRootLogin prohibit-password +PermitRootLogin no #StrictModes yes #MaxAuthTries 6 #MaxSessions 10 @@ -52,7 +52,7 @@ #IgnoreRhosts yes
# To disable tunneled clear text passwords, change to no here! -PasswordAuthentication no +PasswordAuthentication yes #PermitEmptyPasswords no
# Change to no to disable s/key passwords @@ -91,3 +91,5 @@ # AllowTcpForwarding no # PermitTTY no # ForceCommand cvs server + +AllowUsers rviews
lg$ doas rcctl start sshd_public </code>
Si l'on se trouve dans le shell lancé depuis le sshd qui tourne dans le rdomain 1 il faut spécifier le rdomain 0 pour le sshd public :
lg$ doas route -T0 exec rcctl restart sshd_public
Ainsi deux daemons tournent en parallèle sur la machine :
lg$ ps aux | grep /sbin/sshd root 19295 0.0 0.1 984 840 ?? Ss Thu05PM 0:04.47 /usr/sbin/sshd root 28986 0.0 0.1 1000 1168 ?? Is 10:22AM 0:00.00 /usr/sbin/sshd -f /etc/ssh/sshd_config_private
Dans la table de routage par défaut, rdomain 0 :
lg$ netstat -nat | grep *.22 tcp 0 0 *.22 *.* LISTEN tcp6 0 0 *.22 *.* LISTEN
Et dans le rdomain 1 :
lg$ netstat -T1 -nat | grep .22 tcp 0 0 172.17.0.35.22 *.* LISTEN tcp6 0 0 fd00:1e02:40::c.22 *.* LISTEN lg$ route -T1 exec netstat -nat | grep .22 tcp 0 0 172.17.0.35.22 *.* LISTEN tcp6 0 0 fd00:1e02:40::c.22 *.* LISTEN
On voit ici qu'il y a deux méthodes pour spécifier la table de routage dans laquelle on se trouve. Soit l'utilitaire, comme netstat, ping, telnet, offre la possibilité de spécifier la rtable, soit il faut passer par 'route -T$id exec <programme>'.
bgpd
bgpd doit donc recevoir les full view. Pas de filtrage en in, tout interdit en out. Pas d'installation des routes reçue dans la table de forwarding, on garde juste les routes en mémoire pour interrogation. Le socket est restricted afin d'interdire toute modification de configuration via ce dernier.
- /etc/bgpd.conf
router-id 89.234.186.9 AS 204092 fib-update no # permet de ne pas installer en table de routage # (inutile pou un lg) socket "/var/www/run/bgpd.rsock" restricted # le socket est dans le chroot de httpd pour bgplg cgi # restricted pour interdire les modifs (cf bgplg(8)) group grifon { remote-as 204092 neighbor 89.234.186.7 { descr "asbr01_v4" } neighbor 2a00:5884::1 { descr "asbr01_v6" } neighbor 89.234.186.6 { descr "asbr02_v4" } neighbor 2a00:5884::6 { descr "asbr02_v6" } } deny to any allow from group grifon inet allow from group grifon inet6
Démarrer ensuite bgpd
httpd
Cf principalement la page de man de bgplg. Ne pas oublier d'activer et démarrer httpd(8) et slowcgi(8).
lg$ doas chmod 0555 /var/www/cgi-bin/bgplg lg$ doas chmod 0555 /var/www/bin/bgpctl lg$ doas mkdir /var/www/etc lg$ doas cp /etc/resolv.conf /var/www/etc
- /etc/httpd.conf
logdir "/var/log/httpd" server "default" { listen on * port 80 location "/" { block return 301 "https://$HTTP_HOST/cgi-bin/bgplg" } location "/cgi-bin/*" { block return 301 "https://$HTTP_HOST$REQUEST_URI" root "" } location "/.well-known/acme-challenge/*" { root "/acme" request strip 2 } } server "lg.grifon.fr" { listen on * tls port 443 tls certificate "/etc/ssl/httpd/lg.grifon.fr.chained.crt" tls key "/etc/ssl/httpd/lg.grifon.fr.key" location "/" { block return 301 "https://$HTTP_HOST/cgi-bin/bgplg" } location "/cgi-bin/*" { fastcgi root "" } }
let's encrypt - acme-client
Pour l'obtention gratuite et le renouvellement des certificats, acme-client(1) permet de causer à let's encrypt.
- /etc/acme-client.conf
lg$ cat /etc/acme-client.conf authority letsencrypt { api url "https://acme-v01.api.letsencrypt.org/directory" account key "/etc/acme/letsencrypt-privkey.pem" } authority letsencrypt-staging { api url "https://acme-staging.api.letsencrypt.org/directory" account key "/etc/acme/letsencrypt-staging-privkey.pem" } domain lg.grifon.fr { domain key "/etc/ssl/httpd/lg.grifon.fr.key" domain certificate "/etc/ssl/httpd/lg.grifon.fr.crt" domain full chain certificate "/etc/ssl/httpd/lg.grifon.fr.chained.crt" sign with letsencrypt }
Lors de la première utilisation il faut générer une clé de compte :
lg$ doas acme-client -ADv lg.grifon.fr
Ensuite pour le renouvellement automatique, on invoque acme-client tous les jours, et s'il y a renouvellement on redémarre httpd :
- /etc/daily.local
for domain in $(awk '/^domain/ {print $2}' /etc/acme-client.conf); do \ acme-client -D $domain && \ rcctl reload httpd; \ done
Un peu de customisation pour que ça soit plus joli :
- /var/www/conf/bgplg.head
</head> <body style="text-align: center"> <div style="margin: 0px auto; text-align: left; width: 800px;"> <a href="https://grifon.fr/"> <img style="width: 200px; margin: 0 auto;" src="/bgplg/grifon_resize.png" alt="Grifon"/> </a>
bgplg
Une fois le looking-glass fonctionnel en web, on passer à la partie purement route-server / cli.
Ici c'est bgplgsh qui nous intéresse. Par convention purement personnelle l'utilisateur public sera 'rviews' avec un mot de passe 'Rviews'.
<code>