public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Stefan Hanreich <s.hanreich@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: superseded: [PATCH cluster/manager/network/proxmox{,-ve-rs,-perl-rs} v4 00/31] Add WireGuard as protocol to SDN fabrics
Date: Tue, 12 May 2026 19:38:34 +0200	[thread overview]
Message-ID: <5db8f6f7-fc06-4476-9712-49a14e0aaf19@proxmox.com> (raw)
In-Reply-To: <20260507124008.417223-1-s.hanreich@proxmox.com>

https://lore.proxmox.com/pve-devel/20260512173145.596958-1-s.hanreich@proxmox.com/T/#t

On 5/7/26 2:38 PM, Stefan Hanreich wrote:
> This patch series is based on top of the route-maps series [1]. While it does
> not rely on any of the features / code included there, there are some merge
> conflicts when applying either series first, so I'm sending it based on top of
> the route-maps series so they can be applied conveniently after another.
> 
> ## Introduction
> 
> This patch series introduces WireGuard as fabric protocol. Potential use-cases
> include:
> 
> * Connecting to remote PBS / PDM instances
> * Simple encryption layer for intra-DC VXLAN tunnels
> * Secure migration network
> * Connecting with remote PVE clusters
> 
> It utilizes the wg(8) tool for generating the interface configuration [2] and
> the section config format leans heavily into the keys defined there.
> 
> 
> ## Configuration format
> 
> The configuration format is quite similar to OSPF and Openfabric with the main
> difference being that WireGuard nodes have been split into two subtypes
> (external and internal), in order to support nodes that are not part of the
> cluster.
> 
> ### Nodes
> 
> WireGuard nodes have been split into two different types. Those are not distinct
> section config types, due to how the internal representation of the FabricConfig
> has been structured (which maps exactly one Fabric type to one Node type). So
> instead there is one Node type that is an enum. The 'role' field is used for
> distinguishing between different WireGuard node types.
> 
> #### Internal
> 
> This represents a node that is part of the Proxmox VE cluster.
> 
> An example configuration looks like this:
> 
>     wireguard_node: vpn_elementalist
>             endpoint 192.0.2.1
>             allowed_ips 203.0.113.128/25
>             interfaces name=wg0,listen_port=50000,public_key=O+Kzrochm6klMILjSKVw83xb3YyXXLpmZj9n/ICM5xE=,ip=198.51.100.1/24
>             role internal
> 
> The endpoint value will be used by other nodes inside the Proxmox VE cluster for
> connecting to the defined node. IPs are defined on a per-interface basis, not a
> per-node basis. The interface key represents the [Interface] section in the
> WireGuard configuration. All values (except for public key) are overridable in
> the peer definition.
> 
> #### External
> 
> External nodes represent any peer that is not a Proxmox VE node. They provide a
> mechanism for defining a reusable peer definition (see below for more details).
> 
> This allows for easily re-using and updating the information of an external
> peer, without having to re-type all information for every Proxmox VE node that
> wants to utilize the definition.
> 
> An example configuration looks like this:
> 
>     wireguard_node: vpn_berserker
>             endpoint berserker:51337
>             allowed_ips 203.0.113.0/25
>             public_key GDPUAnPOY5xGIjYXmcGyXZXbocjBr21dGQ5vwnjmdzA=
>             role external
> 
> Those keys map 1:1 to the peer entries in the respective WireGuard configuration
> format and are used for generating the peer definition wherever they are
> referenced.
> 
> ### Peers
> 
> Interfaces on Proxmox nodes can have one or more peers. A peer is a reference to
> either the interface of an internal node, or an external node. Due to
> limitations in dealing with nested data in the section config, peers are an
> array field in the node, instead of being configured on the interface directly.
> 
> An example configuration for a Proxmox VE node with an interface that has an
> internal and external node as peer looks as follows:
> 
>     wireguard_node: vpn_occultist
>             endpoint 192.0.2.2
>             interfaces name=wg0,listen_port=50000,public_key=y0kOpXfo9ff4KoUwO3H1cRuwObbKwsK8mAkwXxNvKUc=,ip=198.51.100.2/24
>             peers type=internal,node=elementalist,node_iface=wg0,iface=wg0
>             peers type=external,node=berserker,iface=wg0
>             role internal
> 
> This would generate the following wg0.conf file:
> 
>     [Interface]
>     PrivateKey = <some_private_key>
>     ListenPort = 50000
> 
>     [Peer]
>     PublicKey = O+Kzrochm6klMILjSKVw83xb3YyXXLpmZj9n/ICM5xE=
>     AllowedIPs = 198.51.100.1/32
>     Endpoint = 192.0.2.1:50000
>     AllowedIPs = 203.0.113.128/25
> 
>     [Peer]
>     PublicKey = GDPUAnPOY5xGIjYXmcGyXZXbocjBr21dGQ5vwnjmdzA=
>     Endpoint = berserker:51337
>     AllowedIPs = 203.0.113.0/25
> 
> 
> Peer definitions allow overriding properties from the node definition (e.g.
> endpoint). This is currently not implemented in the frontend. This is also the
> main reason for choosing to store peers as an array in a different key.
> Referencing peer defintions by id would have been possible in the interface
> property string, but if the possibility of overriding certain attributes should
> be available, then a separate key with property strings is required.
> 
> 
> ## Key handling
> 
> Keys are automatically generated in the backend on demand, whenever an interface
> is created. Keys are deleted upon applying the SDN configuration. After a
> key has been generated, the respective public key gets stored in the section
> config.
> 
> The WireGuard configuration files are stored locally on the node in the newly
> established '/etc/wireguard/proxmox' folder, and managed by the node itself.
> 
> 
> ## Open questions / issues
> 
> ### Peers
> 
> The main issue I see with the configuration format is that peers reference
> arbitrary node sections / interface definitions in the fabric config. This poses
> some problems, particularly when updating the referenced entities. For instance,
> users could delete a referenced interface, invalidating the configuration. This
> is quite similar to the problems we currently encounter with firewall ipsets and
> aliases.
> 
> In order to avoid re-creating the same issues there are a few restrictions in
> the UI that should prevent the most common mistakes:
> 
> * Renaming nodes and interfaces is not allowed.
> * The configuration is validated after every modification and invalid
>   configurations are outright rejected. This is particularly important for
>   delete operations.
> 
> In the future we could lift some restrictions by implementing smarter CRUD
> operations. For instance, when deleting an interface all peer entries, that
> reference that interface, could be deleted as well. Even for accidental
> deletions this isn't too bad imo, since we have a mechanism of restoring the
> current running configuration, which users can always use.
> 
> For updates to the interfaces of a node this is harder, since it is impossible
> to say whether an interface has been renamed or an interface has been deleted
> and another one created. I don't really see a good heuristic (even when tracking
> this in the UI) that works particularly well for all potential cases.
> 
> ### Section Types
> 
> The split of one section type ('wireguard_node') into two different subtypes is
> breaking a bit with section config principles. Another solution would be to
> introduce two section config types (e.g. wireguard_node_{external,internal}),
> although that would require quite some refactoring effort.
> 
> 
> ## Future work
> 
> * implement status reporting
> * provide QoL features for easier config (e.g. auto-"fullmeshify" PVE cluster)
> * Implement some backend-only features in the UI (e.g. per-peer overrides,
>   pre-shared keys)
> * Integration into PDM / PBS
> 
> 
> ## Dependencies
> 
> * proxmox-ve-config depends on proxmox-sdn-types
> * proxmox-ve-config depends on proxmox-network-types
> * proxmox-ve-config depends on proxmox-wireguard
> * proxmox-perl-rs depends on proxmox-ve-config
> * pve-network depends on proxmox-perl-rs
> * pve-network depends on pve-cluster
> * pve-manager depends on pve-network
> 
> 
> Changes from v3 (Thanks @Thomas):
> * rebased on top of current master
> * use x25519 instead of ed25519 for public key derivation (which is the correct
>   algorithm)
> * moved keys to pmxcfs into a section config file under /etc/pve/priv
> * delete keys on applying the SDN config, not when calling DELETE API call
> * fix error message when referenced interface does not exist
> * fix validating the existence of interfaces
> * fix editing an external node
> 
> Changes from v2 (Thanks @Gabriel):
> * rebased branches on top of current master + route-maps series
> * added backend-only option to skip auto-generating routes
> * added possibility to include wireguard interfaces when selecting interfaces
>   for nodes in other fabric types
> * show auto-generated public key in Web UI
> * improved validation error messages
> * added better descriptions in the UI for the endpoint / allowed ips options
> * added newline to generated ifupdown2 config stanza
> * added early failure in case wireguard-tools isn't installed
> 
> Changes from RFC:
> * rebased on top of current master branches
> 
> [1] https://lore.proxmox.com/pve-devel/20260504160350.395470-2-s.hanreich@proxmox.com/T/#t
> [2] https://man7.org/linux/man-pages/man8/wg.8.html
> 
> 
> pve-cluster:
> 
> Stefan Hanreich (1):
>   cfs: add 'priv/wg-keys.cfg' to observed files
> 
>  src/PVE/Cluster.pm  | 1 +
>  src/pmxcfs/status.c | 1 +
>  2 files changed, 2 insertions(+)
> 
> 
> proxmox:
> 
> Stefan Hanreich (4):
>   wireguard: utilize x25519 for public key generation
>   wireguard: skip serializing preshared_key if unset
>   wireguard: implement ApiType for private key
>   network-types: implement ApiType for endpoints and hostnames
> 
>  proxmox-network-types/src/endpoint.rs | 30 ++++++++++-
>  proxmox-wireguard/Cargo.toml          |  1 +
>  proxmox-wireguard/src/lib.rs          | 72 +++++++++++++--------------
>  3 files changed, 64 insertions(+), 39 deletions(-)
> 
> 
> proxmox-ve-rs:
> 
> Christoph Heiss (2):
>   sdn-types: add wireguard-specific PersistentKeepalive api type
>   ve-config: fabric: refactor fabric config entry impl using macro
> 
> Stefan Hanreich (6):
>   ve-config: fabrics: split interface name regex into two parts
>   ve-config: fabrics: add protocol-specific properties for wireguard
>   ve-config: wireguard: add private keys section config
>   ve-config: sdn: fabrics: add wireguard to the fabric config
>   ve-config: fabrics: wireguard add validation for wireguard config
>   ve-config: fabrics: implement wireguard config generation
> 
>  proxmox-sdn-types/src/lib.rs                  |   1 +
>  proxmox-sdn-types/src/wireguard.rs            |  43 +
>  proxmox-ve-config/Cargo.toml                  |   3 +
>  proxmox-ve-config/debian/control              |   6 +
>  proxmox-ve-config/src/sdn/fabric/frr.rs       |   1 +
>  proxmox-ve-config/src/sdn/fabric/mod.rs       | 405 +++++++--
>  .../src/sdn/fabric/section_config/fabric.rs   |  25 +
>  .../sdn/fabric/section_config/interface.rs    |   5 +-
>  .../src/sdn/fabric/section_config/mod.rs      |  58 ++
>  .../src/sdn/fabric/section_config/node.rs     |  32 +-
>  .../sdn/fabric/section_config/protocol/mod.rs |   1 +
>  .../section_config/protocol/wireguard.rs      | 788 ++++++++++++++++++
>  proxmox-ve-config/src/sdn/mod.rs              |   1 +
>  proxmox-ve-config/src/sdn/wireguard.rs        | 309 +++++++
>  14 files changed, 1607 insertions(+), 71 deletions(-)
>  create mode 100644 proxmox-sdn-types/src/wireguard.rs
>  create mode 100644 proxmox-ve-config/src/sdn/fabric/section_config/protocol/wireguard.rs
>  create mode 100644 proxmox-ve-config/src/sdn/wireguard.rs
> 
> 
> proxmox-perl-rs:
> 
> Christoph Heiss (1):
>   pve-rs: fabrics: wireguard: generate ifupdown2 configuration
> 
> Stefan Hanreich (2):
>   pve-rs: fabrics: add helpers for parsing interface property strings
>   pve-rs: sdn: wireguard: add private keys module
> 
>  pve-rs/Cargo.toml                    |   1 +
>  pve-rs/Makefile                      |   1 +
>  pve-rs/src/bindings/sdn/fabrics.rs   | 217 +++++++++++++++++++++++----
>  pve-rs/src/bindings/sdn/mod.rs       |   1 +
>  pve-rs/src/bindings/sdn/wireguard.rs | 103 +++++++++++++
>  pve-rs/src/sdn/status.rs             |  16 ++
>  6 files changed, 308 insertions(+), 31 deletions(-)
>  create mode 100644 pve-rs/src/bindings/sdn/wireguard.rs
> 
> 
> pve-network:
> 
> Christoph Heiss (1):
>   sdn: add wireguard helper module
> 
> Stefan Hanreich (2):
>   fabrics: wireguard: add schema definitions for wireguard
>   fabrics: wireguard: implement wireguard key auto-generation
> 
>  src/PVE/API2/Network/SDN.pm                   |   4 +-
>  .../API2/Network/SDN/Fabrics/FabricNode.pm    | 105 ++++++++++-
>  src/PVE/Network/SDN.pm                        |   2 +
>  src/PVE/Network/SDN/Fabrics.pm                | 173 +++++++++++++++++-
>  src/PVE/Network/SDN/Makefile                  |   3 +-
>  src/PVE/Network/SDN/WireGuard.pm              | 162 ++++++++++++++++
>  6 files changed, 435 insertions(+), 14 deletions(-)
>  create mode 100644 src/PVE/Network/SDN/WireGuard.pm
> 
> 
> pve-manager:
> 
> Christoph Heiss (2):
>   ui: fabrics: edit: make ipv4/6 support generic over fabric panels
>   ui: fabrics: interface: make ipv4/6 support generic over edit panels
> 
> Stefan Hanreich (10):
>   network: sdn: generate wireguard configuration on apply
>   ui: fix parsing of property-strings when values contain =
>   ui: fabrics: i18n: make node loading string translatable
>   ui: fabrics: split node selector creation and config
>   ui: fabrics: node: make ipv4/6 support generic over edit panels
>   ui: fabrics: wireguard: add interface edit panel
>   ui: fabrics: wireguard: add node edit panel
>   ui: fabrics: wireguard: add fabric edit panel
>   ui: fabrics: hook up wireguard components
>   fabrics: node edit: add option to include wireguard interfaces
> 
>  PVE/API2/Network.pm                           |   1 +
>  www/manager6/Makefile                         |   3 +
>  www/manager6/Parser.js                        |   7 +-
>  www/manager6/sdn/FabricsView.js               |  12 +
>  www/manager6/sdn/fabrics/FabricEdit.js        |  68 ++-
>  www/manager6/sdn/fabrics/InterfacePanel.js    |  18 +
>  www/manager6/sdn/fabrics/NodeEdit.js          | 108 ++++-
>  .../sdn/fabrics/openfabric/FabricEdit.js      |  32 --
>  .../sdn/fabrics/openfabric/InterfacePanel.js  |  13 -
>  .../sdn/fabrics/openfabric/NodeEdit.js        |  14 -
>  www/manager6/sdn/fabrics/ospf/FabricEdit.js   |   2 +
>  .../sdn/fabrics/ospf/InterfacePanel.js        |   2 +
>  www/manager6/sdn/fabrics/ospf/NodeEdit.js     |   3 +
>  .../sdn/fabrics/wireguard/FabricEdit.js       |  29 ++
>  .../sdn/fabrics/wireguard/InterfacePanel.js   | 435 ++++++++++++++++++
>  .../sdn/fabrics/wireguard/NodeEdit.js         | 229 +++++++++
>  16 files changed, 882 insertions(+), 94 deletions(-)
>  create mode 100644 www/manager6/sdn/fabrics/wireguard/FabricEdit.js
>  create mode 100644 www/manager6/sdn/fabrics/wireguard/InterfacePanel.js
>  create mode 100644 www/manager6/sdn/fabrics/wireguard/NodeEdit.js
> 
> 
> Summary over all repositories:
>   47 files changed, 3298 insertions(+), 249 deletions(-)
> 





      parent reply	other threads:[~2026-05-12 17:38 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-07 12:39 [PATCH cluster/manager/network/proxmox{,-ve-rs,-perl-rs} v4 00/31] Add WireGuard as protocol to SDN fabrics Stefan Hanreich
2026-05-07 12:39 ` [PATCH pve-cluster v4 01/31] cfs: add 'priv/wg-keys.cfg' to observed files Stefan Hanreich
2026-05-07 12:39 ` [PATCH proxmox v4 02/31] wireguard: utilize x25519 for public key generation Stefan Hanreich
2026-05-07 12:40   ` Stefan Hanreich
2026-05-07 12:39 ` [PATCH proxmox v4 03/31] wireguard: skip serializing preshared_key if unset Stefan Hanreich
2026-05-07 12:39 ` [PATCH proxmox v4 04/31] wireguard: implement ApiType for private key Stefan Hanreich
2026-05-07 12:39 ` [PATCH proxmox v4 05/31] network-types: implement ApiType for endpoints and hostnames Stefan Hanreich
2026-05-07 12:39 ` [PATCH proxmox-ve-rs v4 06/31] sdn-types: add wireguard-specific PersistentKeepalive api type Stefan Hanreich
2026-05-07 12:39 ` [PATCH proxmox-ve-rs v4 07/31] ve-config: fabrics: split interface name regex into two parts Stefan Hanreich
2026-05-07 12:39 ` [PATCH proxmox-ve-rs v4 08/31] ve-config: fabric: refactor fabric config entry impl using macro Stefan Hanreich
2026-05-07 12:39 ` [PATCH proxmox-ve-rs v4 09/31] ve-config: fabrics: add protocol-specific properties for wireguard Stefan Hanreich
2026-05-07 12:39 ` [PATCH proxmox-ve-rs v4 10/31] ve-config: wireguard: add private keys section config Stefan Hanreich
2026-05-07 12:39 ` [PATCH proxmox-ve-rs v4 11/31] ve-config: sdn: fabrics: add wireguard to the fabric config Stefan Hanreich
2026-05-07 12:39 ` [PATCH proxmox-ve-rs v4 12/31] ve-config: fabrics: wireguard add validation for wireguard config Stefan Hanreich
2026-05-11 13:36   ` Arthur Bied-Charreton
2026-05-11 17:01     ` Stefan Hanreich
2026-05-07 12:39 ` [PATCH proxmox-ve-rs v4 13/31] ve-config: fabrics: implement wireguard config generation Stefan Hanreich
2026-05-07 12:39 ` [PATCH proxmox-perl-rs v4 14/31] pve-rs: fabrics: wireguard: generate ifupdown2 configuration Stefan Hanreich
2026-05-07 12:39 ` [PATCH proxmox-perl-rs v4 15/31] pve-rs: fabrics: add helpers for parsing interface property strings Stefan Hanreich
2026-05-07 12:39 ` [PATCH proxmox-perl-rs v4 16/31] pve-rs: sdn: wireguard: add private keys module Stefan Hanreich
2026-05-07 12:39 ` [PATCH pve-network v4 17/31] sdn: add wireguard helper module Stefan Hanreich
2026-05-07 12:39 ` [PATCH pve-network v4 18/31] fabrics: wireguard: add schema definitions for wireguard Stefan Hanreich
2026-05-11 13:38   ` Arthur Bied-Charreton
2026-05-11 17:03     ` Stefan Hanreich
2026-05-07 12:39 ` [PATCH pve-network v4 19/31] fabrics: wireguard: implement wireguard key auto-generation Stefan Hanreich
2026-05-07 12:39 ` [PATCH pve-manager v4 20/31] network: sdn: generate wireguard configuration on apply Stefan Hanreich
2026-05-07 12:39 ` [PATCH pve-manager v4 21/31] ui: fix parsing of property-strings when values contain = Stefan Hanreich
2026-05-07 12:39 ` [PATCH pve-manager v4 22/31] ui: fabrics: i18n: make node loading string translatable Stefan Hanreich
2026-05-07 12:39 ` [PATCH pve-manager v4 23/31] ui: fabrics: split node selector creation and config Stefan Hanreich
2026-05-07 12:39 ` [PATCH pve-manager v4 24/31] ui: fabrics: edit: make ipv4/6 support generic over fabric panels Stefan Hanreich
2026-05-07 12:40 ` [PATCH pve-manager v4 25/31] ui: fabrics: node: make ipv4/6 support generic over edit panels Stefan Hanreich
2026-05-07 12:40 ` [PATCH pve-manager v4 26/31] ui: fabrics: interface: " Stefan Hanreich
2026-05-07 12:40 ` [PATCH pve-manager v4 27/31] ui: fabrics: wireguard: add interface edit panel Stefan Hanreich
2026-05-07 12:40 ` [PATCH pve-manager v4 28/31] ui: fabrics: wireguard: add node " Stefan Hanreich
2026-05-07 12:40 ` [PATCH pve-manager v4 29/31] ui: fabrics: wireguard: add fabric " Stefan Hanreich
2026-05-07 12:40 ` [PATCH pve-manager v4 30/31] ui: fabrics: hook up wireguard components Stefan Hanreich
2026-05-07 12:40 ` [PATCH pve-manager v4 31/31] fabrics: node edit: add option to include wireguard interfaces Stefan Hanreich
2026-05-07 14:08 ` partially-applied: [PATCH cluster/manager/network/proxmox{,-ve-rs,-perl-rs} v4 00/31] Add WireGuard as protocol to SDN fabrics Thomas Lamprecht
2026-05-11 13:40 ` Arthur Bied-Charreton
2026-05-11 17:01   ` Stefan Hanreich
2026-05-12 17:38 ` Stefan Hanreich [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5db8f6f7-fc06-4476-9712-49a14e0aaf19@proxmox.com \
    --to=s.hanreich@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal