| ScreenShot | ScreenShot |
|---|---|
![]() |
![]() |
Assign network interfaces (for example two USB modems from two phones) to specific applications on Linux, with full traffic isolation, using Rust and egui.
Each profile maps one network interface to a list of applications. When you run an application from a profile, it is launched inside a dedicated Linux network namespace that owns that interface, so its traffic cannot leak through any other interface, and other applications cannot use the bound interface.
Works with regular desktop apps, Flatpak, Snap, AppImage and CLI tools
(wget, curl, ...). Multiple applications in the same profile share one
namespace and therefore one interface.
For each profile a persistent namespace splinter_<name> is created:
- The selected interface is moved into the namespace:
ip link set <iface> netns splinter_<name> - Loopback and the interface are brought up,
dhclientobtains an address. - The default gateway is detected and written to
/etc/netns/splinter_<name>/resolv.conffor DNS. - Applications are launched inside the namespace and dropped back to your
normal user with
runuser, so they do not run as root.
Every privileged step (namespace creation, moving the interface, DHCP, DNS and
entering the namespace to launch an app) runs through pkexec, which shows
a graphical password prompt. No manual configuration is required: there is
no sudoers editing, no setuid binary and no host setup. When an action needs
root, the app simply asks for your password through the standard PolicyKit
dialog.
iproute2(ip)dhclientpkexec(PolicyKit) — ships by default on all major desktop distros- A Rust toolchain (
cargo) to build
cargo build --release
./target/release/splinter-net- Profiles tab: create a profile (name + interface) and add applications to it. Creating a profile asks for your password once (via pkexec) to set up the namespace.
- Applications tab: all installed apps (desktop, Flatpak, Snap) are discovered automatically. Search by name, pick a profile next to an app and press Launch.
- Script tab: run any command or shell script inside a chosen profile.
- Settings tab: set a custom accent color (hex) to recolor the whole app.
Profiles are stored in ~/.config/netbinder/profiles.toml:
[[profiles]]
name = "YouTube"
interface = "usb1"
apps = ["/usr/bin/firefox", "/usr/bin/mpv"]- Moving an interface into a namespace disconnects it from the default namespace. This is the intended isolation.
- Audio:
PULSE_SERVERis forwarded (PipeWire is usually compatible). - Wayland:
WAYLAND_DISPLAYandXDG_RUNTIME_DIRare forwarded. - If the app crashes, namespaces persist; delete the profile to clean up.
- Flatpak/Snap: use the executable path;
flatpak run/snap runspawn their children in the same namespace.

