Skip to content

chore(sandbox): add iptables to base image for bypass diagnostics#36

Merged
johntmyers merged 1 commit intomainfrom
chore/268-add-iptables-to-base-image/jomyers
Mar 15, 2026
Merged

chore(sandbox): add iptables to base image for bypass diagnostics#36
johntmyers merged 1 commit intomainfrom
chore/268-add-iptables-to-base-image/jomyers

Conversation

@johntmyers
Copy link
Copy Markdown
Collaborator

Summary

Add iptables package to the base sandbox image. The OpenShell sandbox supervisor will use this to install LOG + REJECT rules in the network namespace for proxy bypass detection.

Related Issue

Ref: NVIDIA/OpenShell#268

Changes

  • sandboxes/base/Dockerfile: Add iptables to the core system dependencies apt-get install line

Context

When a sandbox process attempts a direct outbound connection that bypasses the HTTP CONNECT proxy (e.g., Node.js fetch() without NODE_USE_ENV_PROXY=1), the connection currently hangs silently for 30+ seconds. With iptables available, the supervisor can:

  1. REJECT bypass attempts immediately (ECONNREFUSED instead of timeout)
  2. LOG diagnostic events with destination, protocol, and process identity

The supervisor already has CAP_NET_ADMIN and runs as root — this is purely a package availability change. If iptables is not present, the feature degrades gracefully (warning logged, namespace still isolates via routing).

Same pattern as iproute2 which is already a required dependency.

Checklist

  • Follows Conventional Commits
  • No capability or security context changes required
  • Existing sandbox behavior unchanged — iptables rules are only installed by the supervisor (not yet shipped)

The sandbox supervisor will use iptables to install LOG + REJECT rules
in the network namespace, providing immediate ECONNREFUSED (instead of
30s timeout) and structured diagnostic events when processes attempt
direct connections that bypass the HTTP CONNECT proxy.

Ref: NVIDIA/OpenShell#268
@johntmyers johntmyers requested a review from drew March 15, 2026 19:00
@johntmyers johntmyers merged commit 6daeacd into main Mar 15, 2026
5 checks passed
@johntmyers johntmyers deleted the chore/268-add-iptables-to-base-image/jomyers branch March 15, 2026 19:16
factory-octavian pushed a commit to factory-octavian/OpenShell-Community that referenced this pull request Apr 1, 2026
Closes NVIDIA#20, NVIDIA#36, NVIDIA#46

## Summary
- Replace the external `rsync` dependency with built-in tar-over-SSH for file synchronization, using the `tar` crate to stream archives through the existing SSH proxy tunnel
- Add a new `nav sandbox sync` subcommand supporting bidirectional file transfer (`--up` to push local files, `--down` to pull sandbox files)
- Add sync workflow example in `examples/sync-files.md`

## Changes

| File | Change |
|---|---|
| `crates/navigator-cli/Cargo.toml` | Add `tar = "0.4"` dependency |
| `crates/navigator-cli/src/ssh.rs` | Remove `sandbox_rsync()`, add `sandbox_sync_up()`, `sandbox_sync_down()`, `sandbox_sync_up_files()` |
| `crates/navigator-cli/src/run.rs` | Add `sandbox_sync_command()` dispatcher, update re-exports, update `--sync` call site |
| `crates/navigator-cli/src/main.rs` | Add `Sync` variant to `SandboxCommands` with `--up`/`--down` flags |
| `architecture/sandbox-connect.md` | Rewrite File Sync section for tar-over-SSH and new command |
| `examples/sync-files.md` | New example walkthrough for sync workflows |

## New UX

```bash
# Push local files up to sandbox
nav sandbox sync my-sandbox --up ./src /sandbox/src

# Pull sandbox files down to local
nav sandbox sync my-sandbox --down /sandbox/output ./output

# Existing --sync flag on create still works (now uses tar internally)
nav sandbox create --sync -- python main.py
```

## Design

- **No new host dependencies**: `tar` crate handles archive creation/extraction in Rust; `ssh` is already required. The sandbox side uses the `tar` binary from the base image.
- **No new server-side infrastructure**: reuses the existing SSH tunnel, no new gRPC RPCs or gateway changes.
- **Bidirectional**: the same tar-pipe pattern works for both push and pull by reversing which side produces and which consumes the archive.
- **No compression** for v1 — the SSH tunnel is local-network; can add gzip via `flate2` later.

## Test Plan
- All existing tests pass (`mise run pre-commit` green: fmt, clippy, 206 Rust tests, 6 Python tests)
- Manual e2e testing required for actual sandbox sync operations
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants