Sub2API Docker 容器走宿主机 Mihomo SOCKS5 代理配置文档

发布于 最后更新 阅读 3

下面这份可以直接作为你的部署文档使用。


1. 场景说明

当前部署结构:

宿主机 Linux
├── mihomo
│   └── SOCKS5 端口:11008
│
└── Docker
    └── sub2api 容器
        └── 需要通过 mihomo 代理访问外部网络

由于 sub2api 运行在 Docker 容器中,容器内的:

127.0.0.1

指的是 sub2api 容器自己,不是宿主机。

所以不能在 sub2api 中配置:

socks5h://127.0.0.1:11008

需要使用 Docker 容器访问宿主机的网关 IP。


2. 确认 mihomo 端口在宿主机可用

在宿主机执行:

curl --max-time 20 -x socks5h://127.0.0.1:11008 https://ipinfo.io/json

如果能返回出口 IP,说明 mihomo 本机代理正常。


3. 修改 mihomo 监听配置

mihomo 需要允许 Docker 容器访问,所以不能只监听 127.0.0.1。

检查监听状态:

ss -lntp | grep 11008

理想结果类似:

LISTEN 0 4096 *:11008 *:* users:(("mihomo",pid=xxx,fd=xx))

如果看到的是:

127.0.0.1:11008

说明只允许宿主机本机访问,Docker 容器访问不到。

mihomo 配置中建议设置:

allow-lan: true
bind-address: "*"

如果使用的是 listeners 多端口配置,11008 监听建议类似:

listeners:
  - name: socks-11008
    type: socks
    port: 11008
    listen: 0.0.0.0

修改后重启 mihomo:

sudo systemctl restart mihomo

再次检查:

ss -lntp | grep 11008

4. 查看 sub2api 容器的宿主机网关 IP

进入 sub2api 所在服务器,执行:

docker exec -it sub2api sh -c "ip route"

示例结果:

default via 172.18.0.1 dev eth0
172.18.0.0/16 dev eth0 scope link src 172.18.0.4

其中:

172.18.0.1

就是当前 sub2api 容器访问宿主机的网关 IP。

也可以直接提取:

docker exec -it sub2api sh -c "ip route | awk '/default/ {print \$3}'"

5. 在 sub2api 容器内测试 mihomo

根据上一步拿到的网关 IP 测试:

docker exec -it sub2api curl -v --max-time 20 \
  -x socks5h://172.18.0.1:11008 \
  https://ipinfo.io/json

如果能返回出口 IP,说明:

sub2api 容器 -> 宿主机 mihomo -> 外部网络

链路已经打通。


6. 如果容器访问超时,放行 Docker 网段

如果宿主机本地测试正常,但容器里访问超时,可以放行 Docker 自定义网络访问 mihomo 端口。

当前 sub2api 网段是:

172.18.0.0/16

临时放行:

sudo iptables -I INPUT 1 -s 172.18.0.0/16 -p tcp --dport 11008 -j ACCEPT

再次测试:

docker exec -it sub2api curl -v --max-time 20 \
  -x socks5h://172.18.0.1:11008 \
  https://ipinfo.io/json

如果服务器使用 UFW,可以持久化放行:

sudo ufw allow from 172.18.0.0/16 to any port 11008 proto tcp

查看规则:

sudo ufw status verbose

7. sub2api 中配置代理地址

在 sub2api 后台或环境变量中,将代理地址设置为:

socks5h://172.18.0.1:11008

不要使用:

socks5h://127.0.0.1:11008

也不建议继续使用:

socks5h://host.docker.internal:11008

因为当前 sub2api 在 Docker 自定义网络中,实际可用的宿主机网关是:

172.18.0.1

8. 如果通过 docker-compose 配置

进入部署目录:

cd /opt/sub2api-deploy

如果代理地址写在 .env 中,可配置为:

PROXY_URL=socks5h://172.18.0.1:11008

如果写在 docker-compose.yml 中,可配置为:

services:
  sub2api:
    environment:
      PROXY_URL: socks5h://172.18.0.1:11008

修改后重启 sub2api:

docker compose restart sub2api

查看日志:

docker logs -f sub2api

9. 最终验证命令

宿主机测试 mihomo:

curl --max-time 20 -x socks5h://127.0.0.1:11008 https://ipinfo.io/json

容器内测试 mihomo:

docker exec -it sub2api curl --max-time 20 \
  -x socks5h://172.18.0.1:11008 \
  https://ipinfo.io/json

sub2api 中最终使用的代理地址:

socks5h://172.18.0.1:11008

10. 常见错误说明

错误一:connection refused

dial tcp 127.0.0.1:11008: connect: connection refused

原因:在 Docker 容器中使用了 127.0.0.1,它指向容器自己,不是宿主机。

解决:

改为 socks5h://172.18.0.1:11008

错误二:no such host

lookup host.docker.internal: no such host

原因:Linux Docker 默认不一定支持 host.docker.internal。

解决:不用这个域名,直接使用容器网关 IP:

socks5h://172.18.0.1:11008

错误三:connection timed out

Connection timed out

原因通常是 mihomo 没有监听 0.0.0.0,或者宿主机防火墙拦截了 Docker 网段访问。

解决:

sudo iptables -I INPUT 1 -s 172.18.0.0/16 -p tcp --dport 11008 -j ACCEPT

并确保 mihomo 监听:

*:11008

结论

在当前部署环境中,sub2api 走 mihomo 的最终可用配置是:

socks5h://172.18.0.1:11008

核心原因是:

sub2api 在 Docker 自定义网络中
宿主机 mihomo 在容器外运行
容器需要通过 Docker 网关 IP 访问宿主机代理端口
文章标签: 暂无标签

相关推荐

评论

avatar
DannyTheom 2026-11-01 16:04
Discover how nailing digital marketing tactics can increase your digital footprint and attract more visitors to your platform. Explore proven techniques like SEO keyword planning, material enhancement, and inbound link strategies to stand out in the cutthroat internet space. Stay ahead by adjusting to the latest ranking shifts and popular themes to ensure sustained growth in your marketing initiatives. <a href="http://boss.why3s.cc/boss/home.php?mod=space&uid=311520">boss.why3s.cc</a>