<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>How-to guides on EdgeVPN</title>
    <link>https://mudler.github.io/edgevpn/docs/how-to/</link>
    <description>Recent content in How-to guides on EdgeVPN</description>
    <generator>Hugo</generator>
    <language>en</language>
    <atom:link href="https://mudler.github.io/edgevpn/docs/how-to/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Run as a VPN</title>
      <link>https://mudler.github.io/edgevpn/docs/how-to/run-as-a-vpn/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mudler.github.io/edgevpn/docs/how-to/run-as-a-vpn/</guid>
      <description>&lt;p&gt;To start the VPN, simply run &lt;code&gt;edgevpn&lt;/code&gt; without any argument.&lt;/p&gt;&#xA;&lt;p&gt;An example of running edgevpn on multiple hosts:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# on Node A&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ &lt;span style=&#34;color:#000&#34;&gt;EDGEVPNTOKEN&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;.. edgevpn --address 10.1.0.11/24&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# on Node B&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ &lt;span style=&#34;color:#000&#34;&gt;EDGEVPNTOKEN&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;.. edgevpn --address 10.1.0.12/24&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# on Node C ...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ &lt;span style=&#34;color:#000&#34;&gt;EDGEVPNTOKEN&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;.. edgevpn --address 10.1.0.13/24&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;hellip; and that&amp;rsquo;s it! the &lt;code&gt;--address&lt;/code&gt; is a &lt;em&gt;virtual&lt;/em&gt; unique IP for each node, and it is actually the ip where the node will be reachable to from the vpn. You can assign IPs freely to the nodes of the network, while you can override the default &lt;code&gt;edgevpn0&lt;/code&gt; interface with &lt;code&gt;IFACE&lt;/code&gt; (or &lt;code&gt;--interface&lt;/code&gt;)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Addressing and DHCP</title>
      <link>https://mudler.github.io/edgevpn/docs/how-to/addressing-and-dhcp/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mudler.github.io/edgevpn/docs/how-to/addressing-and-dhcp/</guid>
      <description>&lt;p&gt;Every VPN node needs a virtual address on the &lt;code&gt;edgevpn0&lt;/code&gt; interface. There are&#xA;three ways to get one, and two extra flags that change how packets are routed&#xA;once you have it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;static-addresses-with---address&#34;&gt;Static addresses with &lt;code&gt;--address&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;--address&lt;/code&gt; takes a CIDR and defaults to &lt;code&gt;10.1.0.1/24&lt;/code&gt;. It is the address the&#xA;node is reachable at from inside the VPN, and it must be unique across the&#xA;network — nothing checks this for you.&lt;/p&gt;</description>
    </item>
    <item>
      <title>IPv6</title>
      <link>https://mudler.github.io/edgevpn/docs/how-to/ipv6/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mudler.github.io/edgevpn/docs/how-to/ipv6/</guid>
      <description>&lt;div class=&#34;pageinfo pageinfo-warning&#34;&gt;&#xA;&lt;p&gt;Experimental feature. IPv6 support is provisional and has known gaps — see&#xA;below before relying on it.&lt;/p&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;IPv6 works with static addresses only. One address per interface; dual stack is&#xA;not supported, so a node is either IPv4 or IPv6, not both.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ &lt;span style=&#34;color:#000&#34;&gt;EDGEVPNTOKEN&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;.. edgevpn --address fd:ed4e::11/64 --mtu &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1500&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Two things to get right:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;The address must be static.&lt;/strong&gt; &lt;code&gt;--dhcp&lt;/code&gt; allocates IPv4 addresses only, so it&#xA;cannot be combined with an IPv6 &lt;code&gt;--address&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;--mtu&lt;/code&gt; must be above 1280&lt;/strong&gt;, the IPv6 minimum link MTU. EdgeVPN&amp;rsquo;s default&#xA;is &lt;code&gt;1200&lt;/code&gt;, which is below it, so you have to set &lt;code&gt;--mtu&lt;/code&gt; explicitly.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Tracking issue &lt;a href=&#34;https://github.com/mudler/edgevpn/issues/15&#34;&gt;#15&lt;/a&gt; is still open&#xA;at the time of writing; it is the place to check for the current state of IPv6&#xA;support.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Enable the DNS server</title>
      <link>https://mudler.github.io/edgevpn/docs/how-to/enable-dns/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mudler.github.io/edgevpn/docs/how-to/enable-dns/</guid>
      <description>&lt;div class=&#34;pageinfo pageinfo-warning&#34;&gt;&#xA;&lt;p&gt;Experimental feature!&lt;/p&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;dns-server&#34;&gt;DNS Server&lt;/h2&gt;&#xA;&lt;p&gt;A DNS Server is available but disabled by default.&lt;/p&gt;&#xA;&lt;p&gt;The DNS server will resolve DNS queries using the blockchain as a record and will forward unknown domains by default.&lt;/p&gt;&#xA;&lt;p&gt;It can be enabled by specifying a listening address with &lt;code&gt;--dns&lt;/code&gt;. For example, to bind to default &lt;code&gt;53&lt;/code&gt; port locally, run in the console:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;edgevpn --dns &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;127.0.0.1:53&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To turn off dns forwarding, specify &lt;code&gt;--dns-forwarder=false&lt;/code&gt;. Optionally a list of DNS servers can be specified multiple times with &lt;code&gt;--dns-forward-server&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Send and receive files</title>
      <link>https://mudler.github.io/edgevpn/docs/how-to/send-and-receive-files/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mudler.github.io/edgevpn/docs/how-to/send-and-receive-files/</guid>
      <description>&lt;h2 id=&#34;sending-and-receiving-files&#34;&gt;Sending and receiving files&lt;/h2&gt;&#xA;&lt;p&gt;EdgeVPN can be used to send and receive files between hosts via p2p with the  &lt;code&gt;file-send&lt;/code&gt; and &lt;code&gt;file-receive&lt;/code&gt; subcommand.&lt;/p&gt;&#xA;&lt;p&gt;Sending and receiving files, as services, don&amp;rsquo;t establish a VPN connection.&lt;/p&gt;&#xA;&lt;h3 id=&#34;sending&#34;&gt;Sending&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ edgevpn file-send --name unique-id --path /src/path&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;receiving&#34;&gt;Receiving&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ edgevpn file-receive --name unique-id --path /dst/path&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Tunnel TCP services</title>
      <link>https://mudler.github.io/edgevpn/docs/how-to/tunnel-tcp-services/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mudler.github.io/edgevpn/docs/how-to/tunnel-tcp-services/</guid>
      <description>&lt;p&gt;If you have not done this before, the step-by-step version is&#xA;&lt;a href=&#34;../../tutorials/share-a-service/&#34;&gt;Share a service between two hosts&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;forwarding-a-local-connection&#34;&gt;Forwarding a local connection&lt;/h2&gt;&#xA;&lt;p&gt;EdgeVPN can also be used to expose local(or remote) services without establishing a VPN and allocating a local tun/tap device, similarly to &lt;code&gt;ngrok&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;exposing-a-service&#34;&gt;Exposing a service&lt;/h3&gt;&#xA;&lt;p&gt;If you are used to how Local SSH forwarding works (e.g. &lt;code&gt;ssh -L 9090:something:remote &amp;lt;my_node&amp;gt;&lt;/code&gt;), EdgeVPN takes a similar approach.&lt;/p&gt;&#xA;&lt;p&gt;A Service is a generalized TCP service running in a host (also outside the network). For example, let&amp;rsquo;s say that we want to expose a SSH server inside a LAN.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTTP egress and the proxy</title>
      <link>https://mudler.github.io/edgevpn/docs/how-to/http-egress-and-proxy/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mudler.github.io/edgevpn/docs/how-to/http-egress-and-proxy/</guid>
      <description>&lt;div class=&#34;pageinfo pageinfo-warning&#34;&gt;&#xA;&lt;p&gt;Only plain HTTP is proxied. HTTPS does not work — see&#xA;&lt;a href=&#34;https://mudler.github.io/edgevpn/docs/how-to/http-egress-and-proxy/#https-does-not-work&#34;&gt;HTTPS does not work&lt;/a&gt; below.&lt;/p&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;EdgeVPN can designate one or more nodes as &lt;strong&gt;HTTP egress&lt;/strong&gt; nodes. Another peer&#xA;runs &lt;code&gt;edgevpn proxy&lt;/code&gt;, which exposes an ordinary local HTTP proxy. Requests sent&#xA;to that proxy travel over libp2p to one of the egress nodes, which performs the&#xA;request from its own network and streams the response back.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-this-is-and-what-it-is-not&#34;&gt;What this is, and what it is not&lt;/h2&gt;&#xA;&lt;p&gt;This proxies &lt;strong&gt;HTTP requests&lt;/strong&gt;, not arbitrary IP traffic. It is not a VPN exit&#xA;node: nothing is rerouted at the IP layer, your default route is untouched, and&#xA;only the clients you explicitly point at the local proxy are affected. If you&#xA;want a real network interface between peers, that is&#xA;&lt;a href=&#34;../run-as-a-vpn/&#34;&gt;run as a VPN&lt;/a&gt; instead.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Relays and hop nodes</title>
      <link>https://mudler.github.io/edgevpn/docs/how-to/relays-and-hop-nodes/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mudler.github.io/edgevpn/docs/how-to/relays-and-hop-nodes/</guid>
      <description>&lt;p&gt;Two nodes behind NAT cannot always dial each other. EdgeVPN tries hole punching&#xA;first (&lt;code&gt;--holepunch&lt;/code&gt;, on by default), but hole punching needs a third party that&#xA;both peers can already reach, and it does not work through every NAT. A &lt;strong&gt;relay&lt;/strong&gt;&#xA;is that third party: a node on a reachable address that other peers connect&#xA;through.&lt;/p&gt;&#xA;&lt;p&gt;A relay does not need a VPN interface, an IP on the virtual network, or root.&#xA;&lt;code&gt;edgevpn start&lt;/code&gt; is the command for it:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ledger ownership</title>
      <link>https://mudler.github.io/edgevpn/docs/how-to/ledger-ownership/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mudler.github.io/edgevpn/docs/how-to/ledger-ownership/</guid>
      <description>&lt;div class=&#34;pageinfo pageinfo-warning&#34;&gt;&#xA;&lt;p&gt;&lt;code&gt;--ownership&lt;/code&gt; is the one EdgeVPN setting that &lt;strong&gt;every node on a network must&#xA;agree on&lt;/strong&gt;. Mixing &lt;code&gt;off&lt;/code&gt; with &lt;code&gt;enforce&lt;/code&gt; produces a network that looks up but&#xA;silently drops half its ledger. If you are upgrading an existing network, read&#xA;&lt;a href=&#34;https://mudler.github.io/edgevpn/docs/how-to/ledger-ownership/#changing-the-mode-on-a-live-network&#34;&gt;Changing the mode on a live network&lt;/a&gt;&#xA;first.&lt;/p&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Every peer that holds the network token can write to the&#xA;&lt;a href=&#34;../../explanation/the-ledger/&#34;&gt;ledger&lt;/a&gt;. Without ownership, it can write to&#xA;&lt;em&gt;anyone&amp;rsquo;s&lt;/em&gt; entries: overwrite the &lt;code&gt;machines&lt;/code&gt; record that maps an IP to a peer,&#xA;claim someone else&amp;rsquo;s DNS name, or replace a service announcement. Ownership&#xA;closes that gap by binding each entry to the libp2p identity that wrote it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Trusted networks</title>
      <link>https://mudler.github.io/edgevpn/docs/how-to/trusted-networks/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mudler.github.io/edgevpn/docs/how-to/trusted-networks/</guid>
      <description>&lt;div class=&#34;pageinfo pageinfo-warning&#34;&gt;&#xA;&lt;p&gt;Experimental feature!&lt;/p&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Trust zones are the only mechanism in EdgeVPN that can exclude a peer holding a&#xA;valid network token &lt;em&gt;at runtime&lt;/em&gt; — everything else, the token itself, ledger&#xA;ownership and relay ACLs, assumes every token holder is a full member. If your&#xA;membership is a fixed set of hosts, &lt;code&gt;--static-peertable&lt;/code&gt; excludes token holders&#xA;too, without being experimental; see&#xA;&lt;a href=&#34;../../explanation/security-model/#static-peer-tables&#34;&gt;static peer tables&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Read &lt;a href=&#34;../../explanation/security-model/&#34;&gt;the security model&lt;/a&gt; first either way.&#xA;It covers what peergating adds, what it deliberately does not add, and the&#xA;admission gap in the current implementation that you should weigh before&#xA;relying on it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Use EdgeVPN as a library</title>
      <link>https://mudler.github.io/edgevpn/docs/how-to/use-as-a-library/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mudler.github.io/edgevpn/docs/how-to/use-as-a-library/</guid>
      <description>&lt;p&gt;EdgeVPN can be used as a library. It is very portable and offers a functional&#xA;interface.&lt;/p&gt;&#xA;&lt;p&gt;To join a node in a network from a token, without starting the vpn:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-golang&#34; data-lang=&#34;golang&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;import&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;github.com/ipfs/go-log&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;github.com/mudler/edgevpn/pkg/discovery&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;github.com/mudler/edgevpn/pkg/logger&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;github.com/mudler/edgevpn/pkg/node&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;d&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:=&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;discovery&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;NewDHT&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;m&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:=&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;discovery&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;MDNS&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;e&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;err&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:=&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;New&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Logger&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;logger&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;New&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;log&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;LevelInfo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)),&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;MaxMessageSize&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;20&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;),&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;node&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;FromBase64&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;mDNSEnabled&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;DHTEnabled&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;d&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;m&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;),&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// ....&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;err&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!=&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;nil&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;err&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;err&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:=&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;e&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Start&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ctx&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;err&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!=&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;nil&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;err&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;node.FromBase64&lt;/code&gt; decodes the same base64 token the CLI uses (&lt;code&gt;edgevpn -g -b&lt;/code&gt;)&#xA;and wires the discovery services into the node, which is why it takes the&#xA;&lt;code&gt;*discovery.DHT&lt;/code&gt; and &lt;code&gt;*discovery.MDNS&lt;/code&gt; values you built above. The two booleans&#xA;enable mDNS and DHT discovery respectively.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Run with Docker</title>
      <link>https://mudler.github.io/edgevpn/docs/how-to/run-with-docker/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mudler.github.io/edgevpn/docs/how-to/run-with-docker/</guid>
      <description>&lt;p&gt;The repository ships a&#xA;&lt;a href=&#34;https://github.com/mudler/edgevpn/blob/master/docker-compose.yml&#34;&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/a&gt;&#xA;that brings up a single VPN node. It is short, and every line in it is there for&#xA;a reason. This page explains those reasons, so you can adapt it instead of&#xA;copying it.&lt;/p&gt;&#xA;&lt;p&gt;For the published image and its tags — in particular why &lt;code&gt;:latest&lt;/code&gt; is a&#xA;development build and not the newest release — see&#xA;&lt;a href=&#34;../../tutorials/install/#container-image&#34;&gt;install&lt;/a&gt;. Everything below assumes&#xA;you have picked a tag.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;div class=&#34;pageinfo pageinfo-warning&#34;&gt;&#xA;&lt;p&gt;Running the VPN in a container gives it the same reach as running it on the&#xA;host: with &lt;code&gt;network_mode: host&lt;/code&gt; and &lt;code&gt;NET_ADMIN&lt;/code&gt; it creates a systemwide network&#xA;interface and can reconfigure host networking. The container boundary is not&#xA;buying you isolation here.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Persist node identity and state</title>
      <link>https://mudler.github.io/edgevpn/docs/how-to/persist-node-identity/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mudler.github.io/edgevpn/docs/how-to/persist-node-identity/</guid>
      <description>&lt;div class=&#34;pageinfo pageinfo-warning&#34;&gt;&#xA;&lt;p&gt;&lt;strong&gt;This page has not been written.&lt;/strong&gt; By default an EdgeVPN node generates a fresh&#xA;libp2p key on every start, so its peer ID changes on every restart. Under&#xA;&lt;code&gt;--ownership enforce&lt;/code&gt; (the default) that orphans everything the node had&#xA;announced. The flags that change this are documented only by their one-line&#xA;&lt;code&gt;--help&lt;/code&gt; text.&lt;/p&gt;&#xA;&lt;p&gt;What is missing, and where the source is:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;--privkey-cache&lt;/code&gt;&lt;/strong&gt; (env &lt;code&gt;EDGEVPNPRIVKEYCACHE&lt;/code&gt;, off by default, marked&#xA;experimental) and &lt;strong&gt;&lt;code&gt;--privkey-cache-dir&lt;/code&gt;&lt;/strong&gt; (env &lt;code&gt;EDGEVPNPRIVKEYCACHEDIR&lt;/code&gt;,&#xA;defaulting to &lt;code&gt;$HOME/.edgevpn&lt;/code&gt;). The implementation is in &lt;code&gt;cmd/util.go&lt;/code&gt;: it&#xA;reads or generates &lt;code&gt;&amp;lt;dir&amp;gt;/privkey&lt;/code&gt;, writing the directory &lt;code&gt;0700&lt;/code&gt; and the file&#xA;&lt;code&gt;0600&lt;/code&gt;. The comment above it explains why it is not enabled automatically —&#xA;the default directory is per-user, so two co-located EdgeVPN processes sharing&#xA;it would boot with the &lt;em&gt;same&lt;/em&gt; peer ID. Each node needs its own directory.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;The interaction with ownership.&lt;/strong&gt; &lt;code&gt;cmd/util.go&lt;/code&gt; emits a warning when&#xA;ownership enforcement is on and the identity is ephemeral, because the node&amp;rsquo;s&#xA;entries are reclaimed after the liveness TTL on every restart. See&#xA;&lt;a href=&#34;../ledger-ownership/&#34;&gt;ledger ownership&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;--ledger-state&lt;/code&gt;&lt;/strong&gt; (env &lt;code&gt;EDGEVPNLEDGERSTATE&lt;/code&gt;) is a different thing that gets&#xA;confused with the above: it points the ledger at a &lt;code&gt;DiskStore&lt;/code&gt;&#xA;(&lt;code&gt;pkg/blockchain/store_disk.go&lt;/code&gt;) instead of the default in-memory store. It&#xA;persists the block chain, not the identity.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Backup, rotation and revocation&lt;/strong&gt; of a cached key: not addressed anywhere.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Contributions welcome — see &lt;a href=&#34;../../contributing/&#34;&gt;contributing&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Run with systemd</title>
      <link>https://mudler.github.io/edgevpn/docs/how-to/run-with-systemd/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mudler.github.io/edgevpn/docs/how-to/run-with-systemd/</guid>
      <description>&lt;div class=&#34;pageinfo pageinfo-warning&#34;&gt;&#xA;&lt;p&gt;&lt;strong&gt;This page has not been written.&lt;/strong&gt; There is no systemd guide on this site&#xA;beyond the short&#xA;&lt;a href=&#34;../../tutorials/install/#running-it-as-a-service&#34;&gt;template-unit section of the install page&lt;/a&gt;,&#xA;which covers only the &lt;code&gt;edgevpn@.service&lt;/code&gt; unit that &lt;code&gt;install.sh&lt;/code&gt; drops in.&lt;/p&gt;&#xA;&lt;p&gt;What is missing, and where the source is:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;API socket activation.&lt;/strong&gt; &lt;code&gt;api/api.go&lt;/code&gt; (&lt;code&gt;systemdSocketListener&lt;/code&gt;) reads&#xA;&lt;code&gt;LISTEN_PID&lt;/code&gt; and &lt;code&gt;LISTEN_FDS&lt;/code&gt; and, when &lt;code&gt;LISTEN_PID&lt;/code&gt; matches the process and&#xA;&lt;code&gt;LISTEN_FDS&lt;/code&gt; is exactly &lt;code&gt;1&lt;/code&gt;, adopts the already-bound listener on FD 3 instead&#xA;of binding one itself. The socket&amp;rsquo;s path, owner, group and mode are then&#xA;entirely whatever the &lt;code&gt;.socket&lt;/code&gt; unit declares — EdgeVPN deliberately does not&#xA;chmod or unlink it. No example &lt;code&gt;.socket&lt;/code&gt;/&lt;code&gt;.service&lt;/code&gt; pair is documented&#xA;anywhere.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;APILISTENUNIXMODE&lt;/code&gt;.&lt;/strong&gt; Read by &lt;code&gt;unixSocketMode&lt;/code&gt; in &lt;code&gt;api/api.go&lt;/code&gt;, it sets the&#xA;mode only on the path where EdgeVPN creates the socket itself&#xA;(&lt;code&gt;--api-listen unix:///run/edgevpn.sock&lt;/code&gt;). It defaults to &lt;code&gt;0660&lt;/code&gt; and silently&#xA;falls back to that default if the value is not valid octal. It has no effect&#xA;under socket activation.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Hardening a unit.&lt;/strong&gt; &lt;code&gt;NET_ADMIN&lt;/code&gt;, &lt;code&gt;/dev/net/tun&lt;/code&gt;, &lt;code&gt;DynamicUser&lt;/code&gt;, and which&#xA;of the &lt;a href=&#34;../../reference/environment-variables/&#34;&gt;environment variables&lt;/a&gt; belong&#xA;in an &lt;code&gt;EnvironmentFile&lt;/code&gt; rather than the unit.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Contributions welcome — see &lt;a href=&#34;../../contributing/&#34;&gt;contributing&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tune for low-end devices</title>
      <link>https://mudler.github.io/edgevpn/docs/how-to/tune-for-low-end-devices/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mudler.github.io/edgevpn/docs/how-to/tune-for-low-end-devices/</guid>
      <description>&lt;div class=&#34;pageinfo pageinfo-warning&#34;&gt;&#xA;&lt;p&gt;&lt;strong&gt;This page has not been written.&lt;/strong&gt; EdgeVPN has a full set of resource-limiting&#xA;flags and none of them are explained beyond their &lt;code&gt;--help&lt;/code&gt; line. There is no&#xA;guidance on which to reach for on a Raspberry Pi, a router or a container with a&#xA;tight memory cgroup.&lt;/p&gt;&#xA;&lt;p&gt;What is missing, and where the source is:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;--low-profile&lt;/code&gt;&lt;/strong&gt; (env &lt;code&gt;EDGEVPNLOWPROFILE&lt;/code&gt;) is &lt;strong&gt;on by default&lt;/strong&gt;, which is&#xA;itself undocumented, and its name promises more than it does: in&#xA;&lt;code&gt;pkg/config/config.go&lt;/code&gt; the flag&amp;rsquo;s only effect is &lt;code&gt;dht.BucketSize(20)&lt;/code&gt;. A&#xA;second, unrelated &lt;code&gt;vpn.LowProfile&lt;/code&gt; library option in &lt;code&gt;pkg/vpn/config.go&lt;/code&gt;&#xA;swaps in a bounded stream manager (&lt;code&gt;pkg/vpn/vpn.go&lt;/code&gt;) and is &lt;em&gt;not&lt;/em&gt; wired to the&#xA;CLI flag. The difference needs writing up.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;The ten &lt;code&gt;limit-*&lt;/code&gt; flags&lt;/strong&gt; in &lt;code&gt;cmd/util.go&lt;/code&gt;, which configure the libp2p&#xA;resource manager: &lt;code&gt;--limit-enable&lt;/code&gt; (off by default — the others do nothing&#xA;until it is on), &lt;code&gt;--limit-file&lt;/code&gt;, &lt;code&gt;--limit-scope&lt;/code&gt;, &lt;code&gt;--limit-config-streams&lt;/code&gt;,&#xA;&lt;code&gt;--limit-config-streams-inbound&lt;/code&gt;, &lt;code&gt;--limit-config-streams-outbound&lt;/code&gt;,&#xA;&lt;code&gt;--limit-config-conn&lt;/code&gt;, &lt;code&gt;--limit-config-conn-inbound&lt;/code&gt;,&#xA;&lt;code&gt;--limit-config-conn-outbound&lt;/code&gt; and &lt;code&gt;--limit-config-fd&lt;/code&gt;. Their defaults&#xA;(200/30/30, 200/30/30, 30) are not documented and their relationship to&#xA;&lt;code&gt;--limit-scope&lt;/code&gt; is not explained.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Connection water marks.&lt;/strong&gt; &lt;code&gt;--connection-high-water&lt;/code&gt; and&#xA;&lt;code&gt;--connection-low-water&lt;/code&gt; (env &lt;code&gt;EDGEVPN_CONNECTION_HIGH_WATER&lt;/code&gt; /&#xA;&lt;code&gt;EDGEVPN_CONNECTION_LOW_WATER&lt;/code&gt;) both default to &lt;code&gt;0&lt;/code&gt;, and what &lt;code&gt;0&lt;/code&gt; means is not&#xA;stated anywhere. &lt;code&gt;--max-connections&lt;/code&gt; (env &lt;code&gt;EDGEVPNMAXCONNS&lt;/code&gt;) is a third knob&#xA;in the same area.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;What to turn off.&lt;/strong&gt; &lt;code&gt;--dht&lt;/code&gt;, &lt;code&gt;--mdns&lt;/code&gt;, &lt;code&gt;--natservice&lt;/code&gt;, &lt;code&gt;--natmap&lt;/code&gt;,&#xA;&lt;code&gt;--autorelay&lt;/code&gt; and &lt;code&gt;--relay-service&lt;/code&gt; are all on by default and all cost&#xA;something; &lt;code&gt;--relay-service=false&lt;/code&gt; in particular stops the node carrying other&#xA;peers&amp;rsquo; traffic. See &lt;a href=&#34;../relays-and-hop-nodes/&#34;&gt;relays and hop nodes&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Contributions welcome — see &lt;a href=&#34;../../contributing/&#34;&gt;contributing&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
