Files
nanoclaw/docs/zh/APPLE-CONTAINER-NETWORKING.md
2026-05-12 13:14:17 +00:00

91 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Apple Container 网络设置 (macOS 26)
Apple Container 的 vmnet 网络需要手动配置容器才能访问互联网。否则容器可以与宿主机通信但无法访问外部服务DNS、HTTPS、API
## 快速设置
运行以下两条命令(需要 `sudo`
```bash
# 1. 启用 IP 转发,以便宿主机路由容器流量
sudo sysctl -w net.inet.ip.forwarding=1
# 2. 启用 NAT以便容器流量通过你的互联网接口进行伪装
echo "nat on en0 from 192.168.64.0/24 to any -> (en0)" | sudo pfctl -ef -
```
> **注意:** 将 `en0` 替换为你的活跃互联网接口。使用 `route get 8.8.8.8 | grep interface` 检查。
## 持久化设置
这些设置在重启后会重置。要使其永久生效:
**IP 转发**——添加到 `/etc/sysctl.conf`
```
net.inet.ip.forwarding=1
```
**NAT 规则**——添加到 `/etc/pf.conf`(在任何现有规则之前):
```
nat on en0 from 192.168.64.0/24 to any -> (en0)
```
然后重新加载:`sudo pfctl -f /etc/pf.conf`
## IPv6 DNS 问题
默认情况下DNS 解析器先返回 IPv6 (AAAA) 记录,然后才返回 IPv4 (A) 记录。由于我们的 NAT 仅处理 IPv4容器内的 Node.js 应用将首先尝试 IPv6 然后失败。
容器镜像和运行器通过以下方式配置为优先使用 IPv4
```
NODE_OPTIONS=--dns-result-order=ipv4first
```
这在 `Dockerfile` 中设置,并通过 `-e` 标志在 `container-runner.ts` 中传递。
## 验证
```bash
# 检查 IP 转发是否已启用
sysctl net.inet.ip.forwarding
# 预期输出net.inet.ip.forwarding: 1
# 测试容器互联网访问
container run --rm --entrypoint curl nanoclaw-agent:latest \
-s4 --connect-timeout 5 -o /dev/null -w "%{http_code}" https://api.anthropic.com
# 预期输出404
# 检查桥接接口(仅当容器运行时存在)
ifconfig bridge100
```
## 故障排查
| 症状 | 原因 | 修复方案 |
|---------|-------|-----|
| `curl: (28) Connection timed out` | IP 转发未启用 | `sudo sysctl -w net.inet.ip.forwarding=1` |
| HTTP 正常HTTPS 超时 | IPv6 DNS 解析 | 添加 `NODE_OPTIONS=--dns-result-order=ipv4first` |
| `Could not resolve host` | DNS 未转发 | 检查 bridge100 是否存在,验证 pfctl NAT 规则 |
| 容器输出后挂起 | agent-runner 缺少 `process.exit(0)` | 重建容器镜像 |
## 工作原理
```
容器 VM (192.168.64.x)
├── eth0 → 网关 192.168.64.1
bridge100 (192.168.64.1) ← 宿主机网桥,由 vmnet 在容器运行时创建
├── IP 转发sysctl将数据包从 bridge100 路由 → en0
├── NATpfctl将 192.168.64.0/24 伪装 → en0 的 IP
en0你的 WiFi/以太网)→ 互联网
```
## 参考资料
- [apple/container#469](https://github.com/apple/container/issues/469) — macOS 26 上容器无网络
- [apple/container#656](https://github.com/apple/container/issues/656) — 构建期间无法访问互联网 URL