\documentclass{beamer}

\usetheme{AnnArbor}

\usepackage[french]{babel}
\usepackage[utf8x]{inputenc}

\usepackage{bortzmeyer-utils}

\author[Stéphane Bortzmeyer]
{
  Stéphane Bortzmeyer \texttt{stephane+cnam@bortzmeyer.org}
}

\title[BGP]
{
  BGP, le protocole de routage de l'Internet
}

\date[2018]
{CNAM, 9 janvier 2018}

\begin{document}

\begin{frame}
  \titlepage
\end{frame}

\AtBeginSection[]
{
\begin{frame}
    \frametitle{Plan du cours}
    \tableofcontents[currentsection]
\end{frame}
}

\section{Le problème}

\begin{frame}
  \frametitle{L'Internet}
 \begin{overlayarea}{\textwidth}{.6\textheight}
   \begin{itemize}
   \item<2->Réseau mondial,
   \item<3->Pas de Chef Suprême\only<3>{ (BGP va être pair-à-pair)},
   \item<4->Pas de maillage total. Comment je vais de SFR à
     l'Université de Bangkok, sachant que les deux opérateurs n'ont
     aucun lien ?
   \end{itemize}
 \end{overlayarea}  
\end{frame}  

\begin{frame}
  \frametitle{Rappel IP}
 \begin{overlayarea}{\textwidth}{.6\textheight}
   \begin{itemize}
   \item<2->Adresses comme \computer{2001:db8:42:cafe::1:85f},
   \item<3->\emph{Préfixes} comme \computer{2001:db8:42::/48}\only<3>{
    (BGP route des préfixes)},
   \end{itemize}
 \end{overlayarea}    
\end{frame}

\begin{frame}[fragile]
  \frametitle{Table de routage}
  (Devrait s'appeler table de transmission, en fait.) Sur un Linux :
  \begin{info}
% ip -6 route show
local ::1 dev lo proto kernel metric 256 
2001:4b98:dc2:43::/64 dev eth0 proto kernel metric 256 expires 2591706sec 
2001:4b98:dc2:45::/64 dev eth1 proto kernel metric 256 expires 2591545sec 
fe80::/64 dev eth0 proto kernel metric 256 
fe80::/64 dev eth1 proto kernel metric 256 
default via fe80::643 dev eth0 proto ra metric 1024 expires 1506sec hoplimit 64   
  \end{info} 
\end{frame}

\begin{frame}[fragile]
  \frametitle{Table de routage, suite}
  Sur un Cisco :
  \begin{info}
route-views>show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
...
      1.0.0.0/8 is variably subnetted, 2638 subnets, 20 masks
B        1.0.4.0/22 [20/0] via 114.31.199.1, 2d01h
B        1.0.4.0/24 [20/0] via 114.31.199.1, 2d01h
B        1.0.5.0/24 [20/0] via 114.31.199.1, 2d01h
B        1.0.6.0/24 [20/0] via 114.31.199.1, 2d01h
B        1.0.7.0/24 [20/0] via 114.31.199.1, 2d01h
B        1.0.16.0/24 [20/0] via 202.232.0.2, 4d20h
B        1.0.64.0/18 [20/2523] via 208.51.134.254, 6d21h
B        1.0.128.0/17 [20/0] via 5.101.110.2, 2d00h
B        1.0.128.0/18 [20/0] via 5.101.110.2, 2d00h
B        1.0.128.0/19 [20/0] via 5.101.110.2, 2d00h
B        1.0.128.0/24 [20/0] via 95.85.0.2, 6d21h
...    
  \end{info}
\end{frame}

\begin{frame}
  \frametitle{Table de routage, attention}
 \begin{overlayarea}{\textwidth}{.6\textheight}
   \begin{itemize}
   \item<2->Routage (\foreign{routing}) : calculer les tables de
     routage. C'est le travail de BGP.
   \item<3->Transmission (\foreign{forwarding}) : envoyer le
     paquet. C'est le travail d'IP.
   \end{itemize}
   \only<4->{\foreign{The data plane (IP) does not always follow the
       control plane (BGP).}}
   
   \only<5->{La transmission est ultra-rapide, le routage prend plus de
   temps et est plus complexe.}
 \end{overlayarea}    
\end{frame}

\begin{frame}[fragile]
  \frametitle{traceroute}
  \begin{info}
traceroute to yeti-ns.lab.nic.cl (2001:1398:1:21::8001), 30 hops max, 80 byte packets
...
 6  2001:67c:2218:255::8:10 (2001:67c:2218:255::8:10)  13.816 ms  13.223 ms  12.541 ms
 7  xe-7-0-3.bar1.Marseille1.Level3.net (2001:1900:5:2:2::421)  16.124 ms  15.929 ms  15.902 ms
 8  lo-22-v6.edge3.Paris1.Level3.net (2001:1900:2::8)  12.697 ms  12.871 ms  12.629 ms
 9  gblx-level3-xe.Paris1.Level3.net (2001:1900:5:3::126)  19.284 ms  19.286 ms  19.271 ms
10  * * *
11  2001:450:2002:af::2 (2001:450:2002:af::2)  235.567 ms  235.570 ms  235.191 ms
12  2800:1f0:8000::4 (2800:1f0:8000::4)  235.150 ms  235.463 ms  235.481 ms
13  * * *
14  yeti-ns.lab.nic.cl (2001:1398:1:21::8001)  263.425 ms  260.123 ms  260.081 ms
  \end{info}
  (\path{2800:1f0:8000::4} est le FAI chilien Adexus)
\end{frame}

\begin{frame}
  \frametitle{Les opérateurs}
  Les organisations qui font du BGP
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->Pas le petit FAI ou petit hébergeur Web
  \item<3->Critère possible : au moins deux connexions Internet
  \item<4->En France : Gandi, Renater, Free/Proxad, SFR, Orange, OVH, Gitoyen,
    AFNIC\ldots
  \end{itemize}
  \end{overlayarea}  
\end{frame}

\begin{frame}
  \frametitle{Notion de système autonome (AS)}
  \begin{block}
    {Un AS est un ensemble de routeurs sous une direction unique. Dans
    un AS, on peut faire des choix communs (comme « on déploie IPv6 »).}
    {Identifié par un ASN (numéro d'AS). 12322 est Free, 16276 OVH,
      2484 l'AFNIC, 42 identifie PCH\ldots}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Appairage et transit}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->Appairage (\foreign{Peering}) : connexion entre pairs\only<2>{, en
    général gratuite et informelle ; le pair n'envoie que ses routes}
  \item<3->Transit : connexion à un opérateur plus gros\only<3>{,
    payante : le transitaire envoie toutes les routes}
  \item<4->\foreign{Tier 1} : opérateur qui n'achète pas de transit du
    tout (Tata, Level 3, OpenTransit\ldots)
  \item<5->Et c'est ainsi que l'Internet émerge, par ces appairages et transits.  
  \end{itemize}
\end{overlayarea}  
\end{frame}

  \begin{frame}
    \frametitle{Les routeurs}
        \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->Fondamentalement, un routeur BGP est un ordinateur,
  \item<3->Il a beaucoup de logiciel donc beaucoup de bogues\only<3>{
    (exemple de l'attribut 99 sur Cisco)},
  \item<4->Première différence : il a beaucoup d'interfaces,
  \item<5->Deuxième différence : le processeur qui fait BGP ne fait
    pas la transmission des paquets\only<5>{ (routage, mais pas transmission)}.  
    \end{itemize}
  \end{overlayarea}  
  \end{frame}

  \begin{frame}
    \frametitle{IGP et EGP}
    \begin{overlayarea}{\textwidth}{.6\textheight}
    \begin{itemize}
    \item<2->IGP (\foreign{Interior Gateway Protocol}, à l'intérieur
      d'un AS) : une seule
      administration, des choix cohérents. RIP, OSPF, IS-IS\ldots
      Chaque opérateur choisit le sien.
    \item<3->EGP (\foreign{Exterior Gateway Protocol}, entre AS) :
      multi-organisations, pas de chef, pas d'uniformité. Forcément un
      seul, BGP.
    \end{itemize}
    \end{overlayarea}  
  \end{frame} 

  \begin{frame}
    \frametitle{Les préfixes IP}
     \begin{overlayarea}{\textwidth}{.6\textheight}
    \begin{itemize}
    \item<2->Les RIR (\foreign{Regional Internet Registry}) attribuent
      les préfixes IP. En Europe, le RIR est le RIPE-NCC.  
    \item<3->Un opérateur est un LIR (\foreign{Local Internet
      Registry}). Il est membre du RIR.
    \item<4->Le LIR demande des préfixes au RIR, qui garde la base de
      données des préfixes alloués.
    \item<5->On peut récupérer cette information avec whois ou RDAP.
    \end{itemize}
    \end{overlayarea}  
  \end{frame}

\begin{frame}[fragile]
    \frametitle{whois}
\begin{info}
% whois 2001:678:c::1
...
inet6num:       2001:678:c::/48
netname:        NIC-FR-DNS-ANYCAST-AFNIC-V6
country:        FR
org:            ORG-AFpl1-RIPE
created:        2009-06-03T15:13:50Z
last-modified:  2016-04-14T09:47:44Z

organisation:   ORG-AFpl1-RIPE
org-name:       AFNIC (Association Francaise pour le Nommage Internet en Cooperation)
org-type:       LIR
address:        Immeuble Le Stephenson 1 rue Stephenson
address:        78180
address:        Montigny-le-Bretonneux
address:        FRANCE
...  
\end{info}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Et avec RDAP}
  \begin{info}
%  curl -s https://rdap.lacnic.net/rdap/ip/2800:1f0:8000::4 | \
   jq .events
[
  {
    "eventAction": "registration",
    "eventDate": "2007-12-27T14:00:00Z"
  },
  {
    "eventAction": "last changed",
    "eventDate": "2011-11-30T21:45:00Z"
  }
]
  \end{info}
  Avantage : format de sortie analysable par un programme.
\end{frame}
  
\section{Le protocole}

\begin{frame}
  \frametitle{Principes de base}
  \emph{Border Gateway Protocol}, RFC 4271
   \begin{overlayarea}{\textwidth}{.6\textheight}
   \begin{itemize}
   \item<2->Deux routeurs décident de s'appairer,
   \item<3->Ils établissent une connexion TCP, port 179\only<3>{ (ces
     connexions peuvent durer des semaines)},
   \item<4->Ils annoncent les nouveautés, nouvelles routes
     (\computer{ANNOUNCE}) et routes supprimées (\computer{WITHDRAW}),
   \item<5->BGP transmet uniquement les nouveautés.  
   \end{itemize}
 \end{overlayarea}   
\end{frame}

\begin{frame}[fragile]
  \frametitle{Exemple d'une annonce BGP}
  (Format de bgpdump, à partir de MRT, RFC 6396)
  \begin{info}
TIME: 01/01/18 00:00:57
TYPE: BGP4MP/MESSAGE/Update
FROM: 66.185.128.1 AS1668
TO: 128.223.51.102 AS6447
ASPATH: 1668 10310 3356 16637
NEXT_HOP: 66.185.128.1
ANNOUNCE
  41.181.164.0/24
  41.181.174.0/24

TIME: 01/01/18 00:00:57
TYPE: BGP4MP/MESSAGE/Update
FROM: 196.7.106.245 AS2905
TO: 128.223.51.102 AS6447
WITHDRAW
  41.180.0.0/16
\end{info}
\end{frame}

\begin{frame}
  \frametitle{Les chemins d'AS}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->Le chemin d'AS se lit de droite à gauche,
  \item<3->Chaque routeur ajoute son AS avant de propager aux pairs,
  \item<4->Le premier AS\only<4>{ (tout à droite)} est l'origine.  
  \end{itemize}
  \end{overlayarea}  
\end{frame}

\begin{frame}
  \frametitle{Décisions}
     \begin{overlayarea}{\textwidth}{.6\textheight}
       \begin{itemize}
         \item<1->Le routeur refuse les annonces qui incluent son AS. Ensuite,
         \item<2->S'il y a plusieurs possibilités pour un même
           préfixe,
         \item<3->On prend celle ayant la meilleure
           préférence locale,
         \item<4->Si égalité, on prend la route ayant le chemin d'AS le plus
           court,
         \item<5->Si égalité, on prend celle émise par le routeur
           ayant le plus petit identificateur BGP.  
       \end{itemize}
       (L'algorithme est ici simplifié, il y a d'autres critères.)
 \end{overlayarea}   
\end{frame}

\begin{frame}
  \frametitle{Envoi au voisin/pair}
     \begin{overlayarea}{\textwidth}{.6\textheight}
       \begin{itemize}
         \item<2->Le routeur BGP propage ensuite l'annonce à ses
           voisins,
         \item<3->Au bout de quelques minutes, tous les routeurs
           l'auront reçu\only<3>{ (le test de la présence de son AS
             évite les boucles)},  
         \item<4->Accceptation et propagation sont contrôlés par une
           politique locale. BGP est du routage politique, plus que technique. 
   \end{itemize}
 \end{overlayarea}   
\end{frame}

\begin{frame}
  \frametitle{Pas de vision globale}
   \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->Les routeurs ne connaissent donc pas tout le réseau\only<2>{ (≠
    OSPF), puisque chacun ne transmet que les routes sélectionnées},
  \item<3->Les routeurs n'ont pas tous exactement la même information,
  \item<4->Quand on observe, il faut donc toujours dire depuis quel routeur.
  \end{itemize}
   \end{overlayarea}  
\end{frame}

% TODO Si on a le temps, parler des techniques pour influencer le
% routage entrant, par exemple le prepending.

\begin{frame}[fragile]
  \frametitle{Configuration d'un routeur BGP}
BIRD sur Unix
\begin{info}
router id 192.0.2.1;
protocol static static_bgp { 
        import all;
        route 192.0.2.0/24 reject;
}
protocol bgp_64510 {
        import all;
        export where proto = "static_bgp";
        local as 64496;
        neighbor 203.0.113.101 as 64510;
}
protocol bgp_64511 {
        import all;
        export where proto = "static_bgp";
        local as 64496;
        neighbor 203.0.113.128 as 64511;
}
\end{info}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Configuration d'un routeur BGP, suite}
  Cisco IOS
\begin{info}
router bgp 64497
bgp router-id 198.51.100.1
neighbor 2001:db8:36a::1:1 remote-as 64508
neighbor 2001:db8:ff99:f53d::126 remote-as 64509

address-family ipv6
  neighbor 2001:db8:36a::1:1  activate
  neighbor 2001:db8:ff99:f53d::126 activate
  network 2001:db8:42::/48
exit-address-family
\end{info}
\end{frame}

\begin{frame}
  \frametitle{Attention avec les exemples simples}
  \begin{block}
    {Ils ne présentent aucune sécurité (pas de filtrage).}
    {Une configuration BGP est souvent simple mais doit être étudiée soigneusement.}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Communautés}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->RFC 1997,
  \item<3->Des étiquettes qu'on attache aux annonces,
  \item<4->Servent à tout : indiquer où la route a été apprise, quel
    est le traitement souhaité\ldots
  \item<5->Traditionnellement sous la forme \path{AS:XXX},
  \item<6->La sémantique dépend de l'AS, sauf pour les communautés
    bien connues.  
  \end{itemize}
\end{overlayarea}  
\end{frame}

\begin{frame}[fragile]
  \frametitle{Annonce avec communautés}
\begin{info}
TIME: 02/17/17 15:00:00
TYPE: BGP4MP/MESSAGE/Update
FROM: 208.51.134.246 AS3549
TO: 128.223.51.102 AS6447
ASPATH: 3549 3356 2914 30259
NEXT_HOP: 208.51.134.246
ATOMIC_AGGREGATE
AGGREGATOR: AS30259 10.11.1.1
COMMUNITY: 2914:410 2914:1001 2914:2000 2914:3000 3356:3 3356:86
    3356:575 3356:666 3356:2011 3356:11940 3549:2011 3549:2017
    3549:2521 3549:2582 3549:2950 3549:2991 3549:30840 3549:31826
    3549:32344 3549:33036 3549:34076
WITHDRAW
  93.181.192.0/19
ANNOUNCE
  199.193.160.0/22
\end{info}
\end{frame}

\begin{frame}
  \frametitle{Communautés bien connues}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->0xFFFFFF01 (alias NO\_EXPORT\only<2>{ : ne pas transmettre
    cette annonce en dehors de son AS}),
  \item<3->0xFFFFFF02 (NO\_ADVERTISE\only<3>{, ne transmettre cette
    annonce à aucun autre routeur}),
  \item<4->0xFFFF029A (BLACKHOLE\only<4>{, jetez-moi le trafic vers ce
    préfixe, RFC 7999}).
  \end{itemize}
  \end{overlayarea}  
\end{frame}

\begin{frame}
  \frametitle{Trouver la documentation sur les communautés}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->Site Web de l'opérateur. Exemple
    \url{http://www.us.ntt.net/support/policy/routing.cfm}.\only<2>{ Notez le \foreign{European country origins} (là où la route a été apprise), qui
      peut permettre de faire du routage Schengen.}
      \item<3->Une liste assez complète en \url{https://onestep.net/communities/}
    \item<4->whois.  
  \end{itemize}
 \end{overlayarea}  
\end{frame}

\begin{frame}[fragile]
  \frametitle{Exemple communautés avec whois}
\begin{info}
% whois AS51706
...
aut-num:        AS51706
as-name:        FRANCE-IX-AS
...
remarks:        The following communities can be used by members:
...
remarks:        0:peer-as = Don't send route to this peer as
remarks:        51706:peer-as = Send route to this peer as
remarks:        0:51706 = Don't send route to any peer
remarks:        51706:51706 = Send route to all peers

remarks:        51706:64601 = Prefix received from a peer on RS1 Paris
remarks:        51706:64602 = Prefix received from a peer on RS2 Paris
remarks:        51706:64611 = Prefix received from a peer on RS1 Marseille
remarks:        51706:64612 = Prefix received from a peer on RS2 Marseille
...
\end{info}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Filtrage des annonces}
  Il est important de filtrer les annonces entrantes (ne pas se
  laisser envoyer n'importe quoi) et sortantes (ne pas envoyer
  n'importe quoi). RFC 7454

  Juniper :
  \begin{info}
policy-statement no-small-and-big-prefixes {
        from {
            route-filter 0.0.0.0/0 prefix-length-range /25-/32 reject;
            route-filter 0.0.0.0/0 prefix-length-range /0-/7 reject;
        }
}
protocols {
            bgp {
               ...
               import no-small-and-big-prefixes;
\end{info}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Un filtre utile, le nombre maximal de préfixes}
\begin{info}
group My-Nice-Peer {
    family inet {
        unicast {
            prefix-limit {
               maximum 100;
            }
	}
}
\end{info}
\end{frame}

\begin{frame}[fragile]
\frametitle{BGP est politique}
Applications de politiques locales

Cisco :
\begin{info}
!--- Sets community 100:300 for routes matching access-list 101.
route-map Peer-R1 permit 10
 match ip address 101
 set community 100:300

!--- Sets local preference 130 for all routes
!--- matching community list 1.
route-map Peer-R3 permit 10
 match community 1
 set local-preference 130
\end{info}
\end{frame}

% TODO Si on a le temps, parler de l'amortissement (dampening)

% TODO Si on a le temps, parler des serveurs de routes

\section{Opérationnel}

\begin{frame}
  \frametitle{Tout est transparent, tout (?) est public}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->Du moment qu'on a un routeur BGP connecté à la DFZ\only<2>{
    (\foreign{Default-Free Zone})}, on a l'information. 
  \item<3->Pas de routeur BGP dans la DFZ ? Pas grave, plusieurs
    services vous y permettent un accès.
  \item<4->C'est ainsi qu'on a pu voir en octobre 2017 que la Corée
    du Nord avait un nouveau transitaire, un russe.  % http://www.bortzmeyer.org/star-jv-transtelecom.html
  \item<5->Mais attention : pas de vue unique en BGP. Un routeur peut
    ne pas tout voir.  
  \end{itemize}
  \end{overlayarea}  
\end{frame}

\begin{frame}
  \frametitle{Looking glasses}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->Un \foreign{looking glass} est un service donnant accès à
    un routeur en temps réel pour voir ce qu'il voit.
  \item<3->Si ce routeur est sur la DFZ, vous voyez la DFZ.  
  \end{itemize}
\end{overlayarea}  
\end{frame}

\begin{frame}[fragile]
  \frametitle{Looking glass avec telnet}
  \begin{info}
% telnet route-views.oregon-ix.net
route-views>show ip bgp  175.45.176.15
BGP routing table entry for 175.45.176.0/24, version 395583
  4826 174 701 4837 131279
    114.31.199.1 from 114.31.199.1 (114.31.199.1)
      Origin IGP, localpref 100, valid, external
      Community: 174:21000 174:22013 4826:5901 4826:6150 4826:59011
      rx pathid: 0, tx pathid: 0
...
  \end{info}
\end{frame}

\begin{frame}
  \frametitle{Looking glass sur le Web}
  Chez Hurricane Electric \path{https://lg.he.net/}
  \includegraphics[scale=0.40]{he-lg.png}
\end{frame}

\begin{frame}
  \frametitle{RIPE stat}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->
    \url{https://stat.ripe.net/} vous donne accés aux routeurs du RIS
    (réseau de sondes BGP),
     \item<3->Jolie interface Web, très chargée en JavaScript compliqué.
  \end{itemize}
  \end{overlayarea}  
\end{frame}

\begin{frame}
  \includegraphics[scale=0.31]{ripe-stat-glance.png}
\end{frame}

\begin{frame}
  \includegraphics[scale=0.5]{ripe-stat-routing-status.png}
\end{frame}

\begin{frame}
  \includegraphics[scale=0.5]{ripe-stat-routing-activity.png}
\end{frame}

\begin{frame}
  \frametitle{RouteViews}
  \url{http://www.routeviews.org/}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->\foreign{Looking glass} telnet,
  \item<3->Annonces BGP au format MRT, et tables BGP complètes,
    archivées\only<3>{ (génial pour les chercheurs et les étudiants)},
  \item<4->Divers services, comme une passerelle DNS.  
  \end{itemize}
\end{overlayarea}  
\end{frame}

\begin{frame}[fragile]
  \frametitle{La passerelle DNS de RouteViews}
  Utilisation de \dns{aspath.routeviews.org}
\begin{info}
% bgproute 185.26.126.156
AS path: 2905 6939 29169
Route: 185.26.124.0/22
\end{info}
bgproute est juste un petit script qui appelle dig.
\end{frame}

\begin{frame}[fragile]
\frametitle{Utilisation du serveur whois de Cymru}
Trouver le numéro d'AS à partir d'une adresse IP :
\begin{info}
% whois -h whois.cymru.com 2001:4b98:dc2:45:216:3eff:fe4b:8c5b
AS      | IP                                       | AS Name
29169   | 2001:4b98:dc2:45:216:3eff:fe4b:8c5b      | GANDI-AS Registrar 
\end{info}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Statistiques sur la DFZ avec RouteViews}
  On importe la table dans PostgreSQL et (au 9 janvier 2018) : % http://www.bortzmeyer.org/bgp-more-specifics.html
  
    \begin{info}
bgp=> SELECT count(*) FROM Prefixes;
794880

bgp=>  SELECT count(*) FROM Prefixes WHERE family(pfx) = 4;
743916

bgp=>  SELECT count(*) FROM Prefixes WHERE family(pfx) = 6;
50964
    \end{info}
\end{frame}

\begin{frame}
  \frametitle{Plein de recherches possibles}
  Par exemples celles de Geoff Huston \url{https://bgp.potaroo.net/} :
  \includegraphics[scale=0.60]{huston-bgp-active.png}
\end{frame}

\section{Sécurité}

\begin{frame}[fragile]
  \frametitle{Sécurité}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->Par défaut, BGP croit tout ce qu'on lui raconte. « Pour
    parler à 8.8.8.8, passe par moi. »
   \item<3->Ce n'est \emph{pas} le résultat d'un oubli, c'est une
     conséquence de l'absence de hiérarchie, et de la complexité des
     relations.
   \item<4->Mais cela permet des erreurs, et des attaques.  
  \end{itemize}
  \end{overlayarea}  
\end{frame}

\begin{frame}
  \frametitle{Les fuites}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->(\foreign{Leaks} )
  \item<3->Un routeur (ré-)annonce des routes qu'il n'aurait pas dû
    annoncer.
  \item<4->Exemple : un client de deux transitaires annonce à un des
    transitaires les routes reçues de l'autre, attirant ainsi tout le
    trafic.
  \item<5->Un grand classique de l'Internet. Une fuite massive arrive
    tous les deux ou trois ans.
  \item<6->Dernier exemple : Google en août 2017, annonçant les
    préfixes de points d'échange.  %   https://bgpmon.net/bgp-leak-causing-internet-outages-in-japan-and-beyond/
  \end{itemize}
\end{overlayarea}  
\end{frame}

\begin{frame}[fragile]
  \frametitle{Autre fuite : Telekom Malaysia (AS 4788)}
  \begin{itemize}
  \item<2->Juin 2015 % http://www.bortzmeyer.org/bgp-malaisie.html
  \item<3->Annnonce de 200 000 routes\only<3>{ (le tiers de la DFZ)}
  \end{itemize}
    \begin{info} 
TIME: 06/12/15 08:43:29
TYPE: BGP4MP/MESSAGE/Update
FROM: 208.51.134.246 AS3549
TO: 128.223.51.102 AS6447
ORIGIN: IGP
ASPATH: 3549 4788 3491 4651 9737 23969
NEXT_HOP: 208.51.134.246
COMMUNITY: 3549:4992 3549:7000 3549:7003 3549:7004 354
9:32344 4788:400 4788:410 4788:415
ANNOUNCE
  1.0.208.0/22
  1.0.212.0/23
  1.1.176.0/22
  ...   
  \end{info}
\end{frame}

\begin{frame}
  \frametitle{Détournement BGP}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->Une annonce incorrecte est en général une erreur.\only<2>{ « Il y a
    davantage d'incompétents que de malhonnêtes. »}
  \item<3->Mais cela peut aussi être une attaque.
  \item<4->En général, on ne sait pas\only<4>{ (sauf si on est Fox
    News ou BFM TV)}. 99 \% des articles et reportages sont de la pure spéculation. 
  \end{itemize}
\end{overlayarea}  
\end{frame}

\begin{frame}[fragile]
  \frametitle{Détournement qui peut être une attaque}
  \begin{itemize}
  \item<2->Décembre 2017, 80 préfixes mais que des boîtes sensibles,
    annoncées par l'AS 39523 (DV-LINK, en Russie). % https://bgpmon.net/popular-destinations-rerouted-to-russia/
  \item<3->Mars 2014, détournement des préfixes de mineurs Bitcoin,
    peut-être pour voler des bitcoins.  % http://www.secureworks.com/cyber-threat-intelligence/threats/bgp-hijacking-for-cryptocurrency-profit/
  \end{itemize}
Le préfixe OVH 142.4.195.0/24 est utilisé par le \foreign{pool} de
mineurs Bitcoin Hashfaster.
  \begin{info}
TIME: 03/23/14 18:32:38
TYPE: BGP4MP/MESSAGE/Update
FROM: 195.66.224.21 AS6939
TO: 195.66.225.222 AS6447
ASPATH: 6939 21548 34272 2093 2871 3721
NEXT_HOP: 195.66.224.21
ANNOUNCE
...
  142.4.195.0/24
  107.170.47.0/24
  54.194.173.0/24
...   
  \end{info}
\end{frame}

\begin{frame}
  \frametitle{Détecter les problèmes}
  Tout est public, donc tout peut être supervisé
  
  Ici, avec le système d'alarme BGPmon :   \includegraphics[scale=0.41]{bgpmon-alarm.png}
\end{frame}

\begin{frame}
  \frametitle{BGPstream et ses alarmes sur Twitter}
  \includegraphics[scale=0.38]{bgpstream.png}
\end{frame}

% TODO Mentionner les autres systèmes d'alarme ?

\begin{frame}
  \frametitle{Réagir aux problèmes}
  \begin{itemize}
  \item<2->Les incidents sont relativement fréquents,
  \item<3->Mais la plupart ne durent pas : les techniciens agissent,
  \item<4->La vraie sécurité de BGP, ce sont eux.
  \end{itemize}
  \includegraphics[scale=0.29]{bgpstream-ovh.png}
\end{frame}

\begin{frame}
  \frametitle{Empêcher les problèmes, les IRR}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->Filtrer les routes selon le contenu des IRR\only<2>{
    (\foreign{Internet Routing Registry})},
  \item<3->Cela suppose que les opérateurs maintiennent le contenu des
    IRR à jour\only<3>{, ce qui n'est pas le cas},
  \item<4->Les IRR peuvent utiliser un langage plus perfectionné,
    RPSL\only<4>{ (RFC 2622)},
  \item<5->Il existe de nombreux IRR.  
  \end{itemize}
  \end{overlayarea}  
\end{frame}

\begin{frame}[fragile]
  \frametitle{Exemple d'une entrée IRR simple}
  \begin{info}
route6:         2001:4b98::/32
descr:          GANDI is an ICANN accredited registrar
descr:          GANDI is a virtual server provider
descr:          for more information:
descr:          Web:   http://www.gandi.net
origin:         AS29169
mnt-by:         GANDI-NOC
created:        2009-06-15T16:04:25Z
last-modified:  2009-06-15T16:04:25Z
source:         RIPE  
  \end{info}
Les deux lignes importantes sont route6 et origin.
\end{frame}

\begin{frame}
  \frametitle{Empêcher les problèmes, avec la RPKI}
  L'idée de base est de partir d'assertions, arborescentes, et
  cryptographiquement signées.
  \begin{enumerate}
  \item IANA : « RIPE-NCC gère 192.0.0.0/8 »,
  \item RIPE-NCC : « le FAI Example est titulaire de 192.0.2.0/24 »,
  \item Example : « l'AS 64641 est autorisé à être l'origine d'une
    annonce de 192.0.2.0/24 » (cette dernière assertion étant un ROA, \foreign{Route Origin
Authorizations}).
  \end{enumerate}
\end{frame}

\begin{frame}
  \frametitle{On met ces assertions dans la RPKI}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->RPKI = \foreign{Resource Public Key Infrastructure}, RFC 6481,
  \item<3->Parmi elles, les ROA (RFC 6482) indiquent l'AS d'origine
    utilisé,
  \item<4->La RPKI est ensuite distribuée chez chaque opérateur,  
  \item<5->On peut donc prouver cryptographiquement les autorisations.  
  \end{itemize}
\end{overlayarea}  
\end{frame}

\begin{frame}
  \frametitle{RPKI et ROA en pratique}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->En dehors de l'Europe, peu de gens signent,
  \item<3->Peu de gens valident.  
  \end{itemize}
  \end{overlayarea}  
\end{frame}

\section{Conclusion}

\begin{frame}
  \frametitle{L'infrastructure de l'Internet}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item<2->BGP fonctionne depuis des années,
  \item<3->Il s'est montré très robuste (l'Internet n'est pas un
    environnement facile !),  
  \item<4->Il n'est pas parfait mais attention si vous croyez faire
    mieux : relisez bien le cahier des charges d'abord !
  \end{itemize}
\end{overlayarea}  
\end{frame}

\begin{frame}
  \frametitle{Bonnes lectures}
  \begin{overlayarea}{\textwidth}{.6\textheight}
  \begin{itemize}
  \item La conférence BGP de Sarah Nataf
    \url{http://www.iletaitunefoisinternet.fr/bgp-sarah-nataf/},
   \item Le rapport sur la résilience de l'Internet en France, avec
     notamment plein de chiffres BGP
     \url{https://urlz.fr/6mYx}, % https://www.ssi.gouv.fr/agence/rayonnement-scientifique/lobservatoire-de-la-resilience-de-linternet-francais/
  \item Le guide des bonnes pratiques de l'ANSSI
    \url{https://urlz.fr/6mYu}, % https://www.ssi.gouv.fr/administration/guide/le-guide-des-bonnes-pratiques-de-configuration-de-bgp/
   \item La conférence \foreign{BGP and the rule of custom} au CCC
     \url{https://media.ccc.de/v/34c3-9072-bgp_and_the_rule_of_custom}
    % ``Protocols are, at their root, systems of governance'' Also
    % ``Peerings between Tier-1 is a bit like marriages between
    % wealthy families.''
  \item \url{https://bgpmon.net/}, \url{https://dyn.com/blog/} et
    \url{https://labs.ripe.net/} pour les nouvelles et les
    analyses. \url{https://twitter.com/bgpstream} pour suivre en temps
    réel. Listes de diffusion FRnog et Nanog.
  \end{itemize}
  \end{overlayarea}  
\end{frame}

% TODO Si besoin d'un exemple de problème avec analyse en livre, et
% https://bgpstream.com/event/122918
\end{document}
