Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
lxc [Le 23/12/2018, 20:02] 176.10.99.200 [Iptables (utilisation basique) et bridge] |
lxc [Le 06/05/2022, 01:30] scaph [Restauration de votre backup via tar] |
||
---|---|---|---|
Ligne 18: | Ligne 18: | ||
===== Création de notre premier container LXC (root) ===== | ===== Création de notre premier container LXC (root) ===== | ||
<note warning>Attention, bien que vos processus soient isolés de votre [[wpfr>Hôte_(informatique)|machine hôte]], via ce procédé, votre container [[apt>lxc|LXC]] nécessitera d'utiliser [[:sudo|sudo]] pour être fonctionnel. Si vous avez une faille de sécurité dans votre container, une [[wp>Privilege_escalation|escalade des privilèges]] peut être intenté sur votre container, pour accéder à votre [[wpfr>Hôte_(informatique)|machine hôte]]. L'utilisation de [[:sudo|sudo]] pourrait donc compromettre votre [[wpfr>Hôte_(informatique)|système hôte]] !.</note> | <note warning>Attention, bien que vos processus soient isolés de votre [[wpfr>Hôte_(informatique)|machine hôte]], via ce procédé, votre container [[apt>lxc|LXC]] nécessitera d'utiliser [[:sudo|sudo]] pour être fonctionnel. Si vous avez une faille de sécurité dans votre container, une [[wp>Privilege_escalation|escalade des privilèges]] peut être intenté sur votre container, pour accéder à votre [[wpfr>Hôte_(informatique)|machine hôte]]. L'utilisation de [[:sudo|sudo]] pourrait donc compromettre votre [[wpfr>Hôte_(informatique)|système hôte]] !.</note> | ||
+ | |||
Pour créer un container avec pour nom((Option -n.)) **container_xenial**, pour la distribution((Option -d.)) **Ubuntu**, sous la release((Option -r.)) **Xenial**, ayant une architecture((Option -a.)) **amd64**, nous utiliserons cette commande : | Pour créer un container avec pour nom((Option -n.)) **container_xenial**, pour la distribution((Option -d.)) **Ubuntu**, sous la release((Option -r.)) **Xenial**, ayant une architecture((Option -a.)) **amd64**, nous utiliserons cette commande : | ||
Ligne 55: | Ligne 56: | ||
<code bash>sudo lxc-ls --fancy</code> | <code bash>sudo lxc-ls --fancy</code> | ||
- | <code bash>beaver@home:~$ sudo lxc-ls --fancy | + | <code bash>beaver@mysweethome:~$ sudo lxc-ls --fancy |
NAME STATE AUTOSTART GROUPS IPV4 IPV6 | NAME STATE AUTOSTART GROUPS IPV4 IPV6 | ||
container_xenial STOPPED 0 - 10.0.3.58 - | container_xenial STOPPED 0 - 10.0.3.58 - | ||
- | beaver@home:~$ cat /etc/lxc/default.conf | + | beaver@mysweethome:~$ cat /etc/lxc/default.conf |
lxc.network.type = veth | lxc.network.type = veth | ||
lxc.network.link = lxcbr0 | lxc.network.link = lxcbr0 | ||
Ligne 65: | Ligne 66: | ||
lxc.network.hwaddr = 00:16:3e:xx:xx:xx | lxc.network.hwaddr = 00:16:3e:xx:xx:xx | ||
- | beaver@home:~$ dpkg -l bridge-utils | + | beaver@mysweethome:~$ dpkg -l bridge-utils |
Souhait=inconnU/Installé/suppRimé/Purgé/H=à garder | Souhait=inconnU/Installé/suppRimé/Purgé/H=à garder | ||
| État=Non/Installé/fichier-Config/dépaqUeté/échec-conFig/H=semi-installé/W=attend-traitement-déclenchements | | État=Non/Installé/fichier-Config/dépaqUeté/échec-conFig/H=semi-installé/W=attend-traitement-déclenchements | ||
Ligne 83: | Ligne 84: | ||
On vérifie l'état de notre container : | On vérifie l'état de notre container : | ||
- | <code bash>beaver@home:~$ sudo lxc-ls --fancy | + | <code bash>beaver@mysweethome:~$ sudo lxc-ls --fancy |
NAME STATE AUTOSTART GROUPS IPV4 IPV6 | NAME STATE AUTOSTART GROUPS IPV4 IPV6 | ||
container_xenial RUNNING 0 - 10.0.3.58 - | container_xenial RUNNING 0 - 10.0.3.58 - | ||
Ligne 104: | Ligne 105: | ||
</code> | </code> | ||
- | <code bash>beaver@home:~$ ssh ubuntu@10.0.3.58 | + | <code bash>beaver@mysweethome:~$ ssh ubuntu@10.0.3.58 |
ubuntu@10.0.3.58 password: mot de passe **ubuntu** par défaut. | ubuntu@10.0.3.58 password: mot de passe **ubuntu** par défaut. | ||
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-130-generic x86_64) | Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-130-generic x86_64) | ||
Ligne 126: | Ligne 127: | ||
<code bash> | <code bash> | ||
- | beaver@home:~$ sudo lxc-console -n container_xenial | + | beaver@mysweethome:~$ sudo lxc-console -n container_xenial |
- | [sudo] Mot de passe de beaver : | + | [sudo] Mot de passe de beaver : |
Connected to tty 1 | Connected to tty 1 | ||
Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself | Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself | ||
Ligne 169: | Ligne 170: | ||
Pour pouvoir utiliser [[apt>lxc|LXC]] sans [[sudo|sudo]], et donc par conséquent, minimiser le risque qu'un attaquant arrive à avoir accès à votre [[wpfr>Hôte_(informatique)|hôte système]] à cause de l'utilisation de [[sudo|sudo]], nous allons déjà récupérer le sub**g**id ainsi que le subg**u**id de notre utilisateur courant : | Pour pouvoir utiliser [[apt>lxc|LXC]] sans [[sudo|sudo]], et donc par conséquent, minimiser le risque qu'un attaquant arrive à avoir accès à votre [[wpfr>Hôte_(informatique)|hôte système]] à cause de l'utilisation de [[sudo|sudo]], nous allons déjà récupérer le sub**g**id ainsi que le subg**u**id de notre utilisateur courant : | ||
<code bash> | <code bash> | ||
- | cat /etc/sub{g,u}id | grep $USER | + | grep -h $USER /etc/sub{g,u}id |
</code> | </code> | ||
Ligne 263: | Ligne 264: | ||
<code bash> | <code bash> | ||
- | beaver@home:~$ lxc-create -t download -n container_unprivileged -- -d ubuntu -r xenial -a amd64 | + | beaver@mysweethome:~$ lxc-create -t download -n container_unprivileged -- -d ubuntu -r xenial -a amd64 |
Using image from local cache | Using image from local cache | ||
Unpacking the rootfs | Unpacking the rootfs | ||
Ligne 279: | Ligne 280: | ||
<code bash>lxc-ls --fancy</code> | <code bash>lxc-ls --fancy</code> | ||
- | <code bash>beaver@home:~$ lxc-ls --fancy | + | <code bash>beaver@mysweethome:~$ lxc-ls --fancy |
NAME STATE AUTOSTART GROUPS IPV4 IPV6 | NAME STATE AUTOSTART GROUPS IPV4 IPV6 | ||
container_unprivileged STOPPED 0 - 10.0.3.58 - | container_unprivileged STOPPED 0 - 10.0.3.58 - | ||
</code> | </code> | ||
- | Vous noterez qu'il y'a ni mot de passe attribué, ni rien, impossible donc de se connecter à notre container **container_unprivileged** ni via la méthode [[ssh|ssh]], ni via la méthode **lxc-console**. Voici un moyen pour attribuer un mot de passe à l'utilisateur **ubuntu**. Nous allons déjà démarrer notre container fraîchement installé : | + | Vous noterez qu'il n'y a ni mot de passe attribué, ni rien, impossible donc de se connecter à notre container **container_unprivileged** ni via la méthode [[ssh|ssh]], ni via la méthode **lxc-console**. Voici un moyen pour attribuer un mot de passe à l'utilisateur **ubuntu**. Nous allons déjà démarrer notre container fraîchement installé : |
<code bash>lxc-start -n container_unprivileged</code> | <code bash>lxc-start -n container_unprivileged</code> | ||
Ligne 339: | Ligne 340: | ||
<code bash> | <code bash> | ||
- | beaver@home:~$ lxc-console -n container_unprivileged | + | beaver@mysweethome:~$ lxc-console -n container_unprivileged |
Connected to tty 1 | Connected to tty 1 | ||
Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself | Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself | ||
Ligne 421: | Ligne 422: | ||
<code bash>tar --numeric-owner -xzvf mon_container.tar.gz</code> | <code bash>tar --numeric-owner -xzvf mon_container.tar.gz</code> | ||
- | C'est terminé, il y'a plus qu'à redémarrer **lxcfs.service**, **lxc-net.service**, **lxc.service** : | + | C'est terminé, il n'y a plus qu'à redémarrer **lxcfs.service**, **lxc-net.service**, **lxc.service** : |
<code bash>systemctl start lxcfs.service lxc-net.service lxc.service && exit</code> | <code bash>systemctl start lxcfs.service lxc-net.service lxc.service && exit</code> | ||
Ligne 431: | Ligne 432: | ||
=== Pour une utilisation unprivileged === | === Pour une utilisation unprivileged === | ||
- | <note tip>Nous aborderons ici, que la restauration de votre backup précédemment créé. | + | <note tip>Nous n'aborderons ici, que la restauration de votre backup précédemment créé. |
Pour la configuration d'un container [[apt>lxc|LXC]] **unprivileged**, merci de suivre le chapitre [[lxc#configuration_de_lxc_pour_une_utilisation_unprivileged|configuration de lxc pour une utilisation unprivileged]]. | Pour la configuration d'un container [[apt>lxc|LXC]] **unprivileged**, merci de suivre le chapitre [[lxc#configuration_de_lxc_pour_une_utilisation_unprivileged|configuration de lxc pour une utilisation unprivileged]]. | ||
</note> | </note> | ||
Ligne 456: | Ligne 457: | ||
<code bash>tar --numeric-owner -xzvf mon_container.tar.gz</code> | <code bash>tar --numeric-owner -xzvf mon_container.tar.gz</code> | ||
- | C'est terminé, il y'a plus qu'à redémarrer **lxcfs.service**, **lxc-net.service**, **lxc.service** : | + | C'est terminé, il n'y a plus qu'à redémarrer **lxcfs.service**, **lxc-net.service**, **lxc.service** : |
<code bash>sudo systemctl start lxcfs.service lxc-net.service lxc.service</code> | <code bash>sudo systemctl start lxcfs.service lxc-net.service lxc.service</code> | ||
Ligne 477: | Ligne 478: | ||
<code bash>sudo((container unprivileged ou non ?)) lxc-snapshot -n nom_de_mon_container</code> | <code bash>sudo((container unprivileged ou non ?)) lxc-snapshot -n nom_de_mon_container</code> | ||
- | <code bash>beaver@home:~$ sudo lxc-snapshot -n container_xenial | + | <code bash>beaver@mysweethome:~$ sudo lxc-snapshot -n container_xenial |
lxc-snapshot: lxccontainer.c: do_lxcapi_snapshot: 3405 Snapshot of directory-backed container requested. | lxc-snapshot: lxccontainer.c: do_lxcapi_snapshot: 3405 Snapshot of directory-backed container requested. | ||
lxc-snapshot: lxccontainer.c: do_lxcapi_snapshot: 3406 Making a copy-clone. If you do want snapshots, then | lxc-snapshot: lxccontainer.c: do_lxcapi_snapshot: 3406 Making a copy-clone. If you do want snapshots, then | ||
Ligne 487: | Ligne 488: | ||
<code bash>sudo((container unprivileged ou non?)) lxc-snapshot -L -n nom_de_mon_container</code> | <code bash>sudo((container unprivileged ou non?)) lxc-snapshot -L -n nom_de_mon_container</code> | ||
- | <code bash>beaver@home:~$ sudo lxc-snapshot -L -n container_xenial | + | <code bash>beaver@mysweethome:~$ sudo lxc-snapshot -L -n container_xenial |
snap0 (/var/lib/lxc/container_xenial/snaps) 2018:07:28 10:25:48 | snap0 (/var/lib/lxc/container_xenial/snaps) 2018:07:28 10:25:48 | ||
</code> | </code> | ||
Ligne 494: | Ligne 495: | ||
<code bash>sudo((container unprivileged ou non?)) lxc-snapshot -r snapX -n nom_de_mon_container</code> | <code bash>sudo((container unprivileged ou non?)) lxc-snapshot -r snapX -n nom_de_mon_container</code> | ||
- | |||
- | ===== Iptables (utilisation basique) et bridge ===== | ||
- | |||
- | Vous trouverez ici, une esquisse d'un script [[:iptables]], pour faire fonctionner votre container LXC. Il est bien entendu à ajouter aux règles que **vous avez déjà**, et à exécuter depuis votre [[wpfr>Hôte_(informatique)|machine hôte]] !. Cette esquisse est surtout utile si vous avez **un [[wpfr>Pare-feu_(informatique)|firewall]] d'actif**((8-).)), sinon((m(:-X.)), vous devez juste activer le port forwarding((echo 1 > /proc/sys/net/ipv4/ip_forward)), et **configurer le fichier lxc-net comme ci-bas**. Nous noterons aussi, que nous pouvons encore être plus restrictif, mais cette configuration semble adéquate pour un [[wpfr>Luser|profane]]((Et c'est pas péjoratif ce script est qu'une ébauche.)). | ||
- | |||
- | Nous devons aussi, absolument [[:installation_logiciel|installer le package]] [[apt>dnsmasq-base]], qui est, logiquement déjà installé sur votre machine. Et ensuite configurer LXC pour qu'il utilise la technologie [[wpfr>Pont_(réseau)|bridge]]. | ||
- | |||
- | Veuillez [[:tutoriel:comment_modifier_un_fichier|éditer le fichier]] **/etc/default/lxc-net**, pour avoir comme résultat final : | ||
- | |||
- | <code> | ||
- | USE_LXC_BRIDGE="true" | ||
- | </code> | ||
- | |||
- | Nous devons ensuite redémarrer notre service **lxc-net** : | ||
- | |||
- | <code>sudo systemctl restart lxc-net</code> | ||
- | |||
- | Pour vérifier que tout est ok : | ||
- | |||
- | <code>ip -4 -o a show lxcbr0</code> | ||
- | Retournera par exemple : | ||
- | <code> | ||
- | 3: lxcbr0 inet 10.0.3.1/24 scope global lxcbr0\ valid_lft forever preferred_lft forever | ||
- | </code> | ||
- | |||
- | Et voici le script [[:iptables]] : | ||
- | |||
- | <file bash iptables_lxc> | ||
- | #!/bin/bash | ||
- | ## Créé par BeAvEr. | ||
- | ### Merci d'utiliser FIXME au sein du dokuwiki francophone Ubuntu au besoin, | ||
- | ### ou d'apporter votre contribution sur ce script, ici même. | ||
- | #### Merci de garder un aspect "humain" au script. | ||
- | ##### Le tout étant d'avoir juste les règles basiques, pour qu'un Luser/Profane/Néophyte, puisse utiliser LXC | ||
- | ##### de manière **"relativement"** sécurisé. | ||
- | ##### (Pouvoir ping, apt-update, et cetera, et dans cet ordre là, depuis son container, pas plus). | ||
- | |||
- | # Nous activons le port forwarding, pour pouvoir communiquer à l'intérieur de notre container. | ||
- | |||
- | echo 1 > /proc/sys/net/ipv4/ip_forward | ||
- | |||
- | # Règles iptables. | ||
- | ## Dans notre exemple, **veth0** est le nom de notre interface pour notre container. | ||
- | ### Pour pouvoir spécifier le nom d'une interface, merci de renseigner votre fichier **config** | ||
- | ### de **votre container**, avec l'option -> lxc.network.name = veth0. | ||
- | |||
- | #### beaver@nom_de_mon_container:~$ ip a |grep veth | ||
- | #### 7: veth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 | ||
- | #### link/ether xx:xx:xx:xx:e8:a7 brd ff:ff:ff:ff:ff:ff link-netnsid 0 | ||
- | |||
- | #### beaver@nom_de_mon_container:~$ ip a |grep eth | ||
- | #### 5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 | ||
- | #### inet 10.0.x.x/24 brd 10.0.X.255 scope global eth0 | ||
- | |||
- | #### beaver@nom_de_mon_container:~$ ip a |grep lxcbr0 | ||
- | #### 4: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 | ||
- | #### inet 10.0.x.1/24 scope global lxcbr0 | ||
- | |||
- | #### LXC | ||
- | iptables -A FORWARD -i veth0 -o eth0 -j ACCEPT | ||
- | iptables -A FORWARD -i lxcbr0 -o eth0 -j ACCEPT | ||
- | iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE | ||
- | iptables -t nat -A POSTROUTING -o lxcbr0 -j MASQUERADE | ||
- | iptables -A FORWARD -s 10.0.3.0/24 -o eth0 -j ACCEPT | ||
- | iptables -A FORWARD -d 10.0.3.0/24 -o lxcbr0 -j ACCEPT | ||
- | |||
- | #### dnsmasq-dhcp DHCPDISCOVER(lxcbr0) | ||
- | ### sudo systemctl status lxc-net : | ||
- | ### beaver.st dnsmasq-dhcp[479]: DHCPDISCOVER(lxcbr0) 10.0.3.58 00:16:3e:44:f4:05 | ||
- | ### beaver.st dnsmasq-dhcp[479]: DHCPOFFER(lxcbr0) 10.0.3.58 00:16:3e:44:f4:05 | ||
- | ### beaver.st dnsmasq-dhcp[479]: DHCPREQUEST(lxcbr0) 10.0.3.58 00:16:3e:44:f4:05 | ||
- | ### beaver.st dnsmasq-dhcp[479]: DHCPACK(lxcbr0) 10.0.3.58 00:16:3e:44:f4:05 nom_de_mon_container | ||
- | ### lxc-ls --fancy | ||
- | ### NAME STATE AUTOSTART GROUPS IPV4 IPV6 | ||
- | ### nom_de_mon_container RUNNING 0 - 10.0.3.58 - | ||
- | |||
- | iptables -I INPUT -i lxcbr0 -p udp --dport 67:68 --sport 67:68 -j ACCEPT | ||
- | |||
- | exit 0 | ||
- | </file> | ||
- | |||
---- | ---- | ||
Ligne 583: | Ligne 503: | ||
* https://wiki.debian.org/EvgeniGolov/LXC | * https://wiki.debian.org/EvgeniGolov/LXC | ||
* https://askubuntu.com/questions/340055/lxc-container-no-outgoing-traffic | * https://askubuntu.com/questions/340055/lxc-container-no-outgoing-traffic | ||
+ | * https://lxc-webpanel.github.io/ | ||
---- | ---- | ||
Contributeur(s): [[:utilisateurs:beaver|BeAvEr]]. | Contributeur(s): [[:utilisateurs:beaver|BeAvEr]]. |