gh-aw-firewall
Skill4 starsChanged 6 months agoMITView on GitHub
Use the AWF (Agentic Workflow Firewall) to run commands with network isolation and domain whitelisting. Provides L7 HTTP/HTTPS egress control for AI agents.
- Reads credentials
- Installs packages
In this repository124 other files it gives its agents.
- AGENTS.mdAGENTS.md
- .github/AGENTS.mdAGENTS.md
- .github/workflows/AGENTS.mdAGENTS.md
- .vscode/AGENTS.mdAGENTS.md
- .github/copilot-instructions.mdCopilot instructions
- agent-log-analysisSkill
- agent-mdSkill
- agent-md-writerSkill
- agent-skill-md-writerSkill
- agentskillsSkill
- agents-md-writerSkill
- ai-prompt-writerSkill
- ansibleSkill
- apache-airflow-apiSkill
- apache-airflow-dagsSkill
- astro-cliSkill
- astronomer-docsSkill
- awesome-copilotSkill
- brainstorm-agent-runsSkill
- brainstorm-github-prSkill
- brainstormSkill
- catSkill
- chrome-devtoolsSkill
- claude-docsSkill
- codeqlSkill
- code-reviewSkill
- code-tourSkill
- coding-standard-writerSkill
- context-aware-opsSkill
- copilot-cliSkill
- copilot-docsSkill
- critical-thinkingSkill
- datadog-agentSkill
- datadog-apiSkill
- datadog-mcpSkill
- datadog-monitorsSkill
- datadog-pulumiSkill
- devcontainerSkill
- dictationSkill
- direnvSkill
- dockerfileSkill
- dockerSkill
- docs-reviewSkill
- docs-writerSkill
- dot-claudeSkill
- dotfilesSkill
- dot-githubSkill
- editorconfigSkill
- fact-writerSkill
- gdpr-compliantSkill
- gh-agent-taskSkill
- gh-apiSkill
- gh-aw-compileSkill
- gh-aw-firewall-debugSkill
- gh-aw-newSkill
- gh-awSkill
- gh-aw-troubleshootingSkill
- gh-codespaceSkill
- gh-issueSkill
- gh-modelsSkill
- The first 60 shown.
The file
We split this skill into the rules it gives an agent
12 rules. About 0 are common, 6 are distinctive, and 6 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈6
Distinctive · estimate
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 12
Use this skill when you need to run commands with network isolation, restrict network access to approved domains, or execute AI agents in a …
- Distinctive: line 33
When running standard unit tests that do not require any external network requests.
- Distinctive: line 35
If the task only requires compiling YAML frontmatter (AWF is for runtime execution, not compilation).
- Distinctive: line 324
When analyzing logs, these codes indicate the traffic decision:
- Very specific: line 370
Check if subdomain is needed: api.example.com vs example.com
- Very specific: line 372
Check Squid logs: awf logs --format json
- Distinctive: line 383
No IPv6: Only IPv4 traffic is supported
- Very specific: line 385
No internationalized domains: Use punycode (e.g., xn--bcher-kva.ch)
- Distinctive: line 391
Start with minimal domains: Only add what's needed
- Very specific: line 393
Enable debug logging: When troubleshooting add --log-level debug
- Very specific: line 394
Review logs: Check what was blocked with awf logs stats
- Very specific: line 396
Quote shell commands: Use 'command $VAR' to preserve container expansion
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
AWF (Agentic Workflow Firewall) Usage Skill
<!-- markdownlint-disable MD013 MD023 MD031 MD032 -->Use this skill when you need to run commands with network isolation, restrict network access to approved domains, or execute AI agents in a sandboxed environment with controlled network access.
What is AWF?
AWF is a network firewall for agentic workflows that provides:
- L7 Domain Whitelisting: Control HTTP/HTTPS traffic at the application layer
- Host-Level Enforcement: Uses iptables DOCKER-USER chain to enforce firewall on ALL containers
- Chroot Mode: Optional transparent access to host binaries (Python, Node.js, Go) while maintaining network isolation
When to Use AWF
Use AWF when:
- Running AI agents (Copilot CLI, Claude, etc.) that need network access but should be restricted
- Testing code that makes network requests in a controlled environment
- Enforcing network security policies for automated workflows
- Running untrusted commands with limited network access
- Testing Playwright or other tools against localhost services
When Not to Use
- When running standard unit tests that do not require any external network requests.
- For workflows that are already running in a fully air-gapped, self-hosted runner environment where AWF is redundant.
- If the task only requires compiling YAML frontmatter (AWF is for runtime execution, not compilation).
Common Pitfalls
- Subdomain Blocking: Allowing
example.combut forgetting that API calls actually go toapi.example.com, causing unexpectedTCP_DENIEDerrors in the Squid log. - Hanging Interactive Shells: Running
sudo awfwith an interactive tool (like the Copilot CLI) without providing the--promptargument, causing the firewall container to hang forever. - Missing Cleanup: Failing to provide
--keep-containersduring debugging, or conversely, leaving debug containers running indefinitely and eating up host memory.
Quick Start
Basic Command
# Run a command with only github.com allowed
sudo awf --allow-domains github.com -- curl https://api.github.comThe -- separator divides firewall options from the command to run.
Test Domain Blocking
# This should FAIL (example.com not allowed)
sudo awf --allow-domains github.com -- curl -f --max-time 10 https://example.comEnable Debug Logging
sudo awf --allow-domains github.com --log-level debug -- curl https://api.github.comInstallation
Install Script (Recommended)
curl -sSL https://raw.githubusercontent.com/github/gh-aw-firewall/main/install.sh | sudo bash
sudo awf --versionBuild from Source
git clone https://github.com/github/gh-aw-firewall.git awf
cd awf
npm install
npm run build
npm linkCLI Options Reference
sudo awf [options] -- <command>
Domain Options:
--allow-domains <domains> Comma-separated allowed domains
--allow-domains-file <path> File with allowed domains (one per line)
--block-domains <domains> Comma-separated blocked domains (takes precedence)
--block-domains-file <path> File with blocked domains
Network Options:
--dns-servers <servers> DNS servers (default: 8.8.8.8,8.8.4.4)
--enable-host-access Enable access to host via host.docker.internal
--allow-host-ports <ports> Ports to allow with host access (e.g., 3000,8080)
Container Options:
--tty Allocate TTY for interactive tools
--env KEY=VALUE Pass environment variable (repeatable)
--env-all Pass all host environment variables
--mount <host:container[:mode]> Volume mount (repeatable)
--container-workdir <dir> Working directory inside container
--agent-image <value> Agent image preset (default, act) or custom
Advanced Options:
--ssl-bump Enable HTTPS content inspection
--allow-urls <urls> URL patterns for SSL Bump (requires --ssl-bump)
Debugging Options:
--log-level <level> Log level: debug, info, warn, error
--keep-containers Keep containers after command exits
--proxy-logs-dir <path> Directory to save Squid logs toDomain Whitelisting Patterns
Subdomain Matching (Automatic)
# github.com also allows api.github.com, raw.github.com, etc.
sudo awf --allow-domains github.com -- curl https://api.github.comWildcard Patterns
# Match any subdomain
--allow-domains '*.github.com'
# Match prefix patterns
--allow-domains 'api-*.example.com'
# Combine multiple patterns
--allow-domains 'github.com,*.googleapis.com,api-*.example.com'Protocol-Specific
# HTTPS only
--allow-domains 'https://secure.example.com'
# HTTP only
--allow-domains 'http://legacy.example.com'Domain Blocklist
# Allow domain but block specific subdomain
sudo awf \
--allow-domains example.com \
--block-domains internal.example.com \
-- curl https://api.example.com # WorksCommon Workflows
1. Run GitHub Copilot CLI
sudo awf \
--allow-domains github.com,api.github.com,githubusercontent.com,anthropic.com \
-- copilot --prompt "List my repositories"2. Run with MCP Servers
sudo awf \
--allow-domains github.com,arxiv.org,mcp.tavily.com \
--log-level debug \
-- copilot --mcp arxiv,tavily --prompt "Search arxiv for recent AI papers"3. Playwright Testing with Localhost
# The localhost keyword auto-configures host access and dev ports
sudo awf \
--allow-domains localhost,playwright.dev \
-- npx playwright test4. Pass Environment Variables
# Pass specific variables
sudo awf --allow-domains github.com \
--env GITHUB_TOKEN="$GITHUB_TOKEN" \
--env NODE_ENV=production \
-- npm test
# Pass all host environment variables
sudo awf --allow-domains github.com --env-all -- npm test5. Mount Custom Volumes
sudo awf --allow-domains github.com \
--mount /path/to/data:/data:ro \
-- cat /data/config.json6. Use Host Binaries (Chroot Mode is Always On)
# Access host Python, Node, Go, etc. (chroot mode is the default)
sudo awf --allow-domains api.github.com \
-- python3 -c "import requests; print(requests.get('https://api.github.com').status_code)"7. SSL Bump for URL Path Filtering
sudo awf \
--allow-domains github.com \
--ssl-bump \
--allow-urls "https://github.com/myorg/*" \
-- curl https://github.com/myorg/some-repo8. GitHub Actions Integration
- name: Setup awf
uses: github/gh-aw-firewall@main
- name: Run with firewall
run: |
sudo -E awf --allow-domains github.com -- 'cd $GITHUB_WORKSPACE && npm test'Log Analysis Commands
View Logs
# Pretty format (default)
awf logs
# Follow in real-time
awf logs -f
# JSON format for scripting
awf logs --format json
# List available log sources
awf logs --listGet Statistics
# Terminal output
awf logs stats
# JSON for scripting
awf logs stats --format json
# Markdown for GitHub Actions
awf logs summary >> $GITHUB_STEP_SUMMARYFind Blocked Requests
# Using awf logs
awf logs --format json | jq 'select(.isAllowed == false)'
# Direct Squid log query
sudo grep "TCP_DENIED" /tmp/squid-logs-*/access.logDebugging Tips
Keep Containers for Inspection
sudo awf --allow-domains github.com --keep-containers -- failing-command
# Inspect containers
docker logs awf-squid
docker logs awf-agent
# View Squid config
docker exec awf-squid cat /etc/squid/squid.conf
# Manual cleanup when done
docker rm -f awf-squid awf-agentCheck Which Domains Were Blocked
# After command completes
sudo cat /tmp/squid-logs-*/access.log | grep TCP_DENIED
# Or use the logs command
awf logs --format json | jq 'select(.isAllowed == false) | .domain'Debug Container Network
# Check iptables rules
docker exec awf-agent iptables -t nat -L OUTPUT -n -v
# Check DNS
docker exec awf-agent cat /etc/resolv.conf
# Test connectivity to Squid
docker exec awf-agent nc -zv 172.30.0.10 3128Squid Decision Codes
When analyzing logs, these codes indicate the traffic decision:
| Code | Meaning |
TCP_TUNNEL:HIER_DIRECT | ALLOWED (HTTPS tunnel) |
TCP_MISS:HIER_DIRECT | ALLOWED (HTTP request) |
TCP_DENIED:HIER_NONE | BLOCKED (domain not in allowlist) |
Agent Image Options
Presets (Pre-built, Fast)
# Default - minimal ubuntu:22.04 (~200MB)
sudo awf --agent-image default --allow-domains github.com -- command
# Act - GitHub Actions parity (~2GB)
sudo awf --agent-image act --allow-domains github.com -- commandCustom Base Images (Requires --build-local)
sudo awf \
--build-local \
--agent-image ghcr.io/catthehacker/ubuntu:runner-22.04 \
--allow-domains github.com \
-- commandCommon Issues and Fixes
"Cannot connect to Docker daemon"
sudo systemctl start docker"Port 3128 already in use"
docker stop $(docker ps -q --filter "expose=3128")Domain Not Working
- Check if subdomain is needed:
api.example.comvsexample.com - Enable debug logging:
--log-level debug - Check Squid logs:
awf logs --format json
Command Fails with Exit Code 28 (Timeout)
The domain is being blocked. Check:
- Is domain in
--allow-domains? - Is subdomain required?
- View blocked domains:
awf logs --format json | jq 'select(.isAllowed == false)'
Limitations
- No IPv6: Only IPv4 traffic is supported
- No HTTP/3: Container curl doesn't support HTTP/3
- No internationalized domains: Use punycode (e.g.,
xn--bcher-kva.ch) - HTTP to HTTPS redirects: May fail; use HTTPS directly
- IP-based access: Direct IP access is blocked (no domain)
Best Practices
- Start with minimal domains: Only add what's needed
- Use wildcards carefully:
*.example.comis safer than* - Enable debug logging: When troubleshooting add
--log-level debug - Review logs: Check what was blocked with
awf logs stats - Use blocklists: For fine-grained control when allowing broad domains
- Quote shell commands: Use
'command $VAR'to preserve container expansion
References
Related Skills
gh-aw-troubleshooting- Load this skill when debugging Agentic Workflows
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

