Current section

Files

Jump to
tundra c_src server README.md
Raw

c_src/server/README.md

# Tundra Server
Privileged server component for creating and managing TUN devices on Linux and Darwin.
## Overview
The Tundra server is a standalone C daemon that runs with elevated privileges and creates TUN devices on behalf of unprivileged clients. It communicates via a Unix domain socket and passes file descriptors using `SCM_RIGHTS`.
## Architecture
```
Client (Elixir/NIF) → [Unix Socket] → Server (C, privileged)
/var/run/tundra.sock
Client sends: Request (create/open TUN)
Server sends: Response + TUN device file descriptor
```
## Building
```bash
make
```
This produces `tundra_server` binary.
## Running
The server must run as root (or with `CAP_NET_ADMIN` on Linux):
```bash
sudo ./tundra_server
```
## Protocol
The server implements a simple request/response protocol:
### Request Types
- `REQUEST_TYPE_CREATE_TUN` - Create new TUN device with configuration
### Response
- Returns TUN device file descriptor via `SCM_RIGHTS`
- Returns device name and configuration details
## Platform Support
### Linux
- Opens `/dev/net/tun`
- Uses `ioctl(TUNSETIFF)` to create device
- Configures via netlink
### Darwin/macOS
- Uses utun kernel control API
- Connects to `com.apple.net.utun_control`
- Configures via `ifconfig` (system call)
## Security
- Socket permissions: 0770 (root:tundra)
- Only users in the `tundra` group can connect to the server
- Each request handled in forked child process
- Server validates all requests before processing
### Group Membership
The server restricts socket access to members of the `tundra` group. The installation packages create this group automatically.
To allow a user to connect to the server (required for unprivileged operation):
**Linux:**
```bash
sudo usermod -aG tundra $USER
```
**macOS:**
```bash
sudo dseditgroup -o edit -a $USER -t user tundra
```
After adding yourself to the group, log out and back in for the change to take effect.