如何使 Systemd 专用网络命名空间可访问

如何使 Systemd 专用网络命名空间可访问

因此,我有一个仅绑定0.0.0.0并侦听端口 (TCP) 的应用程序。通信未加密且未经授权,因此我想解决这个问题,但又不想太过深入。

我希望将其绑定,127.0.0.1以便我可以执行以下操作SSH 转发获取身份验证和加密的技巧。

但问题仍然是,该过程必须与外部绑定0.0.0.0并可从外部访问。

我的一个想法是使用 SystemdPrivateNetwork隔离网络(我也想以其他方式对应用程序进行沙箱处理),但我不知道如何让 SSH 继续工作。也许运行一个sshdand加盟网络命名空间?但那么我如何才能sshd从“外部”访问连接呢?

有没有比获取更简单的方法LD_预加载参与或做插座恶作剧?最好systemd以某种方式涉及单位/服务,例如这个 socat 答案

答案1

因此,首先:绑定到 0.0.0.0 并且不可配置的网络应用程序在我的书中将被视为致命错误,如果您有任何杠杆作用,这将是开发人员需要修复的问题。 (作为一名 FOSS 维护者/开发者,这从来都不是问题:最坏的情况,这是你可以自己完成的一行修复。)

您还可以考虑的一个选项是LD_PRELOAD技巧,您只需预加载一个非常小的库来劫持libcbind调用,检查它是否将 TCP 套接字绑定到 0.0.0.0,并将实际调用弯曲到实际bind函数,以便它绑定到您选择的地址。

甚至更简单的是,只需在公共接口上删除禁止连接到端口的防火墙规则,以便只有环回连接有效。

解决这个问题的高度封装方法,以及可能减少以后的迁移/维护工作,是将您的应用程序放入 Linux 容器中(例如,由 运行podman),然后在内部发布端口。 (您可以很好地使用podman generate为此类容器及其自动启动的基础设施生成 systemd 单元文件,您甚至可以在没有特殊权限的情况下运行这些东西,这对于这个坦率地说编写得不太好的网络应用程序来说是一个安全优势现在就做。)

万能的、没有任何东西离开这台机器未加密的解决方案可能是在线卫手册,您可以将计算机拥有的物理接口从默认名称空间中运行的所有程序中取出,将它们推送到单独的名称空间中,并且只允许 VPN 隧道连接(wireguard 接口)与这些程序进行交互。不是您的 SSH 解决方案,但如果wireguard适合您的场景,这可能是一个选择。

我的一个想法是使用 Systemd 的 PrivateNetwork 来隔离网络(我也想以其他方式对应用程序进行沙箱处理),但我不知道如何让 SSH 继续工作。

一个很好的方法!可悲的是我认为PrivateNetwork=隔离非常成功全部网络,您必须编写一个程序,以某种方式提取临时网络 NS 名称,并将其交给另一个单元,然后该单元将建立一个桥(通常是:macvlanip link构造)并将其传输到该名称空间。有点开销。

你可以有一个设置,你有

  1. 一次性单元,用于ip创建命名空间、在内部设置设备lo并将新命名空间绑定到自身。然后,
  2. 您的可疑服务使用NetworkNamespacePath=在该命名空间中;
  3. 您将一个桥添加到另一个一次性单元中的该名称空间中

有一个我找到的文章这几乎描述了这一点。


结论:我认为使用单个iptables/nftables规则是最简单的,但如果您需要设置桥接命名空间,那应该是可能的。然而,您非常接近人们通常只是扔容器的用例,这可能是最灵活的解决方案。

相关内容