pepperonas/network-lockdown
GitHub: pepperonas/network-lockdown
跨平台内核级紧急网络隔离脚本,在安全事件发生时封锁所有流量,仅保留 Claude Code CLI 的 API 连接,实现 AI 辅助的应急响应与取证分析。
Stars: 3 | Forks: 0
Network Lockdown
内核级紧急网络隔离与 AI 辅助的事件响应
PF / Netfilter / WFP"}:::fw D -- "Anthropic API :443" --> PASS["PASS"]:::pass D -- "DNS :53" --> PASS D -- "Loopback" --> PASS D -- "Alles andere" --> DROP["DROP"]:::drop PASS --> NET["Netzwerk"]:::node classDef node fill:#1a1a2e,stroke:#555,color:#e0e0e0 classDef fw fill:#0d47a1,stroke:#1565c0,color:#ffffff classDef pass fill:#1b5e20,stroke:#2e7d32,color:#ffffff classDef drop fill:#b71c1c,stroke:#c62828,color:#ffffff ``` **入站流量:** ``` graph LR NET["Netzwerk"]:::node --> J{"FIREWALL
PF / Netfilter / WFP"}:::fw J -- "Etablierte Verbindung" --> PASS["PASS"]:::pass J -- "Alles andere" --> DROP["DROP"]:::drop PASS --> APP["Anwendung"]:::node classDef node fill:#1a1a2e,stroke:#555,color:#e0e0e0 classDef fw fill:#0d47a1,stroke:#1565c0,color:#ffffff classDef pass fill:#1b5e20,stroke:#2e7d32,color:#ffffff classDef drop fill:#b71c1c,stroke:#c62828,color:#ffffff ``` ### 数据包流向详情 1. **应用程序发送数据包**(例如,浏览器访问 google.com) 2. **系统调用**将数据包传递给内核 3. **内核网络栈**接收数据包 4. **防火墙过滤** (PF/Netfilter/WFP) 拦截数据包 5. **规则评估:** - 目标 = Anthropic API IP + 端口 443? → **放行** - 目标 = DNS 服务器 + 端口 53? → **放行** - 目标 = 127.0.0.1 / ::1? → **放行** - 其他情况 → **丢弃**(无 ICMP 响应) 6. 允许的数据包到达网络接口 **结果:** 被阻止的数据包永远不会被发送。应用程序会收到一个超时。 ## 特定平台的实现 ### macOS: `network-lockdown.sh` **技术:** Packet Filter (PF) - **内核框架:** PF 从 OpenBSD 移植并集成到 XNU 内核中 - **内核级别:** 是,PF 是一个直接在网络栈中工作的内核模块 - **用户空间工具:** `pfctl` 配置内核规则 - **规则存储位置:** `/etc/pf.anchors/claude-lockdown` - **备份机制:** `pfctl -sr` 备份当前规则,通过 `/etc/pf.conf.bak` 恢复 - **前置条件:** 无(pfctl 已集成在 macOS 中) **特点:** - 使用 PF Anchors 实现规则的清晰隔离 - 自动检测双栈 (IPv4/IPv6) - 需要 sudo 权限 ### Linux: `network-lockdown-linux.sh` **技术:** iptables/ip6tables + Netfilter - **内核框架:** Netfilter 已牢固集成到 Linux 内核中 - **内核级别:** 是,Netfilter 在 5 个位置使用内核钩子: - `NF_INET_PRE_ROUTING`(路由决策前) - `NF_INET_LOCAL_IN`(到本地应用程序) - `NF_INET_FORWARD`(转发) - `NF_INET_LOCAL_OUT`(来自本地应用程序) - `NF_INET_POST_ROUTING`(路由决策后) - **用户空间工具:** `iptables`、`ip6tables` 配置 Netfilter - **连接跟踪:** `conntrack` 内核模块,用于有状态过滤 - **备份机制:** `iptables-save` / `iptables-restore` - **DNS 检测:** `resolvectl` 或回退到 `/etc/resolv.conf` **特点:** - 明确允许 ICMPv6(用于 IPv6 Neighbor Discovery Protocol) - 独立的 IPv4/IPv6 规则集 - 需要 root 权限 **前置条件:** ``` # Debian/Ubuntu sudo apt-get install iptables dnsutils curl # RHEL/CentOS/Fedora sudo dnf install iptables bind-utils curl ``` ### Windows: `network-lockdown-windows.ps1` **技术:** Windows Filtering Platform (WFP) - **内核框架:** WFP 在 `netio.sys` 中实现(内核模式驱动程序) - **内核级别:** 是,WFP 在网络栈的 NDIS/TDI 层工作 - **用户空间工具:** PowerShell `New-NetFirewallRule`、`netsh advfirewall` - **规则标识:** 所有规则使用 "Claude-Lockdown-" 前缀 - **备份机制:** `netsh advfirewall export`(原生的 .wfw 格式) - **DNS 解析:** PowerShell `Resolve-DnsName` Cmdlet **特点:** - 使用 Windows Firewall API - 独立的 IPv4/IPv6 规则 - 自动配置文件检测(域/专用/公用) - 需要管理员权限 **前置条件:** - PowerShell 5.1 或更高版本 - Windows 10/11 或 Windows Server 2016+ ## 使用说明 ### macOS 和 Linux ``` # 启用 Lockdown sudo ./network-lockdown.sh on # 检查状态 sudo ./network-lockdown.sh status # 更新 IP 列表 (如果 Anthropic CDN 发生变化) sudo ./network-lockdown.sh refresh # 查看当前规则 sudo ./network-lockdown.sh rules # 禁用 Lockdown sudo ./network-lockdown.sh off # 下载 Incident-Response-Guide (PDF) ./network-lockdown.sh guide # 显示帮助 ./network-lockdown.sh help ``` ### Windows ``` # 以管理员身份打开 PowerShell # 启用 Lockdown .\network-lockdown-windows.ps1 on # 检查状态 .\network-lockdown-windows.ps1 status # 更新 IP 列表 .\network-lockdown-windows.ps1 refresh # 查看当前规则 .\network-lockdown-windows.ps1 rules # 禁用 Lockdown .\network-lockdown-windows.ps1 off # 下载 Incident-Response-Guide (PDF) .\network-lockdown-windows.ps1 guide # 显示帮助 .\network-lockdown-windows.ps1 help ``` ## 命令参考 | 命令 | 描述 | |--------|--------------| | `on` | 激活 Lockdown,创建当前防火墙规则的备份 | | `off` | 停用 Lockdown,恢复之前的规则 | | `status` | 显示当前状态(激活/未激活)和上次激活时间 | | `refresh` | 更新 Anthropic IP 地址,自动重新激活 Lockdown | | `rules` | 详细显示所有活动的 Lockdown 规则 | | `guide` | 下载事件响应指南 PDF(德语 + 英语) | | `help` | 显示使用提示 | ## 允许的网络流量 ### 始终允许 - **Loopback:** 127.0.0.0/8, ::1/128 - **DNS:** 到系统 DNS 服务器的端口 53 (TCP/UDP) - **已建立的连接:** 已建立连接的返回数据包 - **ICMPv6**(仅限 Linux):Neighbor Discovery Protocol ### 仅限 Anthropic API - **协议:** HTTPS(TCP 端口 443) - **目标:** 所有解析为 `api.anthropic.com` 的 IP 地址 - **方向:** 仅出站 ### 其他所有流量 **被阻止**(不向发送方返回响应) ## 安全考量 ### 激活时的 IP 解析 Anthropic API IP 在执行 `on` 或 `refresh` 时通过 DNS 解析: ``` # macOS/Linux dig +short api.anthropic.com A dig +short api.anthropic.com AAAA # Windows Resolve-DnsName api.anthropic.com ``` **重要:** 如果 Anthropic 更改其 CDN IP,则必须执行 `refresh`。 ### DNS 作为攻击面 允许 DNS 流量,因为 IP 解析需要它。这是一个极小的攻击面: - DNS 欺骗理论上可能会提供错误的 IP - **缓解措施:** Claude Code CLI 使用 TLS 证书验证 - 仅解析 `api.anthropic.com`,而非任意域名 ### Lockfile 保护 - 防止意外的重复激活 - 存储位置:`/tmp/claude-lockdown.lock` (macOS/Linux) - 在执行 `off` 时自动删除 ### 备份和恢复 **macOS:** ``` # 备份 pfctl -sr > /etc/pf.conf.bak # 恢复 pfctl -f /etc/pf.conf.bak ``` **Linux:** ``` # 备份 iptables-save > /etc/iptables.backup ip6tables-save > /etc/ip6tables.backup # 恢复 iptables-restore < /etc/iptables.backup ip6tables-restore < /etc/ip6tables.backup ``` **Windows:** ``` # 备份 netsh advfirewall export "C:\Windows\Temp\firewall-backup.wfw" # 恢复 netsh advfirewall import "C:\Windows\Temp\firewall-backup.wfw" ``` ### 权限 所有脚本都需要提升的权限: - **macOS/Linux:** `sudo` (root) - **Windows:** 管理员(提升的 PowerShell) **原因:** 防火墙配置是一项特权操作,因为它会修改内核安全机制。 ## 技术细节:内核钩子 ### macOS (PF) PF 集成到 XNU 内核网络栈中: ``` Application → BSD Socket Layer → Network Layer (PF Hook) → Link Layer → Hardware ``` PF 规则存储在内核内存中,并由 `pfctl` 通过 ioctl() 系统调用进行配置。 ### Linux (Netfilter) 内核网络管道中的 Netfilter 钩子: ``` Packet arrives → PRE_ROUTING → routing decision → FORWARD / LOCAL_IN Packet sent → LOCAL_OUT → routing decision → POST_ROUTING → Network Interface ``` 每个钩子位置都可以对数据包执行 ACCEPT、DROP 或 REJECT。 ### Windows (WFP) Windows 网络栈中的 WFP 分层: ``` Application → Winsock → AFD.sys → TCP/IP Stack → WFP Callout Drivers → NDIS → NIC Driver ``` WFP 过滤器被注册为内核模式对象,并由过滤引擎进行评估。 ## 陷阱:Docker 和 WSL2 绕过 Lockdown Docker(以及 Windows 上的 WSL2)可以在**没有防护措施的情况下绕过 Lockdown**。这不是脚本的 Bug,而是架构原因:容器流量绕过了标准的防火墙钩子。 ### 各平台的绕过风险 | 平台 | 绕过风险 | 原因 | |-----------|---------------|---------| | **Linux** | 高 | 运行中的 Docker 守护程序可以重新创建 FORWARD 规则(在 DROP 之前 INSERT);容器通过 FORWARD 而不是 OUTPUT 进行通信 | | **macOS** | 低 | PF 基于数据包工作;`com.docker.backend` 是普通的宿主机进程,会被过滤 | | **Windows** | 很高 | WSL2/Hyper-V 虚拟机完全绕过了 `NetFirewallRule`;只有 `NetFirewallHyperVRule` 会起作用——旧版本的脚本没有使用它 | ### 为什么 Docker 能绕过防火墙? - **Linux:** Docker 使用 `-I` (INSERT) 将其 iptables 规则插入到 FORWARD 链的顶部。即使默认策略是 `FORWARD DROP`,数据包也会通过 Docker 网桥(`docker0`)传输,因为 Docker 在前面放置了自己的 ACCEPT 规则。虽然脚本的 `iptables -F` 会清空所有内容,但只要守护程序(重新)配置了一个容器,它就会重建规则——Lockdown 就这样被绕过了。 - **Windows:** WSL2 和 Docker Desktop 在具有自己虚拟网络适配器的 Hyper-V 虚拟机中运行。数据包绕过 Windows 网络栈,直接通过 Hyper-V 交换机传输——`New-NetFirewallRule` 永远看不到它们。只有从 Win 11 22H2 开始提供的 **Hyper-V 防火墙**(`New-NetFirewallHyperVRule`)才能挂钩得足够深。 - **macOS:** Docker Desktop 通过 Virtualization.framework 在 Linux 虚拟机中运行。出站流量到达宿主机上的 `com.docker.backend`,并通过正常的网卡传出——PF 可以看到该数据包并正确过滤它。 ### 脚本中的解决方案 脚本会检测 Docker/WSL2 并补充特定平台的保护措施: | 脚本 | 对策 | |--------|---------------| | `network-lockdown-linux.sh` (`block_docker_traffic`) | `iptables -I DOCKER-USER 1 -j DROP` + 对所有检测到的 `docker0`/`br-*` 网桥在 FORWARD 中设置 DROP (IPv4+IPv6)。 | | `network-lockdown-windows.ps1` (`Block-HyperVTraffic`) | 遍历所有活动的 VMCreatorIds,设置 `DefaultOutboundAction = Block`,并为 Anthropic + DNS `New-NetFirewallHyperVRule` 允许规则。需要 Win 11 22H2+。 | | `network-lockdown-mac.sh` (`detect_docker`) | 仅检测并警告——PF 已在数据包级别过滤容器流量。 | 为实现**完全隔离**,额外建议: ``` # Linux sudo systemctl stop docker docker.socket containerd # Windows (以管理员身份运行 PowerShell) wsl --shutdown Stop-Service -Name "com.docker.service" -Force # macOS osascript -e 'quit app "Docker Desktop"' ``` 在较旧且没有 Hyper-V 防火墙的 Windows 版本(< Win 11 22H2)上,如果检测到 WSL/Docker,脚本会输出明确的红色警告——此时唯一的解决办法就是停止它们。 ### 其他陷阱 除了 Docker,脚本还涵盖了以下攻击向量: **其他容器运行时(Linux):** Podman、LXC/LXD、直接运行的 containerd、Kubernetes(kind/k3s/minikube)、libvirt——都使用了与 Docker 相同的 iptables 操作技巧。`block_container_traffic` 通过已知的网桥名称(`podman*`、`cni-*`、`lxcbr*`、`virbr*`、`flannel*`、`cilium*`、`kube-*`)以及一种能阻断除 Loopback 和默认上行链路之外的所有 veth/bridge/tun 接口的启发式方法来识别它们。此外,还会在 `CNI-FORWARD`、`KUBE-FORWARD`、`LIBVIRT_FWO` 中设置 DROP。 **直接写入的 nftables(Linux):** 在现代发行版(Debian 11+、RHEL 9+、Fedora)上,nftables 是默认后端。像 firewalld、eBPF/Cilium 这样的工具可以直接写入 nft——`iptables-save` 看不到这些内容,备份也不会捕获它们。如果存在此类表,`check_nftables` 会发出警告。 **现有连接——`--strict` 标志:** 默认情况下,Lockdown 仅停止**新**连接;已打开的 TCP 会话(例如,活动的恶意软件连接)会通过 `ESTABLISHED`/`flags A/A` 继续运行。使用 `--strict`(或在 Windows 上使用 `-Strict`)将强制关闭它们: - Linux:`conntrack -F` + `ss --kill state established` - macOS:`pfctl -F states` - Windows:使用 `MIB_TCP_STATE_DELETE_TCB` 的 `iphlpapi.dll!SetTcpEntry`(与 Sysinternals TCPView 使用的方法相同——无需杀死进程即可终止连接) ``` sudo ./network-lockdown-linux.sh on --strict sudo ./network-lockdown-mac.sh on --strict .\network-lockdown-windows.ps1 on -Strict ``` 在执行 `refresh` 时,`--strict` 会被自动忽略,否则在进行 IP 更新时,正在运行的 Anthropic 会话会被终止。 **macOS 应用程序防火墙(`socketfilterfw`):** 系统设置中的 GUI 防火墙不是 PF,而是位于网络栈的更高层。如果它在全部阻止模式下运行,可能会阻止 Anthropic 流量——这不是绕过,但在功能上令人困惑。`check_app_firewall` 会发出警告。 **WSL 镜像网络(Windows 11):** 在 `.wslconfig` 中使用 `networkingMode=mirrored` 时,WSL2 将共享宿主机网络栈,而不是使用自己的 vEthernet。Hyper-V 防火墙规则的应用方式会有所不同。`Get-WSLNetworkingMode` 会检测该模式并给出提示。 **竞态条件已修复:** 默认策略 `DROP` 在刷新**之前**设置(Linux),macOS 使用原子的 `pfctl -f`,无需单独刷新。这消除了规则刷新与新策略之间毫秒级的窗口期。 ### 共享云 IP 作为残余风险 `api.statsig.com`(被 Claude Code 用于遥测/功能标志)解析为一个 Google Cloud 负载均衡器 IP——这些 IP 以任播的方式与其他 GCP 客户共享。防火墙允许任何到该 IP 在 TCP/443 上的 TLS 连接,而不受 SNI 的限制。经典的域前置在 Google 上确实已失效(SNI 必须与主机名匹配),但在 IP 层面上的信任决策并不是百分之百排他的。用于加固的信息:Anthropic 的 IP 段 `160.79.104.0/21` 是专用的(NetName `AP-2440`),而 Statsig 端点则不是。 ## 故障排除 ### 启动时提示 "Already active" **原因:** Lockfile 仍然存在 ``` # macOS/Linux sudo rm /tmp/claude-lockdown.lock sudo ./network-lockdown.sh on ``` ### "Permission denied" **原因:** 缺少管理员权限 ``` # 始终使用 sudo/Administrator 运行 sudo ./network-lockdown.sh on ``` ### Claude Code CLI 无法连接 1. 检查状态:`sudo ./network-lockdown.sh status` 2. 更新 IP:`sudo ./network-lockdown.sh refresh` 3. 检查规则:`sudo ./network-lockdown.sh rules` 4. 如果仍有问题:停用 Lockdown 并手动测试 ### DNS 解析失败 **Linux:** 检查是否安装了 `dig` ``` sudo apt-get install dnsutils ``` **Windows:** 检查 DNS 客户端服务是否正在运行 ``` Get-Service Dnscache | Start-Service ``` ## 性能说明 - **开销:** 内核级过滤的性能影响极小(<1% CPU) - **延迟:** 对于允许的连接,没有可测量的延迟 - **内存:** 规则占用约 4-8 KB 内核内存 - **扩展性:** 可轻松处理多达 50 个 IP 地址 ## 配色方案 / Color Scheme 所有脚本使用统一的配色方案,并针对深色终端进行了优化: | 颜色 | ANSI 代码 | PowerShell | 用途 | |-------|------------------|------------|------------| | **红色** | `\033[1;31m` | `Red` | 错误,已阻止,严重 | | **绿色** | `\033[1;32m` | `Green` | 成功,允许,正常 | | **黄色** | `\033[1;33m` | `Yellow` | 警告,小心 | | **青色** | `\033[0;96m` | `Cyan` | 信息,进度,指示 | | **洋红色** | `\033[0;95m` | `Magenta` | 节标题,Banner 边框,强调 | | **白色** | `\033[1;37m` | `White` | 标题,主要标签 | | **灰色** | `\033[0;90m` | `DarkGray` | 次要(版本,归属,详情) | **设计原则:** - 使用亮色变体(`1;3xm` / `0;9xm`)以在深色背景上实现最大可读性 - 清晰的语义分离:黄色 = 仅警告,洋红色 = 仅结构/标题 - 在所有三个平台(macOS、Linux、Windows)上保持一致 ## 许可与免责声明 这些脚本按“原样”提供,不作任何保证。在生产环境中使用之前,请在安全的环境中进行测试。 **警告:** 激活的 Lockdown 会阻止除 Claude Code CLI 之外的所有网络连接。SSH 连接、更新、浏览器等将无法工作。
🔐 由 Martin Pfeffer 在柏林紧锁的门后锻造
标签:AI合规, AI辅助, certspotter, Claude Code, CLI, MacOS取证, PB级数据处理, WiFi技术, 内核级, 子域名枚举, 安全运维, 库, 应急响应, 应用安全, 插件系统, 数字取证, 法证分析, 流量控制, 灾难恢复, 白名单, 系统安全, 结构化查询, 网络安全, 网络隔离, 脚本, 自动化安全, 自动化脚本, 防御绕过, 防火墙, 隐私保护