vyos1.4.x.html 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>VyOS 1.4.x sagitta | dn42 wiki</title>
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <meta name="robots" content="index, follow">
  8. <meta name="keywords" content="dn42,wiki,routing,bgp">
  9. <link rel="canonical" href="https://dn42.obl.ong/howto/vyos1.4.x.html">
  10. <link rel="icon" type="image/x-icon" href="/favicon.ico">
  11. <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
  12. <link rel="author" type="text/html" href="/docs/people">
  13. <link rel="stylesheet" href="/css/normalize.css">
  14. <link rel="stylesheet" href="/css/simple.min.css">
  15. <link rel="stylesheet" href="/css/style.css">
  16. <link rel="stylesheet" href="/css/menu.css">
  17. </head>
  18. <body>
  19. <header>
  20. <b>dn42 wiki / VyOS 1.4.x sagitta</b>
  21. <div id="dn42_header">
  22. <p><a href="/"><img src="/dn42.png" alt="dn42" /></a></p>
  23. </div>
  24. </header>
  25. <main>
  26. <h1 id="vyos-14x-sagitta">VyOS 1.4.x sagitta</h1>
  27. <p>VyOS is an open source software router. It is feature rich and supports multiple deployment options such as physical hardware (Old PC’s) or a VPC/VM. The developers have a nightly rolling release that includes all the latest features such as Wireguard.</p>
  28. <p>It can be downloaded here <a href="https://www.vyos.io/rolling-release/">https://www.vyos.io/rolling-release/</a>.</p>
  29. <h2 id="firewall-baseline">Firewall Baseline</h2>
  30. <p>We will configure firewall access lists for inbound connections on our peer Wireguard interfaces as well as block all inbound connections to our router with the exception of BGP. This should be a good baseline firewall ruleset to filter inbound traffic on your network’s edge. Modifications may be needed depending on your specific goals. If your router has an uplink back to a larger internal network (outside of DN42), an outbound firewall ruleset will need to be applied to that interface.</p>
  31. <p>By default, VyOS is a <strong>stateless</strong> firewall. To enable <strong>stateful</strong> packet inspection globally enter the following commands.</p>
  32. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">set </span>firewall state-policy established action <span class="s1">'accept'</span>
  33. <span class="nb">set </span>firewall state-policy related action <span class="s1">'accept'</span>
  34. </code></pre></div></div>
  35. <p>We also need to accept invalids on our network’s edge. However, this should not become common practice elsewhere.</p>
  36. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">set </span>firewall state-policy invalid action <span class="s1">'accept'</span>
  37. </code></pre></div></div>
  38. <p>The below commands create <strong>in</strong> and <strong>local</strong> baseline templates to be applied to all Wireguard interfaces that are facing peers. In this example, <strong>172.20.20.0/24</strong> and <strong>fd88:9deb:a69e::/48</strong> are your assigned address spaces.</p>
  39. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#Create Groups v4</span>
  40. <span class="nb">set </span>firewall group network-group Allowed-Transit-v4 network <span class="s1">'10.0.0.0/8'</span>
  41. <span class="nb">set </span>firewall group network-group Allowed-Transit-v4 network <span class="s1">'172.20.0.0/14'</span>
  42. <span class="nb">set </span>firewall group network-group Allowed-Transit-v4 network <span class="s1">'172.31.0.0/16'</span>
  43. <span class="nb">set </span>firewall group network-group My-Assigned-Space-v4 network <span class="s1">'172.20.20.0/24'</span>
  44. <span class="c">#Create Groups v6</span>
  45. <span class="nb">set </span>firewall group ipv6-network-group Allowed-Transit-v6 network <span class="s1">'fd00::/8'</span>
  46. <span class="nb">set </span>firewall group ipv6-network-group My-Assigned-Space-v6 network <span class="s1">'fd88:9deb:a69e::/48'</span>
  47. <span class="c">#Inbound Connections v4</span>
  48. <span class="nb">set </span>firewall name Tunnels_In_v4 default-action <span class="s1">'drop'</span>
  49. <span class="nb">set </span>firewall name Tunnels_In_v4 enable-default-log
  50. <span class="nb">set </span>firewall name Tunnels_In_v4 rule 68 action <span class="s1">'drop'</span>
  51. <span class="nb">set </span>firewall name Tunnels_In_v4 rule 68 description <span class="s1">'Block Traffic to Operator Assigned IP Space'</span>
  52. <span class="nb">set </span>firewall name Tunnels_In_v4 rule 68 destination group network-group <span class="s1">'My-Assigned-Space-v4'</span>
  53. <span class="nb">set </span>firewall name Tunnels_In_v4 rule 68 log <span class="s1">'enable'</span>
  54. <span class="nb">set </span>firewall name Tunnels_In_v4 rule 68 action <span class="s1">'drop'</span>
  55. <span class="nb">set </span>firewall name Tunnels_In_v4 rule 70 action <span class="s1">'accept'</span>
  56. <span class="nb">set </span>firewall name Tunnels_In_v4 rule 70 description <span class="s1">'Allow Peer Transit'</span>
  57. <span class="nb">set </span>firewall name Tunnels_In_v4 rule 70 destination group network-group <span class="s1">'Allowed-Transit-v4'</span>
  58. <span class="nb">set </span>firewall name Tunnels_In_v4 rule 70 <span class="nb">source </span>group network-group <span class="s1">'Allowed-Transit-v4'</span>
  59. <span class="nb">set </span>firewall name Tunnels_In_v4 rule 70 log <span class="s1">'enable'</span>
  60. <span class="nb">set </span>firewall name Tunnels_In_v4 rule 99 action <span class="s1">'drop'</span>
  61. <span class="nb">set </span>firewall name Tunnels_In_v4 rule 99 description <span class="s1">'Black Hole'</span>
  62. <span class="nb">set </span>firewall name Tunnels_In_v4 rule 99 log <span class="s1">'enable'</span>
  63. <span class="c">#Inbound Connections v6</span>
  64. <span class="nb">set </span>firewall ipv6-name Tunnels_In_v6 default-action <span class="s1">'drop'</span>
  65. <span class="nb">set </span>firewall ipv6-name Tunnels_In_v6 enable-default-log
  66. <span class="nb">set </span>firewall ipv6-name Tunnels_In_v6 rule 68 action <span class="s1">'drop'</span>
  67. <span class="nb">set </span>firewall ipv6-name Tunnels_In_v6 rule 68 description <span class="s1">'Block Traffic to Operator Assigned IP Space'</span>
  68. <span class="nb">set </span>firewall ipv6-name Tunnels_In_v6 rule 68 destination group network-group <span class="s1">'My-Assigned-Space-v6'</span>
  69. <span class="nb">set </span>firewall ipv6-name Tunnels_In_v6 rule 68 log <span class="s1">'enable'</span>
  70. <span class="nb">set </span>firewall ipv6-name Tunnels_In_v6 rule 70 action <span class="s1">'accept'</span>
  71. <span class="nb">set </span>firewall ipv6-name Tunnels_In_v6 rule 70 description <span class="s1">'Allow Peer Transit'</span>
  72. <span class="nb">set </span>firewall ipv6-name Tunnels_In_v6 rule 70 destination group network-group <span class="s1">'Allowed-Transit-v6'</span>
  73. <span class="nb">set </span>firewall ipv6-name Tunnels_In_v6 rule 70 log <span class="s1">'enable'</span>
  74. <span class="nb">set </span>firewall ipv6-name Tunnels_In_v6 rule 70 <span class="nb">source </span>group network-group <span class="s1">'Allowed-Transit-v6'</span>
  75. <span class="nb">set </span>firewall ipv6-name Tunnels_In_v6 rule 99 action <span class="s1">'drop'</span>
  76. <span class="nb">set </span>firewall ipv6-name Tunnels_In_v6 rule 99 description <span class="s1">'Black Hole'</span>
  77. <span class="nb">set </span>firewall ipv6-name Tunnels_In_v6 rule 99 log <span class="s1">'enable'</span>
  78. <span class="c">#Local Connections v4</span>
  79. <span class="nb">set </span>firewall name Tunnels_Local_v4 default-action <span class="s1">'drop'</span>
  80. <span class="nb">set </span>firewall name Tunnels_Local_v4 rule 50 action <span class="s1">'accept'</span>
  81. <span class="nb">set </span>firewall name Tunnels_Local_v4 rule 50 icmp
  82. <span class="nb">set </span>firewall name Tunnels_Local_v4 rule 50 protocol <span class="s1">'icmp'</span>
  83. <span class="nb">set </span>firewall name Tunnels_Local_v4 rule 61 action <span class="s1">'accept'</span>
  84. <span class="nb">set </span>firewall name Tunnels_Local_v4 rule 61 description <span class="s1">'Allow BGP'</span>
  85. <span class="nb">set </span>firewall name Tunnels_Local_v4 rule 61 destination port <span class="s1">'179'</span>
  86. <span class="nb">set </span>firewall name Tunnels_Local_v4 rule 61 protocol <span class="s1">'tcp'</span>
  87. <span class="nb">set </span>firewall name Tunnels_Local_v4 rule 98 action <span class="s1">'drop'</span>
  88. <span class="nb">set </span>firewall name Tunnels_Local_v4 rule 98 description <span class="s1">'Black Hole'</span>
  89. <span class="nb">set </span>firewall name Tunnels_Local_v4 rule 98 log <span class="s1">'enable'</span>
  90. <span class="nb">set </span>firewall name Tunnels_Local_v4 rule 98 state invalid <span class="s1">'enable'</span>
  91. <span class="nb">set </span>firewall name Tunnels_Local_v4 rule 99 action <span class="s1">'drop'</span>
  92. <span class="nb">set </span>firewall name Tunnels_Local_v4 rule 99 description <span class="s1">'Black Hole'</span>
  93. <span class="nb">set </span>firewall name Tunnels_Local_v4 rule 99 log <span class="s1">'enable'</span>
  94. <span class="c">#Local Connections v6</span>
  95. <span class="nb">set </span>firewall ipv6-name Tunnels_Local_v6 default-action <span class="s1">'drop'</span>
  96. <span class="nb">set </span>firewall ipv6-name Tunnels_Local_v6 rule 50 action <span class="s1">'accept'</span>
  97. <span class="nb">set </span>firewall ipv6-name Tunnels_Local_v6 rule 50 icmpv6
  98. <span class="nb">set </span>firewall ipv6-name Tunnels_Local_v6 rule 50 protocol <span class="s1">'ipv6-icmp'</span>
  99. <span class="nb">set </span>firewall ipv6-name Tunnels_Local_v6 rule 61 action <span class="s1">'accept'</span>
  100. <span class="nb">set </span>firewall ipv6-name Tunnels_Local_v6 rule 61 description <span class="s1">'Allow BGP'</span>
  101. <span class="nb">set </span>firewall ipv6-name Tunnels_Local_v6 rule 61 destination port <span class="s1">'179'</span>
  102. <span class="nb">set </span>firewall ipv6-name Tunnels_Local_v6 rule 61 protocol <span class="s1">'tcp'</span>
  103. <span class="nb">set </span>firewall ipv6-name Tunnels_Local_v6 rule 98 action <span class="s1">'drop'</span>
  104. <span class="nb">set </span>firewall ipv6-name Tunnels_Local_v6 rule 98 description <span class="s1">'Black Hole'</span>
  105. <span class="nb">set </span>firewall ipv6-name Tunnels_Local_v6 rule 98 log <span class="s1">'enable'</span>
  106. <span class="nb">set </span>firewall ipv6-name Tunnels_Local_v6 rule 98 state invalid <span class="s1">'enable'</span>
  107. <span class="nb">set </span>firewall ipv6-name Tunnels_Local_v6 rule 99 action <span class="s1">'drop'</span>
  108. <span class="nb">set </span>firewall ipv6-name Tunnels_Local_v6 rule 99 description <span class="s1">'Black Hole'</span>
  109. <span class="nb">set </span>firewall ipv6-name Tunnels_Local_v6 rule 99 log <span class="s1">'enable'</span>
  110. </code></pre></div></div>
  111. <h2 id="wireguard">Wireguard</h2>
  112. <h3 id="setup-keys">Setup Keys</h3>
  113. <p>You can choose to generate a unique keypair and use it for every wireguard peering, or you can choose to generate a different one for each new peering.</p>
  114. <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>generate pki wireguard key-pair
  115. #Output example:
  116. Private key: SOoPQdMdmXE3ssp0/vwwoIMhQqvcQls+DhDjmaLw03U=
  117. Public key: ArkXeK1c0pCWCouePcRRBCQpXfi4ZIvRFFwTxO60dxs=
  118. </code></pre></div></div>
  119. <p>If you choose to generate unique keypairs for peerings, you can generate and install the keypair in a single command. Note that you have to be in <code class="language-plaintext highlighter-rouge">configure</code> mode, at the top level, as shown below:</p>
  120. <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vyos@vyos$ configure
  121. [edit]
  122. vyos@vyos# run generate pki wireguard key-pair install interface wg4242424242
  123. 1 value(s) installed. Use "compare" to see the pending changes, and "commit" to apply.
  124. Corresponding public-key to use on peer system is: 'UcqcZsJvq1MlYgo3gObjaJ8FH+N7wkfV+EH3YDAMyRE='
  125. [edit]
  126. vyos@vyos-home# show interfaces wireguard wg4242424242
  127. +private-key kHCqfe/GZ8phoNnWfkL3+joXi/qK3ZfdfAnlNuX/9FU=
  128. </code></pre></div></div>
  129. <p>To retrieve keys later, use the op-mode command <code class="language-plaintext highlighter-rouge">show interfaces wireguard wg4242424242 public-key</code>.</p>
  130. <p>Example:</p>
  131. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vyos@vyos<span class="nv">$ </span>show interfaces wireguard wg4242424242 public-key
  132. UcqcZsJvq1MlYgo3gObjaJ8FH+N7wkfV+EH3YDAMyRE<span class="o">=</span>
  133. </code></pre></div></div>
  134. <h3 id="configure-first-peers-tunnel">Configure First Peer’s tunnel</h3>
  135. <p>This example assumes that your ASN is 4242421234 and your peer’s ASN is 4242424242</p>
  136. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">set </span>interfaces wireguard wg4242424242 description <span class="s1">'AS4242424242 - My First Peer'</span>
  137. <span class="c"># Common practice on DN42 is for peers to use 2+the last four digits of your peer's ASN as the port.</span>
  138. <span class="c"># You will have to let your peer know what you choose for your port, as well as your clearnet IP address.</span>
  139. <span class="nb">set </span>interfaces wireguard wg4242424242 port <span class="s1">'24242'</span>
  140. <span class="nb">set </span>interfaces wireguard wg4242424242 private-key <span class="s1">'SOoPQdMdmXE3ssp0/vwwoIMhQqvcQls+DhDjmaLw03U='</span>
  141. <span class="c"># An arbitrary link-local IPv6 address (that you'll have to tell to your peer)</span>
  142. <span class="nb">set </span>interfaces wireguard wg4242424242 address <span class="s1">'fe80::1234/64'</span>
  143. <span class="c"># One of your DN42 IPv4 addresses (not really needed if you'll enable extended next-hop)</span>
  144. <span class="nb">set </span>interfaces wireguard wg4242424242 address <span class="s1">'172.20.20.1/32'</span>
  145. <span class="c"># Set your peer's clearnet endpoint information. You need to use an IPv4 or IPv6 address</span>
  146. <span class="c"># (as opposed to a DNS name).</span>
  147. <span class="c"># If you have a static IP address but your peer does not,</span>
  148. <span class="c"># you can leave out this part of the configuration.</span>
  149. <span class="nb">set </span>interfaces wireguard wg4242424242 peer location1 address <span class="s1">'192.0.2.1'</span>
  150. <span class="nb">set </span>interfaces wireguard wg4242424242 peer location1 port <span class="s1">'21234'</span>
  151. <span class="c"># You can allow everything here and relay on your firewall</span>
  152. <span class="nb">set </span>interfaces wireguard wg4242424242 peer location1 allowed-ips <span class="s1">'0.0.0.0/0'</span>
  153. <span class="nb">set </span>interfaces wireguard wg4242424242 peer location1 allowed-ips <span class="s1">'::/0'</span>
  154. <span class="nb">set </span>interfaces wireguard wg4242424242 peer location1 public-key <span class="s1">'&lt;wireguard public key of your peer&gt;'</span>
  155. <span class="c"># (persistent-keepalive option could be optional, but in my case I noticed that helps starting BGP session)</span>
  156. <span class="nb">set </span>interfaces wireguard wg4242424242 peer location1 persistent-keepalive <span class="s1">'60'</span>
  157. <span class="c"># Configure firewall</span>
  158. <span class="nb">set </span>firewall interface wg4242424242 interface-group ipv6-name <span class="s1">'Tunnels_In_v6'</span>
  159. <span class="nb">set </span>firewall interface wg4242424242 interface-group name <span class="s1">'Tunnels_In_v4'</span>
  160. <span class="nb">set </span>firewall interface wg4242424242 <span class="nb">local </span>ipv6-name <span class="s1">'Tunnels_Local_v6'</span>
  161. <span class="nb">set </span>firewall interface wg4242424242 <span class="nb">local </span>name <span class="s1">'Tunnels_Local_v4'</span>
  162. </code></pre></div></div>
  163. <h2 id="bgp">BGP</h2>
  164. <p>Now that we have a tunnel to our peer and theoretically can ping them, we can setup BGP.</p>
  165. <h3 id="initial-router-setup">Initial Router Setup</h3>
  166. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Set your ASN and IP blocks</span>
  167. <span class="nb">set </span>protocols bgp system-as <span class="s1">'4242421234'</span>
  168. <span class="nb">set </span>protocols bgp address-family ipv4-unicast network 172.20.20.0/24<span class="sb">`</span>
  169. <span class="nb">set </span>protocols bgp address-family ipv6-unicast network fd88:9deb:a69e::/48<span class="sb">`</span>
  170. <span class="c"># Note that your address blocks should match your exact prefix as listed in the registry.</span>
  171. <span class="c"># if you try to advertise a subnet of your assigned block, it could get filtered by some peers.</span>
  172. <span class="c"># To keep it simple, just make your router ID match your lower IP within the DN42 registered space.</span>
  173. <span class="nb">set </span>protocols bgp parameters router-id <span class="s1">'172.20.20.1'</span>
  174. </code></pre></div></div>
  175. <h3 id="neighbor-up-with-peers">Neighbor Up With Peers</h3>
  176. <h4 id="option-1-mp-bgp-with-multi-protocol---with-extended-next-hop">Option 1: MP-BGP (with Multi Protocol) - with Extended Next-Hop</h4>
  177. <p>MP-BGP peerings over IPv6 are recommended on DN42.</p>
  178. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># For these examples, your peer's link-local address is fe80::4242</span>
  179. <span class="nb">set </span>protocols bgp neighbor fe80::4242 update-source <span class="s1">'wg4242424242'</span>
  180. <span class="nb">set </span>protocols bgp neighbor fe80::4242 description <span class="s1">'FriendlyNet'</span>
  181. <span class="nb">set </span>protocols bgp neighbor fe80::4242 capability extended-nexthop
  182. <span class="nb">set </span>protocols bgp neighbor fe80::4242 address-family ipv4-unicast
  183. <span class="nb">set </span>protocols bgp neighbor fe80::4242 address-family ipv6-unicast
  184. </code></pre></div></div>
  185. <h4 id="option-2-bgp-no-multi-protocol---no-extended-next-hop">Option 2: BGP (no Multi Protocol) - no Extended Next-Hop</h4>
  186. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># First, we set the ipv6 part.</span>
  187. <span class="nb">set </span>protocols bgp neighbor fe80::4242 remote-as <span class="s1">'4242424242'</span>
  188. <span class="nb">set </span>protocols bgp neighbor fe80::4242 address-family ipv6-unicast
  189. <span class="nb">set </span>protocols bgp neighbor fe80::4242 description <span class="s1">'FriendlyNet'</span>
  190. <span class="c"># For the ipv4 part we need to add first a static ipv4 route to our peer tunneled ipv4 address</span>
  191. <span class="nb">set </span>protocols static route 172.20.x.y interface wg1234
  192. <span class="c"># 172.20.x.y is your peer tunneled IPv4</span>
  193. <span class="nb">set </span>protocols bgp neighbor 172.20.x.y remote-as <span class="s1">'&lt;your peer ASN&gt;'</span>
  194. <span class="nb">set </span>protocols bgp neighbor 172.20.x.y address-family ipv4-unicast
  195. <span class="nb">set </span>protocols bgp neighbor 172.20.x.y description <span class="s1">'FriendlyNet'</span>
  196. <span class="c"># This setting may need to be adjusted depending on circumstances</span>
  197. <span class="nb">set </span>protocols bgp neighbor 172.20.x.y ebgp-multihop 20
  198. </code></pre></div></div>
  199. <p>You can now check your BGP summary:</p>
  200. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>show ip bgp summary
  201. IPv4 Unicast Summary <span class="o">(</span>VRF default<span class="o">)</span>:
  202. BGP router identifier 172.20.20.1, <span class="nb">local </span>AS number 4242421234 vrf-id 0
  203. BGP table version 2782
  204. RIB entries 1378, using 258 KiB of memory
  205. Peers 1, using 1 MiB of memory
  206. Peer <span class="nb">groups </span>1, using 64 bytes of memory
  207. Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Desc
  208. fe80::4242 4 4242424242 1031 6 0 0 0 00:04:20 710 1 FriendlyNet
  209. IPv6 Unicast Summary <span class="o">(</span>VRF default<span class="o">)</span>:
  210. BGP router identifier 172.20.20.1, <span class="nb">local </span>AS number 4242421234 vrf-id 0
  211. BGP table version 2782
  212. RIB entries 1378, using 258 KiB of memory
  213. Peers 1, using 1 MiB of memory
  214. Peer <span class="nb">groups </span>1, using 64 bytes of memory
  215. Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Desc
  216. fe80::4242 4 4242424242 1031 6 0 0 0 00:04:20 710 1 FriendlyNet
  217. </code></pre></div></div>
  218. <p>Setting up peer-groups might help standardize multiple peerings:</p>
  219. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># One peer group for all IPv6 MP-BGP link-local extended-nexthop peers</span>
  220. <span class="nb">set </span>protocols bgp peer-group dn42 address-family ipv4-unicast
  221. <span class="nb">set </span>protocols bgp peer-group dn42 address-family ipv6-unicast
  222. <span class="nb">set </span>protocols bgp peer-group dn42 capability extended-nexthop
  223. <span class="nb">set </span>protocols bgp neighbor fe80::4242 peer-group dn42
  224. <span class="c"># If you have any non-multiprotocol peerings you'll need to set up peer-groups</span>
  225. <span class="c"># for the individual address families. This is left up to the reader.</span>
  226. <span class="c"># Delete the settings that are now redundant</span>
  227. delete protocols bgp neighbor fe80::4242 address-family
  228. delete protocols bgp neighbor fe80::4242 capability
  229. </code></pre></div></div>
  230. <h2 id="rpkiroa-checking">RPKI/ROA Checking</h2>
  231. <p>Burble has made this super easy. More info can be found <a href="/howto/ROA-slash-RPKI">here</a> on this wiki.
  232. You can achieve this by running docker on a seperate server in the network but as of Vyos 1.4 2023-02-28 its possible to do it on the vyos machine itself. This setup is using Cloudflare’s GoRTR and automatically reaching out and downloading a custom JSON file generated by Burble just for the DN42 network.</p>
  233. <h3 id="setup-rpki-caching-server-on-the-vyos-machine">Setup RPKI Caching Server on the Vyos machine</h3>
  234. <p>Run this command in operation mode to pull the container image to the vyos machine.</p>
  235. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>add container image cloudflare/gortr
  236. </code></pre></div></div>
  237. <p>Run the following commands in configuration mode:</p>
  238. <p>To create the network for the prki container so it is only reachable on the vyos machine.</p>
  239. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">set </span>container network rpki
  240. <span class="nb">set </span>container network rpki prefix 172.16.2.0/24
  241. </code></pre></div></div>
  242. <p>To create the container itself</p>
  243. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">set </span>container name gortr image cloudflare/gortr
  244. <span class="nb">set </span>container name gortr <span class="nb">command</span> <span class="s2">"-cache https://dn42.burble.com/roa/dn42_roa_46.json -verify=false -checktime=false -bind :8082"</span>
  245. <span class="nb">set </span>container name gortr network rpki address 172.16.2.10
  246. <span class="nb">set </span>container name gortr restart on-failure
  247. </code></pre></div></div>
  248. <h3 id="setup-rpki-caching-server-on-a-seperate-server">Setup RPKI Caching Server on a seperate server</h3>
  249. <p>But its also possible to setup the container on a seperate machine.
  250. Run the following docker command to setup the clouflare gortr container on a seperate server with docker installed.</p>
  251. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker run <span class="nt">-ti</span> <span class="nt">-p</span> 8082:8082 cloudflare/gortr <span class="nt">-cache</span> https://dn42.burble.com/roa/dn42_roa_46.json <span class="nt">-verify</span><span class="o">=</span><span class="nb">false</span> <span class="nt">-checktime</span><span class="o">=</span><span class="nb">false</span> <span class="nt">-bind</span> :8082
  252. </code></pre></div></div>
  253. <p>This will start a docker container that listens on the host server’s IP at port 8082.</p>
  254. <h3 id="point-vyos-router-at-rpki-caching-server">Point VyOS Router at RPKI Caching Server</h3>
  255. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">set </span>protocols rpki cache &lt;ip address of your GoRTR instance&gt; port <span class="s1">'8082'</span>
  256. <span class="nb">set </span>protocols rpki cache &lt;ip address of your GoRTR instance&gt; preference <span class="s1">'1'</span>
  257. </code></pre></div></div>
  258. <p>You can check the connection with <code class="language-plaintext highlighter-rouge">show rpki cache-connection</code> the output will look like this:</p>
  259. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>show rpki cache-connection
  260. Connected to group 1
  261. rpki tcp cache &lt;ip address of your GoRTR instance&gt; 8082 pref 1 <span class="o">(</span>connected<span class="o">)</span>
  262. </code></pre></div></div>
  263. <p>You can also see the received prefix-table with <code class="language-plaintext highlighter-rouge">show rpki prefix-table</code>.</p>
  264. <h3 id="create-route-map">Create Route Map</h3>
  265. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">set </span>policy route-map DN42-ROA rule 10 action <span class="s1">'permit'</span>
  266. <span class="nb">set </span>policy route-map DN42-ROA rule 10 match rpki <span class="s1">'valid'</span>
  267. <span class="nb">set </span>policy route-map DN42-ROA rule 20 action <span class="s1">'permit'</span>
  268. <span class="nb">set </span>policy route-map DN42-ROA rule 20 match rpki <span class="s1">'notfound'</span>
  269. <span class="nb">set </span>policy route-map DN42-ROA rule 30 action <span class="s1">'deny'</span>
  270. <span class="nb">set </span>policy route-map DN42-ROA rule 30 match rpki <span class="s1">'invalid'</span>
  271. </code></pre></div></div>
  272. <p>This example allows all routes in unless they are marked invalid or in other words possibly been a victim of BGP hijacking.
  273. You can also consider to “deny” the “notfound” prefixes, for better control.</p>
  274. <p>You can also consider to combine within the same route-map the RPKI and one or more a prefix lists containing your internal network prefixes, as described later (The example “No RPKI/ROA and Internal Network Falls Into DN42 Range”).</p>
  275. <h3 id="assign-route-map-to-neighbor">Assign Route Map to Neighbor</h3>
  276. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">set </span>protocols bgp neighbor fe80::1234 address-family ipv4-unicast route-map <span class="nb">export</span> <span class="s1">'DN42-ROA'</span>
  277. <span class="nb">set </span>protocols bgp neighbor fe80::1234 address-family ipv4-unicast route-map import <span class="s1">'DN42-ROA'</span>
  278. <span class="nb">set </span>protocols bgp neighbor fe80::1234 address-family ipv6-unicast route-map <span class="nb">export</span> <span class="s1">'DN42-ROA'</span>
  279. <span class="nb">set </span>protocols bgp neighbor fe80::1234 address-family ipv6-unicast route-map import <span class="s1">'DN42-ROA'</span>
  280. </code></pre></div></div>
  281. <p><em>Remember to do that for all your new peerings!</em></p>
  282. <h2 id="example-route-map">Example Route Map</h2>
  283. <h3 id="no-rpkiroa-and-internal-network-falls-into-dn42-range">No RPKI/ROA and Internal Network Falls Into DN42 Range</h3>
  284. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">##Build prefix list to match personal internal network</span>
  285. <span class="nb">set </span>policy prefix-list BlockIPConflicts description <span class="s1">'Prevent Conflicting Routes'</span>
  286. <span class="nb">set </span>policy prefix-list BlockIPConflicts rule 10 action <span class="s1">'permit'</span>
  287. <span class="nb">set </span>policy prefix-list BlockIPConflicts rule 10 description <span class="s1">'Internal IP Space'</span>
  288. <span class="nb">set </span>policy prefix-list BlockIPConflicts rule 10 le <span class="s1">'32'</span>
  289. <span class="nb">set </span>policy prefix-list BlockIPConflicts rule 10 prefix <span class="s1">'10.10.0.0/16'</span>
  290. <span class="c">##Build prefix list to match personal internal network</span>
  291. <span class="nb">set </span>policy prefix-list6 BlockIPConflicts-v6 description <span class="s1">'Prevent Conflicting Routes'</span>
  292. <span class="nb">set </span>policy prefix-list6 BlockIPConflicts-v6 rule 10 action <span class="s1">'permit'</span>
  293. <span class="nb">set </span>policy prefix-list6 BlockIPConflicts-v6 rule 10 description <span class="s1">'Internal IP Space'</span>
  294. <span class="nb">set </span>policy prefix-list6 BlockIPConflicts-v6 rule 10 le <span class="s1">'128'</span>
  295. <span class="nb">set </span>policy prefix-list6 BlockIPConflicts-v6 rule 10 prefix <span class="s1">'fd42:4242:1111::/48'</span>
  296. <span class="c">##Build prefix list to match DN42's IPv4 network</span>
  297. <span class="nb">set </span>policy prefix-list DN42-Network rule 10 action <span class="s1">'permit'</span>
  298. <span class="nb">set </span>policy prefix-list DN42-Network rule 10 le <span class="s1">'32'</span>
  299. <span class="nb">set </span>policy prefix-list DN42-Network rule 10 prefix <span class="s1">'172.20.0.0/14'</span>
  300. <span class="nb">set </span>policy prefix-list DN42-Network rule 20 action <span class="s1">'permit'</span>
  301. <span class="nb">set </span>policy prefix-list DN42-Network rule 20 le <span class="s1">'32'</span>
  302. <span class="nb">set </span>policy prefix-list DN42-Network rule 20 prefix <span class="s1">'10.0.0.0/8'</span>
  303. <span class="c">##Build prefix list to match DN42's IPv6 network</span>
  304. <span class="nb">set </span>policy prefix-list6 DN42-Network-v6 rule 10 action <span class="s1">'permit'</span>
  305. <span class="nb">set </span>policy prefix-list6 DN42-Network-v6 rule 10 le <span class="s1">'128'</span>
  306. <span class="nb">set </span>policy prefix-list6 DN42-Network-v6 rule 10 prefix <span class="s1">'fd00::/8'</span>
  307. <span class="c">##Block prefixes within internal network range, then allow everything else within DN42, then block everything else.</span>
  308. <span class="nb">set </span>policy route-map Default-Peering rule 10 action <span class="s1">'deny'</span>
  309. <span class="nb">set </span>policy route-map Default-Peering rule 10 description <span class="s1">'Prevent IP Conflicts'</span>
  310. <span class="nb">set </span>policy route-map Default-Peering rule 10 match ip address prefix-list <span class="s1">'BlockIPConflicts'</span>
  311. <span class="nb">set </span>policy route-map Default-Peering rule 11 action <span class="s1">'deny'</span>
  312. <span class="nb">set </span>policy route-map Default-Peering rule 11 description <span class="s1">'Prevent IP Conflicts'</span>
  313. <span class="nb">set </span>policy route-map Default-Peering rule 11 match ipv6 address prefix-list <span class="s1">'BlockIPConflicts-v6'</span>
  314. <span class="nb">set </span>policy route-map Default-Peering rule 20 action <span class="s1">'permit'</span>
  315. <span class="nb">set </span>policy route-map Default-Peering rule 20 description <span class="s1">'Allow DN42-Network'</span>
  316. <span class="nb">set </span>policy route-map Default-Peering rule 20 match ip address prefix-list <span class="s1">'DN42-Network'</span>
  317. <span class="nb">set </span>policy route-map Default-Peering rule 21 action <span class="s1">'permit'</span>
  318. <span class="nb">set </span>policy route-map Default-Peering rule 21 description <span class="s1">'Allow DN42-Network'</span>
  319. <span class="nb">set </span>policy route-map Default-Peering rule 21 match ipv6 address prefix-list <span class="s1">'DN42-Network-v6'</span>
  320. <span class="nb">set </span>policy route-map Default-Peering rule 99 action <span class="s1">'deny'</span>
  321. <span class="c">##Apply the route-map on import/export</span>
  322. <span class="nb">set </span>protocols bgp peer-group dn42 address-family ipv4-unicast route-map <span class="nb">export</span> <span class="s1">'Default-Peering'</span>
  323. <span class="nb">set </span>protocols bgp peer-group dn42 address-family ipv4-unicast route-map import <span class="s1">'Default-Peering'</span>
  324. <span class="nb">set </span>protocols bgp peer-group dn42 address-family ipv6-unicast route-map <span class="nb">export</span> <span class="s1">'Default-Peering'</span>
  325. <span class="nb">set </span>protocols bgp peer-group dn42 address-family ipv6-unicast route-map import <span class="s1">'Default-Peering'</span>
  326. </code></pre></div></div>
  327. <h1 id="add-your-vyos-router-to-the-global-route-collector">Add your VyOS router to the <a href="/services/Route-Collector">Global Route Collector</a>!</h1>
  328. <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># The route collector should never export routes, so let's make a route-map to reject them if it does.</span>
  329. <span class="nb">set </span>policy route-map Deny-All rule 1 action deny
  330. <span class="nb">set </span>protocols bgp neighbor fd42:4242:2601:ac12::1 address-family ipv4-unicast route-map import <span class="s1">'Deny-All'</span>
  331. <span class="nb">set </span>protocols bgp neighbor fd42:4242:2601:ac12::1 address-family ipv6-unicast route-map import <span class="s1">'Deny-All'</span>
  332. <span class="nb">set </span>protocols bgp neighbor fd42:4242:2601:ac12::1 description <span class="s1">'https://lg.collector.dn42'</span>
  333. <span class="nb">set </span>protocols bgp neighbor fd42:4242:2601:ac12::1 ebgp-multihop <span class="s1">'10'</span>
  334. <span class="nb">set </span>protocols bgp neighbor fd42:4242:2601:ac12::1 remote-as <span class="s1">'4242422602'</span>
  335. </code></pre></div></div>
  336. <h2 id="credits">Credits</h2>
  337. <p>This How-To has to be considered a work-in-progress by <strong>Matwolf</strong> with parts co-authored by <strong>bri</strong></p>
  338. <p>It’s based on the original VyOS How-To made by <strong>Owens Research</strong>: <a href="/howto/vyos">How-To/VyOS</a>.</p>
  339. <p>The commands in this page have been adapted to be compatible with the new version of VyOS 1.4.x (sagitta) and to include configurations for IPv6 (MP-BGP over link-local and extended next-hop).</p>
  340. <p>If you have any questions or suggestions please reach out.</p>
  341. <h2 id="see-also">See also</h2>
  342. <p><a href="https://docs.vyos.io/en/latest/configuration/interfaces/wireguard.html">WireGuard</a> and <a href="https://docs.vyos.io/en/latest/configuration/protocols/bgp.html">BGP</a> in the official VyOS documentation.</p>
  343. <div id="menu-container" class="menu-container">
  344. <hr>
  345. <div id="menu" class="menu">
  346. <ul>
  347. <li><a href="/Home">Home</a>
  348. <ul>
  349. <li><a href="/howto/Getting-Started">Getting Started</a></li>
  350. <li><a href="/howto/Registry-Authentication">Registry Authentication</a></li>
  351. <li><a href="/howto/Address-Space">Address Space</a></li>
  352. <li><a href="/howto/BGP-communities">BGP communities</a></li>
  353. <li><a href="/FAQ">FAQ</a></li>
  354. </ul>
  355. </li>
  356. <li>How-To
  357. <ul>
  358. <li><a href="/howto/wireguard">Wireguard</a></li>
  359. <li><a href="/howto/openvpn">Openvpn</a></li>
  360. <li><a href="/howto/IPsec-with-PublicKeys">IPsec With Public Keys</a></li>
  361. <li><a href="/howto/tinc">Tinc</a></li>
  362. <li><a href="/howto/GRE-on-FreeBSD">GRE on FreeBSD</a></li>
  363. <li><a href="/howto/GRE-on-OpenBSD">GRE on OpenBSD</a></li>
  364. <li><a href="/howto/IPv6-Multicast">IPv6 Multicast (PIM-SM)</a></li>
  365. <li><a href="/howto/multicast">SSM Multicast</a></li>
  366. <li><a href="/howto/mpls">MPLS</a></li>
  367. <li><a href="/howto/Bird2">Bird2</a></li>
  368. <li><a href="/howto/frr">FRRouting</a></li>
  369. <li><a href="/howto/OpenBGPD">OpenBGPD</a></li>
  370. <li><a href="/howto/mikrotik">Mikrotik RouterOS</a></li>
  371. <li><a href="/howto/EdgeOS-Config">EdgeRouter</a></li>
  372. <li><a href="/howto/Static-routes-on-Windows">Static routes on Windows</a></li>
  373. <li><a href="/howto/networksettings">Universal Network Requirements</a></li>
  374. <li><a href="/howto/vyos1.4.x">VyOS</a></li>
  375. <li><a href="/howto/nixos">NixOS</a></li>
  376. </ul>
  377. </li>
  378. <li>Services
  379. <ul>
  380. <li><a href="/services/IRC">IRC</a></li>
  381. <li><a href="/services/Whois">Whois registry</a></li>
  382. <li><a href="/services/DNS">DNS</a></li>
  383. <li><a href="/services/IX-Collection">IX Collection</a></li>
  384. <li><a href="/services/Clearnet-Domains">Public DNS</a></li>
  385. <li><a href="/services/Looking-Glasses">Looking Glasses</a></li>
  386. <li><a href="/services/Automatic-Peering">Automatic Peering</a></li>
  387. <li><a href="/services/Repository-Mirrors">Repository Mirrors</a></li>
  388. <li><a href="/services/Distributed-Wiki">Distributed Wiki</a></li>
  389. <li><a href="/services/Certificate-Authority">Certificate Authority</a></li>
  390. <li><a href="/services/Route-Collector">Route Collector</a></li>
  391. </ul>
  392. </li>
  393. <li>Internal
  394. <ul>
  395. <li><a href="/internal/Internal-Services">Internal services</a></li>
  396. <li><a href="/internal/Interconnections">Interconnections</a></li>
  397. <li><a href="/internal/APIs">APIs</a></li>
  398. <li><a href="/internal/ShowAndTell">Show and Tell</a></li>
  399. <li><a href="/internal/Historical-Services">Historical services</a></li>
  400. </ul>
  401. </li>
  402. <li>Historical
  403. <ul>
  404. <li><a href="/historical/Bird">Bird 1</a></li>
  405. <li><a href="/historical/Quagga">Quagga</a></li>
  406. </ul>
  407. </li>
  408. <li>External Tools
  409. <ul>
  410. <li><a href="https://paste.dn42.us">Paste Board</a></li>
  411. <li><a href="https://git.dn42.dev">Git Repositories</a></li>
  412. </ul>
  413. </li>
  414. </ul>
  415. <hr />
  416. </div>
  417. </div>
  418. </main>
  419. <footer><div class="center">
  420. <div id="dn42_footer">
  421. <table>
  422. <tbody>
  423. <tr>
  424. <td>Hosted by: <a href="mailto:dn42@burble.com">BURBLE-MNT</a>, <a href="mailto:nurtic-vibe@grmml.net">GRMML-MNT</a>, <a href="mailto:xuu@dn42.us">XUU-MNT</a>, <a href="mailto:janeric@ortgies.it">JAN-MNT</a>, <a href="mailto:lare@lare.cc">LARE-MNT</a>, <a href="mailto:danny@saru.moe">SARU-MNT</a>, <a href="mailto:androw95220@gmail.com">ANDROW-MNT</a>, <a href="mailto:dn42@mk16.de">MARK22K-MNT</a></td>
  425. <td>Accessible via: <a href="https://wiki.dn42">dn42</a>, <a href="https://dn42.dev/">dn42.dev</a>, <a href="https://dn42.eu/">dn42.eu</a>, <a href="https://wiki.dn42.us/">wiki.dn42.us</a>, <a href="https://dn42.de/">dn42.de</a> (IPv6-only), <a href="https://dn42.cc/">dn42.cc</a> (wiki-ng), <a href="https://dn42.wiki/">dn42.wiki</a>, <a href="https://dn42.pp.ua/">dn42.pp.ua</a>, <a href="https://dn42.obl.ong/">dn42.obl.ong</a></td>
  426. </tr>
  427. </tbody>
  428. </table>
  429. </div>
  430. </div>
  431. </footer>
  432. </body>
  433. </html>