45 lines
1.6 KiB
Markdown
45 lines
1.6 KiB
Markdown
# Container Networking {#sec-container-networking}
|
|
|
|
When you create a container using `nixos-container create`, it gets it
|
|
own private IPv4 address in the range `10.233.0.0/16`. You can get the
|
|
container's IPv4 address as follows:
|
|
|
|
```ShellSession
|
|
# nixos-container show-ip foo
|
|
10.233.4.2
|
|
|
|
$ ping -c1 10.233.4.2
|
|
64 bytes from 10.233.4.2: icmp_seq=1 ttl=64 time=0.106 ms
|
|
```
|
|
|
|
Networking is implemented using a pair of virtual Ethernet devices. The
|
|
network interface in the container is called `eth0`, while the matching
|
|
interface in the host is called `ve-container-name` (e.g., `ve-foo`).
|
|
The container has its own network namespace and the `CAP_NET_ADMIN`
|
|
capability, so it can perform arbitrary network configuration such as
|
|
setting up firewall rules, without affecting or having access to the
|
|
host's network.
|
|
|
|
By default, containers cannot talk to the outside network. If you want
|
|
that, you should set up Network Address Translation (NAT) rules on the
|
|
host to rewrite container traffic to use your external IP address. This
|
|
can be accomplished using the following configuration on the host:
|
|
|
|
```nix
|
|
networking.nat.enable = true;
|
|
networking.nat.internalInterfaces = ["ve-+"];
|
|
networking.nat.externalInterface = "eth0";
|
|
```
|
|
|
|
where `eth0` should be replaced with the desired external interface.
|
|
Note that `ve-+` is a wildcard that matches all container interfaces.
|
|
|
|
If you are using Network Manager, you need to explicitly prevent it from
|
|
managing container interfaces:
|
|
|
|
```nix
|
|
networking.networkmanager.unmanaged = [ "interface-name:ve-*" ];
|
|
```
|
|
|
|
You may need to restart your system for the changes to take effect.
|