slides: no step-by-step reveals; UPDATE example is 2a0d:d740::/48 at SwissIX

- Removed every fragment and stepped code highlight: a slide now shows
  everything at once. Two code blocks keep a static highlight on one line.
- Dropped "What stands between you and an outage".
- The UPDATE walked through in section 3 is now 2a0d:d740::/48 as AS210036
  announces it to the SwissIX route servers: next hop 2001:7f8:24::c9
  (pr01's port on the peering LAN), AS path 210036, MED 0 and 210036:10:2,
  matching what pr01's export filter puts on routes to peers. Encoded with
  the packet crate and parsed back to the identical message; the slide
  generator asserted every quoted number, including the next hop, against
  the bytes. Adds a MULTI_EXIT_DISC slide to the walkthrough.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Rayhaan JaufeerallyandClaude Fable 5.1 committed 2026-09-20 21:48:12 +02:00
1 parent 1399cbd39f
commit 9d6996c6c1
7 files changed
+83 -91

No files matched your search

+12 -6
View File
@@ -19,10 +19,18 @@ chain of nodes and links, an AS path.
| IP transit and Internet exchanges | `sections/04-transit-and-ix.md` | | IP transit and Internet exchanges | `sections/04-transit-and-ix.md` |
| The lab: ferrix, pr01.rue and its exchanges | `sections/05-lab.md` | | The lab: ferrix, pr01.rue and its exchanges | `sections/05-lab.md` |
The UPDATE in section 3 is a real one captured from ferrix. Its byte slides The UPDATE in section 3 is `2a0d:d740::/48` as AS210036 announces it to the
step through it one part at a time (press down); every number on them was SwissIX route servers: next hop `2001:7f8:24::c9` (pr01's port on the peering
checked against the capture when the slides were generated. If you replace the LAN), MED 0 and the `210036:10:2` tag, which is what pr01's export filter puts
capture, regenerate rather than edit the hex by hand. on routes to peers. It was produced with ferrix's own encoder and parsed back
to the same message, not captured off the wire; a capture from pr01 may differ
in detail (BIRD can append a link-local next hop). The byte slides step through
it one part at a time (press down), and every number on them was checked
against the bytes when the slides were generated. To change the example,
regenerate rather than edit the hex by hand.
The deck deliberately has no fragments or stepped code: a slide shows
everything at once. Two code blocks keep a static highlight on one line.
| File | Holds | | File | Holds |
|---|---| |---|---|
@@ -75,8 +83,6 @@ Apply a class to the element above with `<!-- .element: class="..." -->`.
| Class | Effect | | Class | Effect |
|---|---| |---|---|
| `fragment` | appears on the next click |
| `fragment pop` | appears, grows and takes the accent colour |
| `big` | one large statement on the slide | | `big` | one large statement on the slide |
| `note` | quiet italic aside | | `note` | quiet italic aside |
| `attribution` | small credit under an image or quote | | `attribution` | small credit under an image or quote |
+3 -3
View File
@@ -29,7 +29,7 @@ Ask: why only once? Because 2a0d::1::1 could put the zeros in several places.
<p class="bits"><span class="fixed">2a0d:d741:0001</span><span class="free">xxxx:xxxx:xxxx:xxxx:xxxx</span></p> <p class="bits"><span class="fixed">2a0d:d741:0001</span><span class="free">xxxx:xxxx:xxxx:xxxx:xxxx</span></p>
The first <span class="fragment pop">48</span> bits are fixed. The other 80 are yours. The first **48** bits are fixed. The other 80 are yours.
Notes: Notes:
2^80 addresses in one student prefix. About 1.2 million billion billion. 2^80 addresses in one student prefix. About 1.2 million billion billion.
@@ -48,7 +48,7 @@ The /n is a count of leading bits, nothing more.
`<n>` is your student number, written *in hex*. `<n>` is your student number, written *in hex*.
<!-- .element: class="fragment note" --> <!-- .element: class="note" -->
Notes: Notes:
Student 10 is 2a0d:d741:a::/48, student 16 is 2a0d:d741:10::/48. Student 10 is 2a0d:d741:a::/48, student 16 is 2a0d:d741:10::/48.
@@ -58,7 +58,7 @@ A /40 holds exactly 256 /48s, which caps the class size at 255.
## The most specific route wins ## The most specific route wins
```text [1-3|3] ```text [3]
2a0d:d740::/29 via AS210036 the aggregate 2a0d:d740::/29 via AS210036 the aggregate
2a0d:d741::/40 via AS210036 the lab 2a0d:d741::/40 via AS210036 the lab
2a0d:d741:1::/48 via AS210036 AS… student 1 <-- chosen for 2a0d:d741:1::1 2a0d:d741:1::/48 via AS210036 AS… student 1 <-- chosen for 2a0d:d741:1::1
+6 -6
View File
@@ -26,14 +26,14 @@ an RIR, typically an ISP. Our space comes from RIPE NCC via an LIR.
## AS numbers ## AS numbers
* 16 bits at first: `1` to `65535` <!-- .element: class="fragment" --> * 16 bits at first: `1` to `65535`
* 32 bits since RFC 6793: up to `4294967295` <!-- .element: class="fragment" --> * 32 bits since RFC 6793: up to `4294967295`
* Old routers see `AS23456` (AS_TRANS) in place of a big one <!-- .element: class="fragment" --> * Old routers see `AS23456` (AS_TRANS) in place of a big one
* Private use: `64512–65534` and `4200000000–4294967294` <!-- .element: class="fragment" --> * Private use: `64512–65534` and `4200000000–4294967294`
The lab daemon is `AS4200000001`. It is stripped before the Internet sees your route. The lab daemon is `AS4200000001`. It is stripped before the Internet sees your route.
<!-- .element: class="fragment note" --> <!-- .element: class="note" -->
Notes: Notes:
RFC 6996 reserves the private ranges. The upstream router removes the private RFC 6996 reserves the private ranges. The upstream router removes the private
@@ -43,7 +43,7 @@ AS from the path, so the origin everybody else sees is AS210036.
## The RIPE database says who may announce what ## The RIPE database says who may announce what
```text [1-5|3] ```text [3]
route6: 2a0d:d741:1::/48 route6: 2a0d:d741:1::/48
descr: ETHZ Netsec 2026 BGP lab - student 1 descr: ETHZ Netsec 2026 BGP lab - student 1
origin: AS210036 origin: AS210036
+45 -24
View File
@@ -7,10 +7,10 @@ Section 3. The aim: by the end, the bytes view on the lab page reads like text.
## BGP in one slide ## BGP in one slide
* Runs over TCP, port `179`, between neighbours you configure by hand <!-- .element: class="fragment" --> * Runs over TCP, port `179`, between neighbours you configure by hand
* Each side tells the other its best route per prefix <!-- .element: class="fragment" --> * Each side tells the other its best route per prefix
* Only *changes* are sent: no periodic refresh <!-- .element: class="fragment" --> * Only *changes* are sent: no periodic refresh
* If the session drops, every route learned over it is gone <!-- .element: class="fragment" --> * If the session drops, every route learned over it is gone
Notes: Notes:
No discovery, no authentication of content, no notion of truth. A neighbour No discovery, no authentication of content, no notion of truth. A neighbour
@@ -29,7 +29,7 @@ says "I can reach X" and you believe it, subject to your filters.
OPEN, OPEN, KEEPALIVE, KEEPALIVE, and then it is all UPDATEs. OPEN, OPEN, KEEPALIVE, KEEPALIVE, and then it is all UPDATEs.
<!-- .element: class="fragment note" --> <!-- .element: class="note" -->
Notes: Notes:
There is a fifth, ROUTE-REFRESH: "send me everything again, my policy changed". There is a fifth, ROUTE-REFRESH: "send me everything again, my policy changed".
@@ -51,41 +51,43 @@ One UPDATE carries one set of attributes, and every prefix that shares them.
----- -----
## A real one: 94 bytes ## A real one: 89 bytes
<div class="legend"><span class="hh">header</span><span class="hl">lengths</span><span class="ha">path attributes</span><span class="hn">NLRI</span></div> <div class="legend"><span class="hh">header</span><span class="hl">lengths</span><span class="ha">path attributes</span><span class="hn">NLRI</span></div>
<pre class="bytes"><span class="hh">ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff</span> <span class="hh">00 5e</span> <span class="hh">02</span> <span class="hl">00 00</span> <span class="hl">00 47</span> <span class="ha">40 01 01 00</span> <span class="ha2">40 02 06 02 01 fa 56 ea 01</span> <span class="ha">80 0e 1c 00 02 01 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 30 2a 0d d7 41 00 01</span> <span class="ha2">c0 20 18 00 03 34 74 00 00 00 00 00 00 00 00 00 03 34 74 00 00 00 01 00 00 a5 ec</span></pre> <pre class="bytes"><span class="hh">ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff</span> <span class="hh">00 59</span> <span class="hh">02</span> <span class="hl">00 00</span> <span class="hl">00 42</span> <span class="ha">40 01 01 00</span> <span class="ha2">40 02 06 02 01 00 03 34 74</span> <span class="ha">80 04 04 00 00 00 00</span> <span class="ha2">80 0e 1c 00 02 01 10 20 01 07 f8 00 24 00 00 00 00 00 00 00 00 00 c9 00 30 2a 0d d7 40 00 00</span> <span class="ha">c0 20 0c 00 03 34 74 00 00 00 0a 00 00 00 02</span></pre>
`2a0d:d741:1::/48`, as the lab daemon sent it. The same view is on the lab page under *bytes*. `2a0d:d740::/48`, as AS210036 announces it to the SwissIX route servers.
<!-- .element: class="note" --> <!-- .element: class="note" -->
Notes: Notes:
Captured from ferrix, not typed. Press down to walk through it part by part. Built with the lab daemon's own encoder and checked by parsing it back, with
Note there is nothing yellow: the NLRI field is empty. Hold that thought. the attributes pr01 puts on routes it exports to peers. Press down to walk
through it part by part. Note there is nothing yellow: the NLRI field is
empty. Hold that thought.
--- ---
## Header ## Header
<pre class="bytes focus"><span class="hh on">ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff</span> <span class="hh on">00 5e</span> <span class="hh on">02</span> <span class="hl">00 00</span> <span class="hl">00 47</span> <span class="ha">40 01 01 00</span> <span class="ha2">40 02 06 02 01 fa 56 ea 01</span> <span class="ha">80 0e 1c 00 02 01 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 30 2a 0d d7 41 00 01</span> <span class="ha2">c0 20 18 00 03 34 74 00 00 00 00 00 00 00 00 00 03 34 74 00 00 00 01 00 00 a5 ec</span></pre> <pre class="bytes focus"><span class="hh on">ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff</span> <span class="hh on">00 59</span> <span class="hh on">02</span> <span class="hl">00 00</span> <span class="hl">00 42</span> <span class="ha">40 01 01 00</span> <span class="ha2">40 02 06 02 01 00 03 34 74</span> <span class="ha">80 04 04 00 00 00 00</span> <span class="ha2">80 0e 1c 00 02 01 10 20 01 07 f8 00 24 00 00 00 00 00 00 00 00 00 c9 00 30 2a 0d d7 40 00 00</span> <span class="ha">c0 20 0c 00 03 34 74 00 00 00 0a 00 00 00 02</span></pre>
<table class="decode"><tr><td>ff × 16</td><td>marker. Once carried authentication, now just filler to find message boundaries</td></tr><tr><td>00 5e</td><td>length of the whole message: 94 bytes (maximum 4096)</td></tr><tr><td>02</td><td>type 2 = UPDATE</td></tr></table> <table class="decode"><tr><td>ff × 16</td><td>marker. Once carried authentication, now just filler to find message boundaries</td></tr><tr><td>00 59</td><td>length of the whole message: 89 bytes (maximum 4096)</td></tr><tr><td>02</td><td>type 2 = UPDATE</td></tr></table>
--- ---
## Two lengths ## Two lengths
<pre class="bytes focus"><span class="hh">ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff</span> <span class="hh">00 5e</span> <span class="hh">02</span> <span class="hl on">00 00</span> <span class="hl on">00 47</span> <span class="ha">40 01 01 00</span> <span class="ha2">40 02 06 02 01 fa 56 ea 01</span> <span class="ha">80 0e 1c 00 02 01 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 30 2a 0d d7 41 00 01</span> <span class="ha2">c0 20 18 00 03 34 74 00 00 00 00 00 00 00 00 00 03 34 74 00 00 00 01 00 00 a5 ec</span></pre> <pre class="bytes focus"><span class="hh">ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff</span> <span class="hh">00 59</span> <span class="hh">02</span> <span class="hl on">00 00</span> <span class="hl on">00 42</span> <span class="ha">40 01 01 00</span> <span class="ha2">40 02 06 02 01 00 03 34 74</span> <span class="ha">80 04 04 00 00 00 00</span> <span class="ha2">80 0e 1c 00 02 01 10 20 01 07 f8 00 24 00 00 00 00 00 00 00 00 00 c9 00 30 2a 0d d7 40 00 00</span> <span class="ha">c0 20 0c 00 03 34 74 00 00 00 0a 00 00 00 02</span></pre>
<table class="decode"><tr><td>00 00</td><td>0 bytes of withdrawn routes: nothing is being taken back</td></tr><tr><td>00 47</td><td>71 bytes of path attributes follow</td></tr><tr><td></td><td>94 − 19 − 2 − 2 − 71 = 0 bytes left over for NLRI</td></tr></table> <table class="decode"><tr><td>00 00</td><td>0 bytes of withdrawn routes: nothing is being taken back</td></tr><tr><td>00 42</td><td>66 bytes of path attributes follow</td></tr><tr><td></td><td>89 − 19 − 2 − 2 − 66 = 0 bytes left over for NLRI</td></tr></table>
--- ---
## ORIGIN ## ORIGIN
<pre class="bytes focus"><span class="hh">ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff</span> <span class="hh">00 5e</span> <span class="hh">02</span> <span class="hl">00 00</span> <span class="hl">00 47</span> <span class="ha on">40 01 01 00</span> <span class="ha2">40 02 06 02 01 fa 56 ea 01</span> <span class="ha">80 0e 1c 00 02 01 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 30 2a 0d d7 41 00 01</span> <span class="ha2">c0 20 18 00 03 34 74 00 00 00 00 00 00 00 00 00 03 34 74 00 00 00 01 00 00 a5 ec</span></pre> <pre class="bytes focus"><span class="hh">ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff</span> <span class="hh">00 59</span> <span class="hh">02</span> <span class="hl">00 00</span> <span class="hl">00 42</span> <span class="ha on">40 01 01 00</span> <span class="ha2">40 02 06 02 01 00 03 34 74</span> <span class="ha">80 04 04 00 00 00 00</span> <span class="ha2">80 0e 1c 00 02 01 10 20 01 07 f8 00 24 00 00 00 00 00 00 00 00 00 c9 00 30 2a 0d d7 40 00 00</span> <span class="ha">c0 20 0c 00 03 34 74 00 00 00 0a 00 00 00 02</span></pre>
<table class="decode"><tr><td>40</td><td>flags: well-known, transitive</td></tr><tr><td>01</td><td>type 1 = ORIGIN</td></tr><tr><td>01</td><td>1 byte of value</td></tr><tr><td>00</td><td>IGP: the route was originated inside this AS</td></tr></table> <table class="decode"><tr><td>40</td><td>flags: well-known, transitive</td></tr><tr><td>01</td><td>type 1 = ORIGIN</td></tr><tr><td>01</td><td>1 byte of value</td></tr><tr><td>00</td><td>IGP: the route was originated inside this AS</td></tr></table>
@@ -97,37 +99,56 @@ Every attribute is *flags, type, length, value*.
## AS_PATH ## AS_PATH
<pre class="bytes focus"><span class="hh">ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff</span> <span class="hh">00 5e</span> <span class="hh">02</span> <span class="hl">00 00</span> <span class="hl">00 47</span> <span class="ha">40 01 01 00</span> <span class="ha2 on">40 02 06 02 01 fa 56 ea 01</span> <span class="ha">80 0e 1c 00 02 01 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 30 2a 0d d7 41 00 01</span> <span class="ha2">c0 20 18 00 03 34 74 00 00 00 00 00 00 00 00 00 03 34 74 00 00 00 01 00 00 a5 ec</span></pre> <pre class="bytes focus"><span class="hh">ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff</span> <span class="hh">00 59</span> <span class="hh">02</span> <span class="hl">00 00</span> <span class="hl">00 42</span> <span class="ha">40 01 01 00</span> <span class="ha2 on">40 02 06 02 01 00 03 34 74</span> <span class="ha">80 04 04 00 00 00 00</span> <span class="ha2">80 0e 1c 00 02 01 10 20 01 07 f8 00 24 00 00 00 00 00 00 00 00 00 c9 00 30 2a 0d d7 40 00 00</span> <span class="ha">c0 20 0c 00 03 34 74 00 00 00 0a 00 00 00 02</span></pre>
<table class="decode"><tr><td>40 02 06</td><td>well-known, transitive; type 2; 6 bytes</td></tr><tr><td>02</td><td>an AS_SEQUENCE, order matters</td></tr><tr><td>01</td><td>of 1 AS number</td></tr><tr><td>fa 56 ea 01</td><td>4200000001, the lab daemon. Four bytes each (RFC 6793)</td></tr></table> <table class="decode"><tr><td>40 02 06</td><td>well-known, transitive; type 2; 6 bytes</td></tr><tr><td>02</td><td>an AS_SEQUENCE, order matters</td></tr><tr><td>01</td><td>of 1 AS number</td></tr><tr><td>00 03 34 74</td><td>210036, the origin. Four bytes each (RFC 6793)</td></tr></table>
Each network prepends itself on the way out. The length of this list is what best-path selection compares. Each network prepends itself on the way out. The length of this list is what best-path selection compares.
<!-- .element: class="note" --> <!-- .element: class="note" -->
Notes:
One entry, because SwissIX is one hop from the origin and the route server
does not add itself. Seen from further away it reads e.g. 6939 210036.
---
## MULTI_EXIT_DISC
<pre class="bytes focus"><span class="hh">ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff</span> <span class="hh">00 59</span> <span class="hh">02</span> <span class="hl">00 00</span> <span class="hl">00 42</span> <span class="ha">40 01 01 00</span> <span class="ha2">40 02 06 02 01 00 03 34 74</span> <span class="ha on">80 04 04 00 00 00 00</span> <span class="ha2">80 0e 1c 00 02 01 10 20 01 07 f8 00 24 00 00 00 00 00 00 00 00 00 c9 00 30 2a 0d d7 40 00 00</span> <span class="ha">c0 20 0c 00 03 34 74 00 00 00 0a 00 00 00 02</span></pre>
<table class="decode"><tr><td>80 04 04</td><td>optional, non-transitive; type 4; 4 bytes</td></tr><tr><td>00 00 00 00</td><td>MED 0. Lower is preferred, among routes from the same neighbour AS</td></tr></table>
A hint to a neighbour about which of *your* entrances to use. Non-transitive: it goes one hop and no further.
<!-- .element: class="note" -->
--- ---
## MP_REACH_NLRI: where IPv6 lives ## MP_REACH_NLRI: where IPv6 lives
<pre class="bytes focus"><span class="hh">ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff</span> <span class="hh">00 5e</span> <span class="hh">02</span> <span class="hl">00 00</span> <span class="hl">00 47</span> <span class="ha">40 01 01 00</span> <span class="ha2">40 02 06 02 01 fa 56 ea 01</span> <span class="ha on">80 0e 1c 00 02 01 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 30 2a 0d d7 41 00 01</span> <span class="ha2">c0 20 18 00 03 34 74 00 00 00 00 00 00 00 00 00 03 34 74 00 00 00 01 00 00 a5 ec</span></pre> <pre class="bytes focus"><span class="hh">ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff</span> <span class="hh">00 59</span> <span class="hh">02</span> <span class="hl">00 00</span> <span class="hl">00 42</span> <span class="ha">40 01 01 00</span> <span class="ha2">40 02 06 02 01 00 03 34 74</span> <span class="ha">80 04 04 00 00 00 00</span> <span class="ha2 on">80 0e 1c 00 02 01 10 20 01 07 f8 00 24 00 00 00 00 00 00 00 00 00 c9 00 30 2a 0d d7 40 00 00</span> <span class="ha">c0 20 0c 00 03 34 74 00 00 00 0a 00 00 00 02</span></pre>
<table class="decode"><tr><td>80 0e 1c</td><td>optional, non-transitive; type 14; 28 bytes</td></tr><tr><td>00 02 · 01</td><td>address family IPv6, unicast</td></tr><tr><td>10 · 00…01</td><td>next hop, 16 bytes: ::1</td></tr><tr><td>00</td><td>reserved</td></tr><tr><td>30 · 2a 0d d7 41 00 01</td><td>48 bits of prefix: 2a0d:d741:1::/48</td></tr></table> <table class="decode"><tr><td>80 0e 1c</td><td>optional, non-transitive; type 14; 28 bytes</td></tr><tr><td>00 02 · 01</td><td>address family IPv6, unicast</td></tr><tr><td>10 · 2001 07f8 0024 … 00c9</td><td>next hop, 16 bytes: 2001:7f8:24::c9, our port on the SwissIX peering LAN</td></tr><tr><td>00</td><td>reserved</td></tr><tr><td>30 · 2a 0d d7 40 00 00</td><td>48 bits of prefix: 2a0d:d740::/48</td></tr></table>
Notes: Notes:
BGP-4 was built for IPv4: its NLRI field cannot carry anything else. RFC 4760 BGP-4 was built for IPv4: its NLRI field cannot carry anything else. RFC 4760
bolts other address families on as an attribute, each with its own next hop. bolts other address families on as an attribute, each with its own next hop.
A prefix is sent as a bit count plus only as many bytes as the count needs. A prefix is sent as a bit count plus only as many bytes as the count needs.
The next hop is ::1 because the daemon and the router share a machine. The next hop is an address on the exchange's shared LAN: whoever receives this
route sends packets straight to that address across the switch. Remember ::c9
for the exchange diagram in the next section.
Routers may also append their link-local address here, making it 32 bytes.
--- ---
## LARGE_COMMUNITIES ## LARGE_COMMUNITIES
<pre class="bytes focus"><span class="hh">ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff</span> <span class="hh">00 5e</span> <span class="hh">02</span> <span class="hl">00 00</span> <span class="hl">00 47</span> <span class="ha">40 01 01 00</span> <span class="ha2">40 02 06 02 01 fa 56 ea 01</span> <span class="ha">80 0e 1c 00 02 01 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 30 2a 0d d7 41 00 01</span> <span class="ha2 on">c0 20 18 00 03 34 74 00 00 00 00 00 00 00 00 00 03 34 74 00 00 00 01 00 00 a5 ec</span></pre> <pre class="bytes focus"><span class="hh">ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff</span> <span class="hh">00 59</span> <span class="hh">02</span> <span class="hl">00 00</span> <span class="hl">00 42</span> <span class="ha">40 01 01 00</span> <span class="ha2">40 02 06 02 01 00 03 34 74</span> <span class="ha">80 04 04 00 00 00 00</span> <span class="ha2">80 0e 1c 00 02 01 10 20 01 07 f8 00 24 00 00 00 00 00 00 00 00 00 c9 00 30 2a 0d d7 40 00 00</span> <span class="ha on">c0 20 0c 00 03 34 74 00 00 00 0a 00 00 00 02</span></pre>
<table class="decode"><tr><td>c0 20 18</td><td>optional, transitive; type 32; 24 bytes = two communities</td></tr><tr><td>00033474 · 0 · 0</td><td>210036:0:0 our router: announce nowhere…</td></tr><tr><td>00033474 · 1 · 0000a5ec</td><td>210036:1:42476 …except to AS42476, the SwissIX route servers</td></tr></table> <table class="decode"><tr><td>c0 20 0c</td><td>optional, transitive; type 32; 12 bytes = one community</td></tr><tr><td>00033474 · 0000000a · 00000002</td><td>210036:10:2, a tag our router puts on everything it exports to peers</td></tr></table>
Three 32-bit numbers. They mean whatever the receiving network says they mean. Three 32-bit numbers. They mean whatever the network named in the first one says they mean.
<!-- .element: class="note" --> <!-- .element: class="note" -->
@@ -144,4 +165,4 @@ Three 32-bit numbers. They mean whatever the receiving network says they mean.
Transitive is why a community you set can act three networks away. Transitive is why a community you set can act three networks away.
<!-- .element: class="fragment note" --> <!-- .element: class="note" -->
+8 -8
View File
@@ -68,10 +68,10 @@ a5ec is 42476 in hex: the route server's address spells its AS number.
## What that implies ## What that implies
* Your neighbour is *on your LAN*: one hop, found by neighbour discovery <!-- .element: class="fragment" --> * Your neighbour is *on your LAN*: one hop, found by neighbour discovery
* A route's next hop is the peer's LAN address, so traffic goes **directly** member to member <!-- .element: class="fragment" --> * A route's next hop is the peer's LAN address, so traffic goes **directly** member to member
* The exchange never routes your packets. It switches frames <!-- .element: class="fragment" --> * The exchange never routes your packets. It switches frames
* So the LAN is policed hard: one MAC address per port, no stray broadcasts, no proxy ARP <!-- .element: class="fragment" --> * So the LAN is policed hard: one MAC address per port, no stray broadcasts, no proxy ARP
Notes: Notes:
A misbehaving port can hurt every member, which is why exchanges publish strict A misbehaving port can hurt every member, which is why exchanges publish strict
@@ -83,10 +83,10 @@ rules for what may appear on the peering LAN and quarantine ports that break the
Without one, peering with 200 members is 200 BGP sessions. Without one, peering with 200 members is 200 BGP sessions.
* One session to the route server brings routes from everyone who uses it <!-- .element: class="fragment" --> * One session to the route server brings routes from everyone who uses it
* It is **not** in the traffic path, and leaves the next hop alone <!-- .element: class="fragment" --> * It is **not** in the traffic path, and leaves the next hop alone
* It does not add its own AS to the path <!-- .element: class="fragment" --> * It does not add its own AS to the path
* You steer it with communities: `42476:0:<as>` "not to them", `42476:1:<as>` "only to them" <!-- .element: class="fragment" --> * You steer it with communities: `42476:0:<as>` "not to them", `42476:1:<as>` "only to them"
Notes: Notes:
A route server is a BGP speaker that only redistributes. Because it is A route server is a BGP speaker that only redistributes. Because it is
+9 -32
View File
@@ -36,9 +36,9 @@ the right of pr01 is the actual Internet.
`2a0d:d741:<n>::/48` `2a0d:d741:<n>::/48`
* `<n>` is your number **in hex**: student 10 is `2a0d:d741:a::/48` <!-- .element: class="fragment" --> * `<n>` is your number **in hex**: student 10 is `2a0d:d741:a::/48`
* Put your name in *owner*: only the owner can withdraw a route <!-- .element: class="fragment" --> * Put your name in *owner*: only the owner can withdraw a route
* One prefix each <!-- .element: class="fragment" --> * One prefix each
Notes: Notes:
Put the URL and the class password on the board. The page is a snapshot by Put the URL and the class password on the board. The page is a snapshot by
@@ -48,11 +48,11 @@ default; turn on auto-refresh at the top right to watch things change.
## What happens when you press *Announce* ## What happens when you press *Announce*
1. ferrix builds an UPDATE. Click *bytes* to see it, hover to decode it <!-- .element: class="fragment" --> 1. ferrix builds an UPDATE. Click *bytes* to see it, hover to decode it
2. pr01 checks it against its import filter <!-- .element: class="fragment" --> 2. pr01 checks it against its import filter
3. pr01 decides, per neighbour, whether to pass it on <!-- .element: class="fragment" --> 3. pr01 decides, per neighbour, whether to pass it on
4. Within a minute or so, the Internet can see your prefix <!-- .element: class="fragment" --> 4. Within a minute or so, the Internet can see your prefix
5. `ping 2a0d:d741:<n>::1` answers, from anywhere <!-- .element: class="fragment" --> 5. `ping 2a0d:d741:<n>::1` answers, from anywhere
Notes: Notes:
Step 5: pr01 answers for every address in the lab space, so reachability of Step 5: pr01 answers for every address in the lab space, so reachability of
@@ -60,29 +60,6 @@ your prefix depends only on whether your announcement got out.
----- -----
## What stands between you and an outage
```bird [2-3|5-7|9]
filter ferrix_import {
if !(net ~ [ 2a0d:d741::/40{48,48} ]) then reject; # only lab /48s
if bgp_path.first != 4200000001 then reject; # only from ferrix
bgp_community.filter([ (65535, 65281), (65535, 65282) ]);
bgp_large_community.filter([ (42476, *, *), (210036, 0..3, *) ]);
bgp_ext_community.empty; # drop what we did not offer
dest = RTD_UNREACHABLE; # announce-only
accept;
}
```
Notes:
This is the router's real import filter. ferrix refuses anything outside the
lab /40 before it gets this far, and pr01 takes at most 130 routes from it.
Two independent nets, because the web form has no idea who you are.
-----
## Steering your route ## Steering your route
| You add | Who acts | Effect | | You add | Who acts | Effect |
@@ -95,7 +72,7 @@ Two independent nets, because the web form has no idea who you are.
Same idea at two hops: *never there*, *only there*, *nowhere*. Same idea at two hops: *never there*, *only there*, *nowhere*.
<!-- .element: class="fragment note" --> <!-- .element: class="note" -->
Notes: Notes:
210036:0:<as> never to that AS, 210036:1:<as> to that AS, 210036:2/3:<n> the 210036:0:<as> never to that AS, 210036:1:<as> to that AS, 210036:2/3:<n> the
-12
View File
@@ -31,18 +31,6 @@
color: var(--ink-strong); color: var(--ink-strong);
} }
/* A fragment that grows when it appears, for the one thing to look at. It
grows by font size, not transform, so the text around it makes room. */
.reveal .pop {
transition: font-size 0.4s ease, color 0.4s ease;
}
.reveal .pop.visible {
font-size: 1.5em;
font-weight: 700;
color: var(--accent);
}
/* ---- layout ------------------------------------------------------------------ */ /* ---- layout ------------------------------------------------------------------ */
.container { .container {