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:
1 parent
1399cbd39f
commit
9d6996c6c1
7 files changed
+83
-91
No files matched your search
+12
-6
@@ -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 |
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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" -->
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in new issue
Block a user