Skip to main content

WireGuard interface for mitmproxy

Project description

mitmproxy_wireguard

PyPI PyPI - License PyPI - Status PyPI - Python Version PyPI - Wheel ci

Transparently proxy any device that can be configured as a WireGuard client!

DONE

  • multithreaded / asynchronous WireGuard server using tokio:
    • one worker thread for the user-space WireGuard server
    • one worker thread for the user-space network stack
    • one worker thread for communicating with the Python runtime
  • full support for IPv4 packets (TCP and UDP)
  • basic support for IPv6 packets (TCP and UDP)
  • partial support for IPv6 packets
  • Python interface similar to the Python asyncio module
  • integration tests in mitmproxy

TODO

  • more complete IPv6 support
  • various other small TODO and FIXME items

Architecture support

mitmproxy_wireguard should work on most architectures / targets - including, but not limited to Windows, macOS, and Linux, running on x86_64 (x64) and aarch64 (arm64) CPUs.

Binary wheels for the following targets are available from PyPI:

  • Windows / x64 (x86_64-windows-msvc)
  • macOS / Intel (x86_64-apple-darwin)
  • macos / Apple Silicon (aarch64-apple-darwin) via "Universal 2" binaries
  • Linux / x86_64 (x86_64-unknown-linux-gnu)
  • Linux / aarch64 (aarch64-unknown-linux-gnu), i.e. for Raspberry Pi 2+ and similar devices

Requirements

mitmproxy_wireguard currently requires Python 3.7 or newer at runtime, since that is the oldest version of Python that is still supported by PyO3 v0.16. mitmproxy already requires Python 3.9 or newer, so this should not be a problem.

Additionally, mitmproxy_wireguard currently has the following requirements at build-time:

  • Python 3.7+ (range of Python versions that is supported by PyO3 v0.16)
  • Rust 1.58.0+ (the oldest supported version of Rust / MSRV is 1.58.0)
  • maturin 0.13.x

Architecture

library architecture

Interface

The API interface of the PyO3 module is documented in mitmproxy_wireguard.pyi:

  • Server class: a running WireGuard server instance, with methods for
    • graceful shutdown (close / wait_closed)
    • sending UDP packets
  • TcpStream class: an established TCP connection (provides APIs identical to Python's) asyncio.StreamReader and asyncio.StreamWriter)
  • start_server coroutine: initialize, start, and return a Server instance

Hacking

Setting up the development environment is relatively straightforward, as only a Rust toolchain and Python 3 are required:

# set up a new venv
python3 -m venv venv

# enter venv (use the activation script for your shell)
source ./venv/bin/activate

# install maturin and pdoc
pip install maturin pdoc

Compiling the native Rust module then becomes easy:

# compile native Rust module and install it in venv
maturin develop

# compile native Rust module with optimizations
maturin develop --release

Once that's done (phew! Rust sure does take a while to compile!), the test echo server should work correctly. It will print instructions for connecting to it over a WireGuard VPN:

python3 ./echo_test_server.py

The included mitm-wg-test-client binary can be used to test this echo test server, which can be built by running cargo build inside the test-client directory, and launched from target/debug/mitm-wg-test-client.

Docs

Documentation for the Python module can be built with pdoc.

The documentation is built from the mitmproxy_wireguard.pyi type stubs and the rustdoc documentation strings themselves. So to generate the documentation, the native module needs to be rebuilt, as well:

maturin develop
pdoc mitmproxy_wireguard

By default, this will build the documentation in HTML format and serve it on http://localhost:8080.

Note: This requires version >=11.2.0 of pdoc. It is the first version that supports generating documentation for "native-only" Python modules (like our mitmproxy_wireguard PyO3 module).

Introspecting the tokio runtime

The asynchronous runtime can be introspected using tokio-console if the crate was built with the tracing feature:

tokio-console http://localhost:6669

There should be no task that is busy when the program is idle, i.e. there should be no busy waiting.

Note: This requires maturin>=0.12.15, as earlier versions accidentally clobbered the RUSTFLAGS that were passed to the Rust compiler, breaking use of the console_subscriber for tokio-console, which requires using the --cfg tokio_unstable flag.

Code style

The format for Rust code is enforced by rustfmt. To apply the formatting rules, use:

cargo fmt

The format for Python code (i.e. the test echo server and the type stubs in mitmproxy_wireguard.pyi) is enforced with black and can be applied with:

black echo_test_server.py mitmproxy_wireguard.pyi benches/*.py

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

mitmproxy_wireguard-0.1.11.tar.gz (24.6 kB view details)

Uploaded Source

Built Distributions

mitmproxy_wireguard-0.1.11-cp37-abi3-win_amd64.whl (674.0 kB view details)

Uploaded CPython 3.7+Windows x86-64

mitmproxy_wireguard-0.1.11-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

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

mitmproxy_wireguard-0.1.11-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ ARM64

mitmproxy_wireguard-0.1.11-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (1.6 MB view details)

Uploaded CPython 3.7+macOS 10.9+ universal2 (ARM64, x86-64)macOS 10.9+ x86-64macOS 11.0+ ARM64

mitmproxy_wireguard-0.1.11-cp37-abi3-macosx_10_7_x86_64.whl (842.6 kB view details)

Uploaded CPython 3.7+macOS 10.7+ x86-64

File details

Details for the file mitmproxy_wireguard-0.1.11.tar.gz.

File metadata

  • Download URL: mitmproxy_wireguard-0.1.11.tar.gz
  • Upload date:
  • Size: 24.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.4.2 requests/2.22.0 setuptools/45.2.0 requests-toolbelt/0.8.0 tqdm/4.30.0 CPython/3.8.10

File hashes

Hashes for mitmproxy_wireguard-0.1.11.tar.gz
Algorithm Hash digest
SHA256 2fb18f7c10c650260516185c237c74035f9c2cbf02205e2d5328f9b42687f7c0
MD5 1f458eaeedf967945f1d3474bcdd698e
BLAKE2b-256 189aacb1bf8a6073b1f96deecf1bccc9e7363370e24f344947161d33942d5229

See more details on using hashes here.

File details

Details for the file mitmproxy_wireguard-0.1.11-cp37-abi3-win_amd64.whl.

File metadata

  • Download URL: mitmproxy_wireguard-0.1.11-cp37-abi3-win_amd64.whl
  • Upload date:
  • Size: 674.0 kB
  • Tags: CPython 3.7+, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.4.2 requests/2.22.0 setuptools/45.2.0 requests-toolbelt/0.8.0 tqdm/4.30.0 CPython/3.8.10

File hashes

Hashes for mitmproxy_wireguard-0.1.11-cp37-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 31440419c44ccf65575f566e35a384d55f8c16fe4d802cef2c187900d3b40a68
MD5 f12606f55780b27fa13a8fe9a520a319
BLAKE2b-256 62616b10725ed25e8f2abd414d528e523fd1a7e04fcd7a61114bff02507ba442

See more details on using hashes here.

File details

Details for the file mitmproxy_wireguard-0.1.11-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mitmproxy_wireguard-0.1.11-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 aa7d4c99f48c4001b7daa1ee0f95622bcd991ab49ef6dfa767890e62894644eb
MD5 e8e5bcee8cfcbd02284a520e5c05bacb
BLAKE2b-256 29d70b34bfef2409cea9739192ce59b55657aa632e74c93a8d498f43c12f4716

See more details on using hashes here.

File details

Details for the file mitmproxy_wireguard-0.1.11-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for mitmproxy_wireguard-0.1.11-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a4c7b0ada8d5926236e96f1850409999dae0423ca44c69adeba995171822907c
MD5 d19549fc12af1c69142e1038e6bfbaa0
BLAKE2b-256 53c6f34b85b2585d57a7012c27e5fb4713a8d6f336117a0c28105d8f96b60d4e

See more details on using hashes here.

File details

Details for the file mitmproxy_wireguard-0.1.11-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for mitmproxy_wireguard-0.1.11-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 04c09f598cb40a74de58b8f2edfe12ac89d452610d872309a2c18ee916ca2906
MD5 79dda41bff9ac3fd108ed9e45a6150b3
BLAKE2b-256 fa7cccd21d1f760ca1580a7b91627f62582f9133ac391149da1dad898b221bb5

See more details on using hashes here.

File details

Details for the file mitmproxy_wireguard-0.1.11-cp37-abi3-macosx_10_7_x86_64.whl.

File metadata

  • Download URL: mitmproxy_wireguard-0.1.11-cp37-abi3-macosx_10_7_x86_64.whl
  • Upload date:
  • Size: 842.6 kB
  • Tags: CPython 3.7+, macOS 10.7+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.4.2 requests/2.22.0 setuptools/45.2.0 requests-toolbelt/0.8.0 tqdm/4.30.0 CPython/3.8.10

File hashes

Hashes for mitmproxy_wireguard-0.1.11-cp37-abi3-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 10b8a0299dfbd7d548e5079c5ebdd839b21571d9866d264251a80cb67d4f7c44
MD5 b4799d4844c3a9f3d4ce17a2db561650
BLAKE2b-256 83a062d7d4a1ae38ad88f2abbf43f4ffffb6f61f808563cbe56b93f28d8598f5

See more details on using hashes here.

Supported by

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