Skip to main content

WireGuard VPN networking for unprivileged network namespaces

wireguard4netns is directly inspired by the awesome work of the authors of slirp4netns. Instead of providing generic user-mode networking for unprivileged network namespaces through libslirp, wireguard4netns brings network access to the containers through wireguard-go, a userspace WireGuard VPN tunnel implementation.

Motivation

We were building a framework for developing Edge-Native applications (the Sinfonia project) and for this we split applications into two primary components, a frontend that runs on the user's device and a backend consisting of one or more services are deployed on a nearby Kubernetes cluster (cloudlet). We leverage WireGuard tunnels between the two to avoid having to expose deployed services to the world, the frontend's network environment is as if it was part of the same deployment inside the same Kubernetes cluster and namespace as the backend. This hides most of the unnecessary network details from the application's frontend and provides other advantages such as privacy and network mobility.

The main disadvantage was that root privileges are needed to create, configure and attach the in-kernel WireGuard interface to a network namespace. This required either sudo access by the user, or an administrator installed setuid root binary helper. However slirp4netns showed the path to an alternative approach, create a tuntap interface inside the unprivileged network namespace and pass the control socket back to the default namespace where (in our case) a userspace WireGuard implementation is started. All frontend traffic is then sent through the tunnel to a VPN endpoint on the nearby cloudlet which passes it along to the deployed namespace of the application's backend.

Building from source

The only executable that is needed is patch. The build will try to download a copy of golang and use that to build a custom wireguard-go binary.

Make sure you have an initialized and updated wireguard-go git-submodule.

    git clone ... wireguard4netns
    cd wireguard4netns/
    git submodule update --init
    poetry build

The wireguard-go binary is then placed at src/wireguard4netns/wireguard-go. As long as that binary is present in that location, the build will avoid rebuilding the wireguard-go code.

We use a custom built version of wireguard-go because starting with an existing tunnel socket fd is really just an artifact of how the unmodified wireguard-go process sets up the tuntap device and uapi socket in the foreground and then daemonizes itself, passing along the already open file descriptors. With our approach the tuntap device ends up being created in a different network namespace and wireguard-go was unable to query or set the MTU.

Our modifications simply change the code to not fail when MTU operations are not working and is in wireguard-go.patch.

We also needed to make sure the UAPI socket is placed in a user-writable location instead of /var/run/wireguard. This socketDirectory path is customized through a custom linker flag that we set in build.py at the time we build the binary.

Licenses

wireguard4netns is MIT licensed

Copyright (c) 2022-2023 Carnegie Mellon University
SPDX-License-Identifier: MIT

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

wireguard-go is MIT licensed

Copyright (C) 2017-2022 WireGuard LLC. All Rights Reserved.
License: MIT

see wireguard-go/LICENSE and wireguard-go/README.md

"WireGuard" is a registered trademark of Jason A. Donenfeld.

Metadata

Release files for wireguard4netns 0.1.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for wireguard4netns 0.1.6
File Size Uploaded Provenance
wireguard4netns-0.1.6.tar.gz 117.9 kB Without provenance Details

Built distributions (wheels)

Table of built distributions (wheels) for wireguard4netns 0.1.6
File
wireguard4netns-0.1.6-cp311-cp311-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.5+ x86-64, Linux glibc 2.17+ x86-64 Details
wireguard4netns-0.1.6-cp310-cp310-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.5+ x86-64, Linux glibc 2.17+ x86-64 Details
wireguard4netns-0.1.6-cp39-cp39-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.5+ x86-64, Linux glibc 2.17+ x86-64 Details
wireguard4netns-0.1.6-cp38-cp38-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl CPython 3.8 CPython 3.8 Linux glibc 2.17+ x86-64, Linux glibc 2.5+ x86-64 Details
wireguard4netns-0.1.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.17+ x86-64, Linux glibc 2.5+ x86-64 Details

Total release size: 5.6 MB

Release files / wireguard4netns-0.1.6.tar.gz

Download URL wireguard4netns-0.1.6.tar.gz
Size 117.9 kB
Tags Source
SHA-256 checksum
How to use checksums
7f977eae0bc78d94f7b8454bba88601e4e0e40ffcdb85d2900e77be60343ce4a
BLAKE2b-256 checksum
How to use checksums
d12563b70f5b31385aa89158c7791d8fd5e260311479b09d54cdf50646675664
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.8.3 CPython/3.10.14 Linux/6.1.0-21-amd64

Release files / wireguard4netns-0.1.6-cp311-cp311-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl

Download URL wireguard4netns-0.1.6-cp311-cp311-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl
Size 1.1 MB
Tags CPython 3.11 Linux glibc 2.17+ x86-64 Linux glibc 2.5+ x86-64
SHA-256 checksum
How to use checksums
92722c3704714e6e72b61ae625eadadda6125d35bd750072a0628a42c58326d2
BLAKE2b-256 checksum
How to use checksums
4e0e71e50d5e374751e1fd255b5a0709b3ed97150c3779d93f0217f3a9f3cb6b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.8.3 CPython/3.10.14 Linux/6.1.0-21-amd64

Release files / wireguard4netns-0.1.6-cp310-cp310-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl

Download URL wireguard4netns-0.1.6-cp310-cp310-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl
Size 1.1 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 Linux glibc 2.5+ x86-64
SHA-256 checksum
How to use checksums
6a594d1321ed83ce435fe365bf626beec6833070dc9bf2d61b0a7dd58f82de4c
BLAKE2b-256 checksum
How to use checksums
87136d6826e58b6aaa15b58da4c808999b02716b8a34e216d443b69b71819670
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.8.3 CPython/3.10.14 Linux/6.1.0-21-amd64

Release files / wireguard4netns-0.1.6-cp39-cp39-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl

Download URL wireguard4netns-0.1.6-cp39-cp39-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl
Size 1.1 MB
Tags CPython 3.9 Linux glibc 2.17+ x86-64 Linux glibc 2.5+ x86-64
SHA-256 checksum
How to use checksums
b5fc83792f59b5021f9f1935d51318df51a333ada18194d0e8a57995b5734f8f
BLAKE2b-256 checksum
How to use checksums
f3203ea7ade8041064be7e4040a4759c148770037e56e5728218cede8faa25c2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.8.3 CPython/3.10.14 Linux/6.1.0-21-amd64

Release files / wireguard4netns-0.1.6-cp38-cp38-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl

Download URL wireguard4netns-0.1.6-cp38-cp38-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl
Size 1.1 MB
Tags CPython 3.8 Linux glibc 2.17+ x86-64 Linux glibc 2.5+ x86-64
SHA-256 checksum
How to use checksums
f07182a7537405dc39e0452b45dd4445073aba3d42441355a35334e6d8160703
BLAKE2b-256 checksum
How to use checksums
9f59488ebeef29592909dc25179dfc187cf697e8f398a77b46c3d4b974d2a435
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.8.3 CPython/3.10.14 Linux/6.1.0-21-amd64

Release files / wireguard4netns-0.1.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl

Download URL wireguard4netns-0.1.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl
Size 1.1 MB
Tags CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.17+ x86-64 Linux glibc 2.5+ x86-64
SHA-256 checksum
How to use checksums
aeffe525a1bce7a9e536530a33718051d315d07e98fed3337a32d7c5c809deb6
BLAKE2b-256 checksum
How to use checksums
d0122450563d25c6411b466f6186a3186f6126f087fa708f172c00b60c16acff
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.8.3 CPython/3.10.14 Linux/6.1.0-21-amd64

Security for wireguard4netns 0.1.6

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page