A declarative manager for Linux network namespaces.
  • Rust 93.3%
  • Nix 6.7%
Find a file
2025-11-01 17:21:33 +01:00
.forgejo/workflows basic netns management 2025-10-30 18:16:28 +01:00
nix fix nix package 2025-11-01 16:54:11 +01:00
src up and down commands 2025-11-01 16:50:25 +01:00
.envrc basic netns management 2025-10-30 18:16:28 +01:00
.gitignore basic netns management 2025-10-30 18:16:28 +01:00
Cargo.lock track which namespaces we control 2025-11-01 16:42:34 +01:00
Cargo.toml track which namespaces we control 2025-11-01 16:42:34 +01:00
config.sample.toml document config 2025-11-01 17:21:33 +01:00
flake.lock don't remove namespaces on daemon exit 2025-11-01 15:58:33 +01:00
flake.nix up and down commands 2025-11-01 16:50:25 +01:00
README.md document config 2025-11-01 17:21:33 +01:00

netnsd

A declarative manager for Linux network namespaces.

Features

  • Fully declarative configuration
  • Hot reloading of configuration
  • Port forwarding into the namespace

Usage

Daemon

netnsd daemon [--config <config.toml>]

Start the netnsd daemon, applying the configured namespace configuration and running any proxies.

You can tell the daemon to reload the configuration with pkill -sighup netnsd.

Note that, to minimize interruption of anything using the namespaces, stopping the daemon will not remove the created namespaces.

Up

netnsd up [--config <config.toml>]

Applying the configured namespace and exit.

Down

netnsd down

Remove all namespaces created by netnsd and exit.

Configuration

By default netnsd will look for it's configuration in /etc/netnsd/netnsd. You can specify a different configuration path with the --config option.

# You can define any number of namespaces to create
[[namespace]]
# name of the namespace to create
name = "test"

# You can define any number of port forwards to setup into the namespace
[[namespace.forward]]
# port, address or socket outside the namespace to listen on
# when only a port is specified it will listen on 0.0.0.0
source = 8091
# port or address inside the namespace to forward to
# when only a port is specified it will forward to 127.0.0.1
target = 80

[[namespace.forward]]
# listening on a unix socket instead of a tcp port
source = "/run/test/https"
# forward to a specific address instead of 127.0.0.1
target = "127.0.0.2:443"

# Another namespace
[[namespace]]
name = "test2"

[[namespace.forward]]
# listening on a specific address instead of 0.0.0.0
source = "127.0.0.1:9091"
target = 80