ubuntuusers.de

LXD Container kann nicht mit dem Netzwerk kommunizieren

Status: Ungelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

SillySimon

Anmeldungsdatum:
27. August 2018

Beiträge: 8

Hallo Community, ich habe vor kurzer zeit das Container-System lxd entdeckt und versuche momentan einen Minecraft-Server innerhalb eines Containers laufen zu lassen. Ich habe also ein paar Artikel zu dem Thema gelesen (teils auch nur überflogen) und bin zur Erkenntnis gekommen, dass "macvlan" wohl die einfachste Methode ist, Traffic vom Container in mein Heimnetz zu leiten. Also habe ich dies im Configurationsassistenten (lxd init) so eingestellt. Wenn ich allerdings innerhalb eines Containers versuche das Internet anzupingen, passiert folgendes.

root@minecraft:~# ping 8.8.8.8
ping: socket: Operation not permitted

auch andere versuche, mit dem Internet oder dem Heimnetz zu kommunizieren schlugen fehl

ifconfig innerhalb des Containers zeigt folgendes:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::216:3eff:fe7f:4d69  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:7f:4d:69  txqueuelen 1  (Ethernet)
        RX packets 2  bytes 435 (435.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7  bytes 578 (578.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 52  bytes 3812 (3.8 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 52  bytes 3812 (3.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

die Netzwerk-Configuration des hosts sieht fogendermaßen aus:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.242  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 2a02:8071:b695:e700:c4f2:220b:7c97:9783  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::c4cc:8f4e:65b6:e26d  prefixlen 64  scopeid 0x20<link>
        inet6 2a02:8071:b695:e700:b222:4ee2:16b3:739b  prefixlen 64  scopeid 0x0<global>
        ether 16:29:69:6c:31:52  txqueuelen 1000  (Ethernet)
        RX packets 1394  bytes 1501305 (1.5 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 432  bytes 53263 (53.2 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 24  

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 132  bytes 11252 (11.2 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 132  bytes 11252 (11.2 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lxdbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.196.25.1  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fd42:d0c9:8d2d:6bd0::1  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::d484:6bff:fe49:6b1d  prefixlen 64  scopeid 0x20<link>
        ether d6:84:6b:49:6b:1d  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 17  bytes 1956 (1.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

die Profilconfiguration von lxd ist die folgende:

config: {}
description: Default LXD profile
devices:
  eth0:
    name: eth0
    nictype: macvlan
    parent: eth0
    type: nic
  root:
    path: /
    pool: default
    type: disk
name: default
used_by:
- /1.0/containers/minecraft

ich nutzen als host einen rockpi 4b, das System ist Ubuntu-Server 18.04, das Gerät ist mit meinem Heimnetz über Lan verbunden.

Ich hoffe, ihr könnt mir helfen, Liebe Grüße Simon.

Edit: lxc list gibt folgendes aus:

rock@rockserv:~$ lxc list
+-----------+---------+------+------+------------+-----------+
|   NAME    |  STATE  | IPV4 | IPV6 |    TYPE    | SNAPSHOTS |
+-----------+---------+------+------+------------+-----------+
| minecraft | RUNNING |      |      | PERSISTENT | 0         |
+-----------+---------+------+------+------------+-----------+

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

SillySimon schrieb:

Ich habe also ein paar Artikel zu dem Thema gelesen (teils auch nur überflogen) und bin zur Erkenntnis gekommen, dass "macvlan" wohl die einfachste Methode ist, Traffic vom Container in mein Heimnetz zu leiten.

Dann hast du vermutlich ungenau gelesen. Meines Erachtens ist veth die einfachere Methode. Soweit ich das sehe, ist dein Bridge-Interface auf dem Host gar nicht für macvlan-Networking geeignet. Es ist aus meiner Sicht auch nicht nötig, dass ein Container für Applikations-Isolation direkt im Netzwerk des Hosts hängt, und ggf. sogar noch per DHCP eine IP aus dem Heimnetzwerk bekommt.

Ich würde dir empfehlen eine normale Bridge auf dem Host anzulegen (die du vermutlich mit lxdbr0 schon hast), und dann im Container eine statische IP zu konfigurieren, aus einem Netz ungleich dem Hostnetz. Anschließend konfigurierst du den Host als Gateway und konfigurierst NAT (bzw. MASQUERADING).

Angenommen du willst das Interface lxdbr0 nehmen, und dort ein Container-Netz, sagen wir 10.10.10.0/24 aufspannen, dann würde ich erstmal eine IP für den Host auf der Bridge konfigurieren und eine entsprechende Route zu setzen:

ip addr add 10.10.10.1/24 dev lxdbr0
ip route add 10.10.10.0/24 dev lxdbr0

Das geht erstmal zum testen, später müsstest du das natürlich boot-fest konfigurieren. Anschließend aktivierst du auf dem Host IP-Forwarding:

echo 1 > /proc/sys/net/ipv4/ip_forward

Zuletzt musst du noch alle ausgehenden Verbindungen, die aus dem Netz 10.10.10.0/24 kommen und auf eth0 rausgehen, maskieren (=SNAT mit der IP des Hosts):

iptables -t nat -A POSTROUTING -o eth0 -s 10.10.10.0/24 -j MASQUERADE

Anschließend kannst du im Container eine beliebige IP aus dem Netz konfigurieren und trägst als Gateway 10.10.10.1 (also den Host) ein. Dann solltest du Ziele im Internet erreichen.

SillySimon

(Themenstarter)

Anmeldungsdatum:
27. August 2018

Beiträge: 8

Hallo nochmal, tut mir leid für die lange pause. Ich habe jetzt das Host-System komplett neu aufgesetzt und lxd installiert. Diesmal habe ich bei der Inititalisierung darauf geachtet, lxdbr0 als Netzwerk zu verwenden. Ergebnis für einen neuen Container:

root@rockserv ~# lxc list
+------+---------+------+-----------------------------------------------+------------+-----------+
| NAME |  STATE  | IPV4 |                     IPV6                      |    TYPE    | SNAPSHOTS |
+------+---------+------+-----------------------------------------------+------------+-----------+
| test | RUNNING |      | fd42:ebdf:b4d9:856f:216:3eff:fef1:9388 (eth0) | PERSISTENT | 0         |
+------+---------+------+-----------------------------------------------+------------+-----------+

wieder keine ipv4 und keine Möglichkeit für den Container irgendwo hin zu pingen, selbst ipv6 Adressen einschließlich seiner eigenen. Fehlermeldung:

root@test:~# ping fd42:ebdf:b4d9:856f:216:3eff:fef1:9388
ping: socket: Operation not permitted

hier noch einmal die profil-config vom host:

config: {}
description: Default LXD profile
devices:
  eth0:
    name: eth0
    nictype: bridged
    parent: lxdbr0
    type: nic
  root:
    path: /
    pool: default
    type: disk
name: default
used_by:
- /1.0/containers/test

ifconfig vom host:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.242  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 2a02:8071:b695:e700:ad77:a2cb:a349:e03e  prefixlen 64  scopeid 0x0<global>
        inet6 2a02:8071:b695:e700:dd9:5575:732e:561e  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::fd6c:2440:7851:c8a8  prefixlen 64  scopeid 0x20<link>
        ether 16:29:69:6c:31:52  txqueuelen 1000  (Ethernet)
        RX packets 2277  bytes 1535507 (1.5 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1053  bytes 150469 (150.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 24  

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 132  bytes 11252 (11.2 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 132  bytes 11252 (11.2 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lxdbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.107.38.1  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fd42:ebdf:b4d9:856f::1  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::1c0b:deff:fe94:e0d9  prefixlen 64  scopeid 0x20<link>
        ether fe:a8:7c:08:29:21  txqueuelen 1000  (Ethernet)
        RX packets 22  bytes 1840 (1.8 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 33  bytes 3628 (3.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vethHVYJTD: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::fca8:7cff:fe08:2921  prefixlen 64  scopeid 0x20<link>
        ether fe:a8:7c:08:29:21  txqueuelen 1000  (Ethernet)
        RX packets 22  bytes 2148 (2.1 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 39  bytes 4266 (4.2 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

hier vom Container:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fd42:ebdf:b4d9:856f:216:3eff:fef1:9388  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::216:3eff:fef1:9388  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:f1:93:88  txqueuelen 1000  (Ethernet)
        RX packets 39  bytes 4266 (4.2 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 22  bytes 2148 (2.1 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 52  bytes 3820 (3.8 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 52  bytes 3820 (3.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ich hoffe ihr könnt mir helfen. Liebe Grüße Simon

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

Wie sieht die eigentliche Container-Konfiguration aus?

Versuch mal im Container einfach eine IP zu konfigurieren, und den Host anzupingen:

ip addr add 10.107.38.10/24 dev eth0
ping 10.107.38.1

SillySimon

(Themenstarter)

Anmeldungsdatum:
27. August 2018

Beiträge: 8

misterunknown schrieb: Versuch mal im Container einfach eine IP zu konfigurieren, und den Host anzupingen:

ip addr add 10.107.38.10/24 dev eth0
ping 10.107.38.1

hab ich jetzt mal versucht. Ergebnis: der Container hat endlich eine ipv4-Adresse. Wenn ich jedoch versuche den Host anzupingen, weider die gleiche Fehlermeldung:

root@test:~# ping 10.107.38.1
ping: socket: Operation not permitted

und nicht nur das, selbst localhost kann der Container nicht erreichen.

root@test:~# ping ::1
ping: socket: Operation not permitted
root@test:~# ping 127.0.0.1
ping: socket: Operation not permitted

Ich kann den Container vom Host über ipv4 erreichen, ipv6 klappt jedoch nicht:

root@rockserv:~# ping 10.107.38.10
PING 10.107.38.10 (10.107.38.10) 56(84) bytes of data.
64 bytes from 10.107.38.10: icmp_seq=1 ttl=64 time=0.228 ms
64 bytes from 10.107.38.10: icmp_seq=2 ttl=64 time=0.195 ms
^C
--- 10.107.38.10 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.195/0.211/0.228/0.022 ms
root@rockserv:~# ping fe80::216:3eff:fef1:9388
connect: Invalid argument

die Info des Containers ist die folgende

root@rockserv ~# lxc info test
Name: test
Remote: unix://
Architecture: aarch64
Created: 2019/02/21 17:55 UTC
Status: Running
Type: persistent
Profiles: default
Pid: 542
Ips:
  eth0: inet    10.107.38.10    vethHVYJTD
  eth0: inet6   fe80::216:3eff:fef1:9388        vethHVYJTD
  lo:   inet    127.0.0.1
  lo:   inet6   ::1
Resources:
  Processes: 27
  CPU usage:
    CPU usage (in seconds): 44
  Memory usage:
    Memory (current): 195.78MB
    Memory (peak): 214.29MB
  Network usage:
    lo:
      Bytes received: 10.00kB
      Bytes sent: 10.00kB
      Packets received: 132
      Packets sent: 132
    eth0:
      Bytes received: 25.47kB
      Bytes sent: 2.15kB
      Packets received: 199
      Packets sent: 22

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

Das hilft noch nicht wirklich. Zeig mal /var/lib/lxc/test/config.

Dass ein Container unter root nicht pingen darf, hab ich noch nicht gesehen. Ist das ein unprivilegierter Container?

SillySimon

(Themenstarter)

Anmeldungsdatum:
27. August 2018

Beiträge: 8

Zeig mal /var/lib/lxc/test/config.

Das Verzeichnis /var/lib/lxc/ existiert leider nicht, lxc config spuckt auch nichts aus. Ich glaube das Verzeichnis wurde in lxd von lxc in lxd geändert, dort (/var/lib/lxd/containers/test/) konnte ich leider auch nichts finden, was nach config aussieht. Was ein unprivilegierter Container ist weis ich leider nicht. Der Container wurde folgendermaßen erstellt:

als root eingeloggt –> lxc launch ubuntu:18.04 test

auf meinem anderen Rechner funktioniert das immer ohne Probleme.

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

Hm, irgendwo muss es ja eine Konfiguration geben... Mit LXD kenn ich mich nicht so aus, das macht noch einige Sachen anders, gerade im Netzwerk-Bereich.

frechdachs

Anmeldungsdatum:
3. Juni 2013

Beiträge: 120

Hallo SillySimon,

kann es sein, dass der Host ggf. mehrere IP-Adressen hat?

Das war vor einiger Zeit mal bei mir der Fall und hat dazu geführt, dass der Container weder eine IP-Adresse aus dem Internet noch die IP-Adresse vom Host erreichen konnte.

LG, frechdachs

Antworten |