【问题标题】:Which Linux capability to use to properly run "sysctl -w net.ipv4.conf.tun0.route_localnet=1" in a Docker container?使用哪种 Linux 功能在 Docker 容器中正确运行“sysctl -w net.ipv4.conf.tun0.route_localnet=1”?
【发布时间】:2022-01-23 17:47:25
【问题描述】:

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

我想将我的 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 中找不到答案。

【问题讨论】:

    标签: docker networking openvpn sysctl linux-capabilities


    【解决方案1】:

    我找到了一个解决方案,使用 --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.
    

    【讨论】:

      猜你喜欢
      • 2015-08-19
      • 2017-02-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2021-07-08
      • 1970-01-01
      相关资源
      最近更新 更多