Как сделать контейнер nixos видимым для внешней сети
Я хотел бы иметь контейнер NIXOS, который виден внешней сети. Я хотел бы установить статический IP-адрес для этого контейнера, чтобы какой-то другой ноутбук в моей домашней сети мог подключиться к нему по ssh. Контейнер должен быть доступен не только для хоста, на котором он находится. Итак, давайте обозначим эти компьютеры. (A) является хостом nixos. (B) контейнер, расположенный на (A). И (C) - это третий отдельный компьютер в сети, который хочет получить доступ (B) по сети. Если кто-то может предоставить простейшую конфигурацию, которая должна быть добавлена к /etc/nixos/configuration.nix
файл для достижения этого, который был бы чрезвычайно признателен.
+ ------------------- + + -------- + | | | | | + -------- + A | | C | | | | | | + -----------------------------------> B | | | | | | | | + -------- + | | | | | + -------- + | | | | | + ------------------- +
2 ответа
Для завершения ответа, для варианта 2 вы можете использовать опцию контейнера privateNetwork = false;
отключить пространство имен сети. См. Код container.nix для деталей. С помощью этой опции вы будете использовать один и тот же IP-адрес между хостом и контейнером.
Другой вариант - переадресация порта из контейнера на хост с опциями ForwardPorts.
Более общий способ (который работает и с NixOps) это использовать хост networking.nat
вариант, например:
networking.nat = {
enable=true;
internalInterfaces=["ve-+"];
externalInterface = "enp0s3";
forwardPorts = [
{destination = "mycontainerIP:80"; sourcePort = 80;}
];
};
Есть несколько способов сделать это, и все они не являются специфичными для NixOS.
- Организовать VPN между машинами и контейнерами. Например, запустите мастер OpenVPN на своем хосте и клиенты OpenVPN в контейнерах и других машинах. Вы получите подсеть, в которой вы можете получить доступ к своим контейнерам по отдельным IP-адресам. К сожалению, это требует много настроек (я делал это раньше).
- Не используйте отдельные виртуальные устройства Ethernet для контейнеров. Тогда все контейнеры будут совместно использовать адреса портов хоста и будут одинаково доступны извне. Это требует переназначения портов для конфликтующих сервисов.
- Прокси желаемых портов от хоста к контейнеру (я сделал это с помощью
haproxy
)