在容器里运行 VPN,如何接管其他容器的流量作为默认出口?

40 天前
 cnt2ex

大概的背景是这样的。

我有 3 个服务,分别是通过 3 个 compose.yml 管理的。 一个服务是 caddy ,作为反向代理,同时反代另外两个服务(叫它们 A 和 B 好了)。 caddy 容器通过 external network 和 A 、B 相连,并且通过容器名访问 A 和 B 。

但是服务 A 和 B 都需要访问一些被污染了的网站(比如 raw.githubusercontent.com),虽然试过设置 HTTP_PROXY/HTTPS_PROXY 等环境变量让它们走代理,但是依然有部分流量直连,因此打算再跑一个 VPN 容器来接管这两个服务的流量。

假设我跑起来了一个 VPN 容器,该怎么接管 A 和 B 的流量呢?

1480 次点击
所在节点    Docker
5 条回复
66450146
40 天前
network_mode: container:<your_container_name>
cnt2ex
40 天前
@66450146
考虑过这个方法了,但遇到了一些问题。

是我把背景过于简化了,没有讲清楚。因为我想着把大致背景交代一下,就能遇到解决过类似问题的人。
毕竟 V2EX 上应该有不少人都在 NAS 上通过 docker 自建自己的各种服务,应该遇到过相似的问题。

实际上,B 是包含多个容器的服务(独立的一个 compose.yml 管理的)。一个 php-fpm 容器,一个 db 容器。如主题所说,caddy 通过容器名访问并反代 php-fpm 。而 php-fpm 实际上也通过容器名访问 db 容器。如果把 php-fpm 的 network_mode 设置成 vpn 的话,就会导致 php-fpm 的 DNS 服务器也变成 VPN 的 DNS ,导致 php-fpm 通过容器名访问 db 失效了。
piku
40 天前
@cnt2ex 都 compose 了,多网络不好吗
xinge666
40 天前
我的解决方案是装一个 iStoreOS 或者 OpenWRT ,然后其他的虚拟机直接由它来获取 IP 以及科学上网
ihciah
40 天前
网络互通要么扔同一个网络里,要么 veth 怼起来; dns 是更上层的另一回事。感觉扔同一个网络最简单,dns 的话只需要自己容器里起一个独立的 dnsmasq 转到 coredns 或者 8888 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1147792

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX