13 KiB
This documentation is organized by AI with reference to actual code. AI can make mistakes — please verify against the source code when in doubt.
GNS3 Web Wireshark Container Management Guide
This document describes how to manage GNS3 Web Wireshark containers using the management script or Docker commands.
Installation
Before using Web Wireshark, you need to set up the Docker image:
pip install . && gns3server-web-wireshark-setup
This will:
- First try to pull the
gns3/web-wireshark:latestimage from Docker Hub - If pull fails, build the image locally using the Dockerfile
The setup command shows the output from docker pull or docker build directly, so you can see the progress.
Architecture Overview
┌─────────────────────────────────────────────────┐
│ Host Machine │
│ │
│ ┌────────────────────────────────────────────┐ │
│ │ Docker Network: gns3-wireshark │ │
│ │ (Bridge network for container-host │ │
│ │ communication) │ │
│ │ │ │
│ │ ┌──────────────────────────────────────┐ │ │
│ │ │ Container: gns3-PROJECT-ID │ │ │
│ │ │ │ │ │
│ │ │ Link 1: Display :10001, Port 10001 │ │ │
│ │ │ Link 2: Display :10002, Port 10002 │ │ │
│ │ │ Link 3: Display :10003, Port 10003 │ │ │
│ │ │ ... │ │ │
│ │ └──────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
Quick Start (Using Management Script)
Prerequisites
- Docker is running
- Virtual environment is activated:
source venv/bin/activate
Start Session
# Start session (using all defaults)
python3 gns3server/agent/web_wireshark/manage_wireshark.py \
--verbose start \
--project-id "5af0fe00-f39d-4985-8669-7e8c512d729c" \
--link-id "f233f27f-7432-49c3-9aa2-50e326a10eec" \
--jwt-token "YOUR_JWT_TOKEN"
# Use custom image
python3 gns3server/agent/web_wireshark/manage_wireshark.py \
--verbose start \
--project-id "5af0fe00-f39d-4985-8669-7e8c512d729c" \
--link-id "f233f27f-7432-49c3-9aa2-50e326a10eec" \
--jwt-token "YOUR_JWT_TOKEN" \
--image "gns3/web-wireshark:test"
Access Web Interface
After starting, access Wireshark at:
ws://<container-ip>:<port>
Stop Session
python3 gns3server/agent/web_wireshark/manage_wireshark.py \
stop \
--project-id "test-project" \
--link-id "link-1"
Delete Container
python3 gns3server/agent/web_wireshark/manage_wireshark.py \
delete-container \
--project-id "test-project"
Resource Parameter Configuration
Memory Configuration
# Default 2GB memory
--memory "2g"
# Custom memory
--memory "4g" # 4GB
--memory "512m" # 512MB
--memory "1g" \
--memory-swap "2g" # 1GB memory + 2GB swap
CPU Configuration
# Default 1 CPU core
--cpus 1.0
# Custom CPU
--cpus 0.5 # 50% CPU
--cpus 2.0 # 2 CPU cores
--cpus 4.0 # 4 CPU cores
Process Limit Configuration
# Default max 1000 processes
--pids-limit 1000
# Custom limit
--pids-limit 500 # Max 500 processes
--pids-limit 2000 # Max 2000 processes
Complete Example
python3 gns3server/agent/web_wireshark/manage_wireshark.py \
--verbose start \
--project-id "test-project" \
--link-id "link-1" \
--jwt-token "test-token" \
--image "gns3/web-wireshark:latest" \
--memory "4g" \
--memory-swap "6g" \
--cpus 2.0 \
--pids-limit 2000
Parameter Reference Table
| Parameter | Default Value | Description | Example |
|---|---|---|---|
| --image | gns3/web-wireshark:latest | Docker image | ubuntu:latest |
| --memory | 2g | Memory limit | 4g, 512m |
| --memory-swap | Same as memory | Memory swap limit | 4g, 8g |
| --cpus | 1.0 | CPU cores | 0.5, 2.0 |
| --pids-limit | 1000 | Process limit | 500, 2000 |
Docker Network Management
Create Network
docker network create \
--driver bridge \
--subnet=100.64.0.0/22 \
gns3-wireshark
Delete Network
docker network rm gns3-wireshark
Warning: Stop and disconnect all containers before deleting the network.
View Network Information
# List all Docker networks
docker network ls
# View network details
docker network inspect gns3-wireshark
# List containers connected to the network
docker network inspect gns3-wireshark -f '{{range .Containers}}{{.Name}} {{end}}'
Performance Metrics
Per Wireshark Instance Resource Usage
| Resource Type | Usage | Description |
|---|---|---|
| Memory | 150-250 MB | Depends on capture traffic and number of parsed protocols |
| CPU | 0.5-2% | Lower at idle, increases with high traffic |
| Threads | ~30 threads | Wireshark multi-threaded architecture |
| Disk I/O | Minimal | Mostly log writing |
Container Resource Configuration Recommendations
Based on --pids-limit 1000 and --memory="2g" configuration:
| Wireshark Instances | Estimated Threads | Estimated Memory | Recommended Use Case |
|---|---|---|---|
| 1-3 | 120-200 threads | 450-750 MB | Lightweight projects, small topologies |
| 4-6 | 230-290 threads | 600-1.5 GB | Medium projects, multiple network links |
| 7-10 | 320-410 threads | 1-2.5 GB | Large projects, dense capture |
| 10+ | >400 threads | >2.5 GB | Warning: Increase memory limit |
Actual Test Data
Test Environment: 3 Wireshark instances running simultaneously
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
19363d29bd9d gns3-PROJECT-ID 4.59% 735.6MiB / 2GiB 35.92% 386kB / 38.6MB 0B / 15.5MB 201
Detailed Process Statistics:
- Total threads: ~204
- Total processes: ~61
- Per Wireshark instance: ~30 threads + 1 parent process
Performance Optimization Recommendations
-
Memory is the main bottleneck, not PID limit
- Default 2GB memory can support 6-8 Wireshark instances
- When needing more instances, increase memory first rather than PID limit
-
Start Wireshark on demand
- Only start Wireshark for links that need packet capture
- Stop sessions promptly when done to release resources
-
Multi-container strategy
- For super large projects (10+ links), consider using multiple containers
- Each container handles 5-8 links for better resource isolation and stability
-
Monitor resource usage
# Real-time container resource monitoring docker stats gns3-PROJECT-ID # Check process count inside container docker exec gns3-PROJECT_ID bash -c "ps -eLf | wc -l"
Management Commands (Docker)
View All Active xpra Sessions
docker exec "${CONTAINER_NAME}" xpra list
View Container Logs
docker logs "${CONTAINER_NAME}"
View Processes Inside Container
docker exec "${CONTAINER_NAME}" ps aux | grep -E "Xvfb|xpra"
Enter Container Shell
docker exec -it "${CONTAINER_NAME}" /bin/bash
Stop Container
docker stop "${CONTAINER_NAME}"
Delete Container
docker rm "${CONTAINER_NAME}"
Troubleshooting
Check if Container is Running
docker ps | grep "${CONTAINER_NAME}"
Check Network Connection
# Ping container from host
docker exec "${CONTAINER_NAME}" ping -c 3 100.64.0.1
# Check port listening
docker exec "${CONTAINER_NAME}" netstat -tlnp | grep xpra
View xpra Logs
docker exec "${CONTAINER_NAME}" ls -la /tmp/sessions/
Restart Specific Session
LINK_ID=1
DISPLAY_ID=$LINK_ID
# Stop session
docker exec "${CONTAINER_NAME}" xpra stop ":${DISPLAY_ID}"
# Clean up session files
docker exec "${CONTAINER_NAME}" rm -rf "/tmp/sessions/link-${LINK_ID}"
# Restart (see previous start commands)
Thread Creation Error (QThread::start: Thread creation error)
Error Message:
QThread::start: Thread creation error (Resource temporarily unavailable)
Root Cause Analysis:
- Docker container PID limit (
--pids-limit) actually limits thread count - Each Wireshark instance requires approximately 30 threads
- Default limit of 200 may not be enough for multiple Wireshark instances
Solution:
# Check current thread usage
docker exec "${CONTAINER_NAME}" bash -c "ps -eLf | wc -l"
# Increase PID limit (recommended to set to 1000)
docker update --pids-limit 1000 "${CONTAINER_NAME}"
# Verify new limit
docker inspect "${CONTAINER_NAME}" --format '{{.HostConfig.PidsLimit}}'
Prevention:
- Set a reasonable PID limit when starting the container:
--pids-limit 1000 - Refer to "Performance Metrics" section for appropriate configuration
XDG_RUNTIME_DIR Warning
Warning Message:
Warning: XDG_RUNTIME_DIR is not defined
and '/run/user/1000' does not exist
using '/tmp'
Explanation:
- This is a warning, not an error; Xpra falls back to using
/tmp - May affect some features relying on XDG specification
Solution: Ensure you are using the latest Docker image, which includes the following fix:
- Create
/run/user/1000directory - Set
XDG_RUNTIME_DIRenvironment variable
For manual fix:
docker exec "${CONTAINER_NAME}" mkdir -p /run/user/1000
docker exec "${CONTAINER_NAME}" bash -c "export XDG_RUNTIME_DIR=/run/user/1000"
Manual Testing (Step-by-Step)
This section preserves the original manual testing steps used during development.
Prerequisites
- Docker is running
- Virtual environment is activated:
source venv/bin/activate
Basic Test Commands
# 1. Start session (using all defaults)
python3 gns3server/agent/web_wireshark/manage_wireshark.py \
--verbose start \
--project-id "5af0fe00-f39d-4985-8669-7e8c512d729c" \
--link-id "f233f27f-7432-49c3-9aa2-50e326a10eec" \
--jwt-token "YOUR_JWT_TOKEN"
# 2. Use custom image
python3 gns3server/agent/web_wireshark/manage_wireshark.py \
--verbose start \
--project-id "5af0fe00-f39d-4985-8669-7e8c512d729c" \
--link-id "f233f27f-7432-49c3-9aa2-50e326a10eec" \
--jwt-token "YOUR_JWT_TOKEN" \
--image "gns3/web-wireshark:test"
# 3. View containers
docker ps | grep gns3-wireshark
docker logs gns3-wireshark-test-project
# 4. Stop session
python3 gns3server/agent/web_wireshark/manage_wireshark.py \
stop \
--project-id "test-project" \
--link-id "link-1"
# 5. Delete container
python3 gns3server/agent/web_wireshark/manage_wireshark.py \
delete-container \
--project-id "test-project"
WebSocket Access URL
After starting a session, access Wireshark via WebSocket:
ws://192.168.1.140:3080/v3/projects/5af0fe00-f39d-4985-8669-7e8c512d729c/links/f233f27f-7432-49c3-9aa2-50e326a10eec/capture/web-wireshark?token=YOUR_JWT_TOKEN
Cleanup (If Tests Fail)
# Delete test containers
docker ps -a | grep 'gns3-wireshark-test' | awk '{print $1}' | xargs -r docker rm -f
# Delete test networks
docker network ls | grep 'gns3-wireshark' | awk '{print $2}' | xargs -r docker network rm
File Structure
gns3server/agent/web_wireshark/
├── setup_wireshark_image.py # Docker image setup tool (gns3-wireshark-setup)
├── manage_wireshark.py # CLI management tool
├── manager.py # Session management logic
├── docker_client.py # Docker API client
├── docker/
│ └── Dockerfile # Container image definition
└── WEB_WIRESHARK.md # This documentation
Known Issues
- JWT token is passed via command-line arguments (visible in
/proc/<pid>/cmdline). Consider using a temporary file inside the container for improved security. cmd_delete_containerandcmd_deletein manage_wireshark.py are duplicate code.stop-containeranddelete-containersubcommands are defined but not registered in the commands dictionary.link_id_to_displayandlink_id_to_portreturn the same value (10000-19999), which may cause confusion since xpra typically uses different display numbers and ports.- Container health check timeout (5 seconds) may be insufficient on slow systems.
- Docker Unix socket connection error handling could be improved (FileNotFoundError not properly caught).
Notes
- Default uses
gns3/web-wireshark:latestimage - Use
--verboseto see detailed logs - Containers use 100.64.0.0/22 network
- xpra port range: 10000-19999 (deterministic based on link_id)
- Health check:
xpra list - Log configuration: json-file, max-size=10m, max-file=3