在 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.
中找不到答案
我找到了一个解决方案,使用 --sysctl
的 docker 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.
我在 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.
我找到了一个解决方案,使用 --sysctl
的 docker 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.