Skip to main content

WireGuard VPN networking for unprivileged network namespaces

Project description

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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wireguard4netns-0.1.6.tar.gz (117.9 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

wireguard4netns-0.1.6-cp311-cp311-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

wireguard4netns-0.1.6-cp310-cp310-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

wireguard4netns-0.1.6-cp39-cp39-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

wireguard4netns-0.1.6-cp38-cp38-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

wireguard4netns-0.1.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

File details

Details for the file wireguard4netns-0.1.6.tar.gz.

File metadata

  • Download URL: wireguard4netns-0.1.6.tar.gz
  • Upload date:
  • Size: 117.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.10.14 Linux/6.1.0-21-amd64

File hashes

Hashes for wireguard4netns-0.1.6.tar.gz
Algorithm Hash digest
SHA256 7f977eae0bc78d94f7b8454bba88601e4e0e40ffcdb85d2900e77be60343ce4a
MD5 442bfb205eb517e9e8a8fa3a1e7d8410
BLAKE2b-256 d12563b70f5b31385aa89158c7791d8fd5e260311479b09d54cdf50646675664

See more details on using hashes here.

File details

Details for the file wireguard4netns-0.1.6-cp311-cp311-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for wireguard4netns-0.1.6-cp311-cp311-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 92722c3704714e6e72b61ae625eadadda6125d35bd750072a0628a42c58326d2
MD5 2e08a9141027f1c577a62a61df1b307d
BLAKE2b-256 4e0e71e50d5e374751e1fd255b5a0709b3ed97150c3779d93f0217f3a9f3cb6b

See more details on using hashes here.

File details

Details for the file wireguard4netns-0.1.6-cp310-cp310-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for wireguard4netns-0.1.6-cp310-cp310-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6a594d1321ed83ce435fe365bf626beec6833070dc9bf2d61b0a7dd58f82de4c
MD5 c0b61afcca22ebf3fc761547e43939fc
BLAKE2b-256 87136d6826e58b6aaa15b58da4c808999b02716b8a34e216d443b69b71819670

See more details on using hashes here.

File details

Details for the file wireguard4netns-0.1.6-cp39-cp39-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for wireguard4netns-0.1.6-cp39-cp39-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b5fc83792f59b5021f9f1935d51318df51a333ada18194d0e8a57995b5734f8f
MD5 c83b326b3f643d40e63eaac998d3f6fb
BLAKE2b-256 f3203ea7ade8041064be7e4040a4759c148770037e56e5728218cede8faa25c2

See more details on using hashes here.

File details

Details for the file wireguard4netns-0.1.6-cp38-cp38-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for wireguard4netns-0.1.6-cp38-cp38-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f07182a7537405dc39e0452b45dd4445073aba3d42441355a35334e6d8160703
MD5 77c378320686e993728bac8af489b4e2
BLAKE2b-256 9f59488ebeef29592909dc25179dfc187cf697e8f398a77b46c3d4b974d2a435

See more details on using hashes here.

File details

Details for the file wireguard4netns-0.1.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for wireguard4netns-0.1.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 aeffe525a1bce7a9e536530a33718051d315d07e98fed3337a32d7c5c809deb6
MD5 8eca4f76d41f2742f30eab52f5c7a32a
BLAKE2b-256 d0122450563d25c6411b466f6186a3186f6126f087fa708f172c00b60c16acff

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page