在 Docker 容器中使用哪种 Linux 功能可以正确地 运行 "sysctl -w net.ipv4.conf.tun0.route_localnet=1"?

Which Linux capability to use to properly run "sysctl -w net.ipv4.conf.tun0.route_localnet=1" in a Docker container?

我在 Docker 容器中使用 OpenVPN 服务器进行多个客户端连接。 此容器位于 特定 Docker 网络 中,其中我有一个 Web 服务器作为客户端目标。

我想将我的网络服务器的主机名发布给客户,这样他们就不需要知道它的 IP 地址就可以访问它。 为此,我想向 OpenVPN 客户端开放 Docker 的本地 DNS 服务器,并将 OpenVPN 的 IP 作为 DNS 服务器推送给它们。

然而,Docker DNS 服务器驻留在 OpenVPN 容器中,侦听 127.0.0.11(使用 iptables 内部重定向,但这是另一回事)。

因此,在 OpenVPN 服务器容器中,我需要添加一个 iptables 规则,以便将来自外部 OpenVPN IP 的 DNS 请求转发到内部 127.0.0.11 一个.

但是这样的内部转发需要我执行以下命令:

sysctl -w net.ipv4.conf.tun0.route_localnet=1

在 运行 docker run (--cap-add=NET_ADMIN) 时仅使用 NET_ADMIN 功能,我收到以下错误消息:

sysctl: error setting key 'net.ipv4.conf.tun0.route_localnet': Read-only file system

但是,使用 --privileged 标志可以完美地工作,但是那个太宽松了

是否有任何 Linux 功能可以在不使用 --privileged 标志 的情况下实现 技巧? 我在 Linux capabilities manual.

中找不到答案

我找到了一个解决方案,使用 --sysctldocker run 选项

解决方案在docker-compose.yml:

sysctls:
    - net.ipv4.conf.tun0.route_localnet=1    # Doesn't work as tun0 doesn't 
                                             # exist yet at container start time
    - net.ipv4.conf.default.route_localnet=1 # Workaround.