CoreOS / rkt / systemd - 如何访问低编号端口?

CoreOS / rkt / systemd - 如何访问低编号端口?

[最初是在 Stack Overflow 上询问的,但被搁置了,建议我在这里询问。]

我有一个用 go 编写的 Web 应用程序,它接受端口 80 和 443 上的流量。如果我执行以下操作,它可以正常工作:

  • 将可执行二进制文件复制到运行 CoreOS 的服务器
  • sudo setcap 'cap_net_bind_service=+eip' executable-name
  • 以非特权用户身份手动调用该程序

我现在尝试在 rkt 下使用 acbuild 构建的容器中运行它:

acbuild begin
acbuild set-name myapp
acbuild copy myapp /app/myapp
acbuild set-exec -- /app/myapp
acbuild set-working-directory /app
acbuild mount add etcssl /etc/ssl
acbuild mount add cacert /usr/share/ca-certificates
acbuild set-user 500
acbuild set-group 500
acbuild write --overwrite myapp.aci
acbuild end

...

sudo rkt run  ...  --net=host

如果我让应用程序监听高编号端口,那么这个功能就可以正常工作,但我无法让它监听端口 80 和 443。

我努力了:

  1. echo '{ "set": ["CAP_NET_BIND_SERVICE"] }' | acbuild isolator add "os/linux/capabilities-retain-set" -

    sudo rkt run ... --net=host

    这似乎没有任何效果,因为 ListenAndServeTLS 返回:

    listen tcp :443: bind: permission denied

  2. 更改应用程序以监听 8480 和 8443。

    acbuild port add http tcp 8480

    acbuild port add https tcp 8443

    sudo rkt run ... --port=http:80 --port=https:443

    应用程序运行且未报告任何错误,但从未看到任何传入请求。

  3. 更改应用程序以监听 8480 和 8443。

    sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8480

    sudo iptables -A PREROUTING -t nat -p tcp --dport 443 -j REDIRECT --to-port 8443

    sudo rkt run ... --net=host

    应用程序运行且未报告任何错误,但从未看到任何传入请求。

    注意:我对 没有什么经验iptables,而且我很可能做错了什么。在iptables -nvL我运行上述两个命令之前和之后给出相同的输出,所以我不确定它们是否真的做了什么。

  4. 我尝试使用rkt,但也失败systemdAmbientCapabilities=CAP_NET_BIND_SERVICEbind: permission denied

  5. 我也尝试添加--caps-retain=CAP_NET_BIND_SERVICErkt run命令行,但没有帮助。

  6. 如果我删除set-userset-groupacbuild 行,应用程序确实可以运行,但它以 root 身份运行,这会违背在容器中运行的主要目的之一 - 为了安全起见降低权限。

如果有人能提供任何见解,我将不胜感激。谢谢。

编辑:已经有在 rkt-dev 小组中对此进行了简短的讨论还有一个 github 问题跟踪就我目前的目的而言,我发现单独使用 systemd(无需 rkt 或任何其他容器运行时)即可提供足够的保护,并且我已经切换到它,因此我不会再关注这个问题。

相关内容