如何使nixos容器对外部网络可见

时间:2017-09-07 16:12:59

标签: networking nixos linux-containers

我希望有一个外部网络可见的nixos容器。我想为该容器设置一个静态IP,我家网络上的其他笔记本电脑可以插入到容器中。容器应该不仅可以访问它所驻留的主机。所以我们标记这些计算机。 (A)是nixos主持人。 (B)是居住在(A)上的容器。并且(C)是网络上想要通过网络访问(B)的第三个单独的计算机。如果有人可以提供应该添加到/etc/nixos/configuration.nix文件中的最简单的配置来实现这一目标,那将非常感激。

                                 +-------------------+
+--------+                       |                   |
|        |                       |  +--------+     A |
|      C |                       |  |        |       |
|   +----------------------------------->  B |       |
|        |                       |  |        |       |
+--------+                       |  |        |       |
                                 |  +--------+       |
                                 |                   |
                                 |                   |
                                 +-------------------+

2 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点,并且所有这些都不是NixOS特有的。

  1. 在机器和容器之间组织VPN。例如,在主机上启动OpenVPN master,在容器和其他机器上启动OpenVPN客户端。您将获得一个子网,您可以通过单独的IP访问您的容器。不幸的是,这需要大量的配置(之前我已经完成了这个)。
  2. 不要将单独的虚拟以太网设备用于容器。然后,所有容器将共享主机的端口地址,并且可以从外部平均访问。这需要为冲突服务重新映射端口。
  3. 从主机到容器的代理所需端口(我使用haproxy
  4. 执行此操作

答案 1 :(得分:0)

要完成danbst答案,对于选项2,您可以使用容器选项privateNetwork = false;来禁用网络命名空间。 See container.nix code了解详情。使用此选项,您将在主机和容器之间共享相同的IP地址。

另一种选择是使用ForwardPorts options将端口从容器转发到主机。

更通用的方式(也适用于NixOps)它使用主机networking.nat选项,例如:

networking.nat = {
    enable=true;
    internalInterfaces=["ve-+"];
    externalInterface = "enp0s3";
    forwardPorts = [
      {destination = "mycontainerIP:80"; sourcePort = 80;}
    ];
  };