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

2.9 KiB
Raw Permalink Blame History

Apple Container 网络设置 (macOS 26)

Apple Container 的 vmnet 网络需要手动配置容器才能访问互联网。否则容器可以与宿主机通信但无法访问外部服务DNS、HTTPS、API

快速设置

运行以下两条命令(需要 sudo

# 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 中传递。

验证

# 检查 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/以太网)→ 互联网

参考资料