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 28/07/2018, 10:50] beaver |
lxc [Le 29/12/2018, 03:11] 194.71.109.44 [Iptables (utilisation basique) et bridge] |
||
---|---|---|---|
Ligne 55: | Ligne 55: | ||
<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 65: | ||
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 83: | ||
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 104: | ||
</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 126: | ||
<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 167: | Ligne 167: | ||
===== Configuration de LXC pour une utilisation unprivileged ===== | ===== Configuration de LXC pour une utilisation unprivileged ===== | ||
- | 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 **subgid** ainsi que le **subguid** 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 | cat /etc/sub{g,u}id | grep $USER | ||
Ligne 180: | Ligne 180: | ||
Veillez de garder en tête ces deux lignes, maintenant, nous allons devoir stopper les services **lxcfs.service**, **lxc-net.service**, **lxc.service** : | Veillez de garder en tête ces deux lignes, maintenant, nous allons devoir stopper les services **lxcfs.service**, **lxc-net.service**, **lxc.service** : | ||
- | <code bash>sudo systemctl stop lxc*.service</code> | + | <code bash>sudo systemctl stop lxcfs.service lxc-net.service lxc.service</code> |
Veuillez maintenant créer dans le [[wpfr>Fichier_et_répertoire_caché|dossier caché]] **.config/** un dossier portant le nom **lxc** : | Veuillez maintenant créer dans le [[wpfr>Fichier_et_répertoire_caché|dossier caché]] **.config/** un dossier portant le nom **lxc** : | ||
Ligne 206: | Ligne 206: | ||
Maintenant, nous [[:tutoriel:comment_modifier_un_fichier|modifions]] le fichier **lxc-usernet** dans **/etc/lxc**, et on y insère ça : | Maintenant, nous [[:tutoriel:comment_modifier_un_fichier|modifions]] le fichier **lxc-usernet** dans **/etc/lxc**, et on y insère ça : | ||
- | <code bash>nom_de_votre_utilisateur_hôte veth lxcbr0 2</code> | + | <code bash>nom_de_votre_utilisateur_hôte veth lxcbr0 10</code> |
Ou bien dans un [[terminal|terminal]]: | Ou bien dans un [[terminal|terminal]]: | ||
- | <code bash>echo $USER veth lxcbr0 2 | sudo tee --append /etc/lxc/lxc-usernet</code> | + | <code bash>echo $USER veth lxcbr0 10 | sudo tee --append /etc/lxc/lxc-usernet</code> |
[[:tutoriel:comment_modifier_un_fichier|Créons]] maintenant l'emplacement où on va recevoir nos containers LXC, et attribuons y les bonnes [[permissions|permissions]] : | [[:tutoriel:comment_modifier_un_fichier|Créons]] maintenant l'emplacement où on va recevoir nos containers LXC, et attribuons y les bonnes [[permissions|permissions]] : | ||
Ligne 238: | Ligne 238: | ||
<code bash>chmod a+x /home/$USER/</code> | <code bash>chmod a+x /home/$USER/</code> | ||
+ | |||
+ | Ou : | ||
+ | |||
+ | FIXME Dans notre exemple, le sub**u**id est **100000**. Veuillez le remplacer par le votre. Pour le récupérer, veuillez saisir :<code bash>cat /etc/subuid | grep $USER</code> | ||
+ | |||
+ | Et : | ||
+ | |||
+ | <code bash>cd $HOME && sudo setfacl -m u:100000:x . .local .local/share</code> | ||
À ce stade, il est préférable de redémarrer votre machine pour être certain, que les modifications apportées soient effectives : | À ce stade, il est préférable de redémarrer votre machine pour être certain, que les modifications apportées soient effectives : | ||
Ligne 255: | Ligne 263: | ||
<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 271: | Ligne 279: | ||
<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.42 - | + | container_unprivileged STOPPED 0 - 10.0.3.58 - |
</code> | </code> | ||
Ligne 331: | Ligne 339: | ||
<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 379: | Ligne 387: | ||
Ou bien : | Ou bien : | ||
- | <code bash>cd /home/$USER/.local/lxc/nom_de_votre_container/</code> | + | <code bash>sudo -i && cd /home/$USER/.local/lxc/nom_de_votre_container/</code> |
Ensuite, nous utilisons la commande [[tar|tar]] avec son option **--numeric-owner**, qui est ici très importante. Elle va permettre de garder les **uid/gid** intactes lors de l'extraction. Nous utilisons aussi l'outil [[apt>gzip|gzip]] et son option **-9((--best-compression.))**, qui vous offrira, une compression maximale. | Ensuite, nous utilisons la commande [[tar|tar]] avec son option **--numeric-owner**, qui est ici très importante. Elle va permettre de garder les **uid/gid** intactes lors de l'extraction. Nous utilisons aussi l'outil [[apt>gzip|gzip]] et son option **-9((--best-compression.))**, qui vous offrira, une compression maximale. | ||
- | <code bash>export GZIP=-9 tar --numeric-owner -czvf mon_container.tar.gz ./*</code> | + | <code bash>GZIP=-9 tar --numeric-owner -czvf mon_container.tar.gz ./*</code> |
Vous voilà maintenant en possession d'un backup de votre container, passons maintenant à sa restauration. | Vous voilà maintenant en possession d'un backup de votre container, passons maintenant à sa restauration. | ||
Ligne 393: | Ligne 401: | ||
Nous allons devoir stopper les services **lxcfs.service**, **lxc-net.service**, **lxc.service**. Pour se faire, veuillez ouvrir un [[:terminal|terminal]], avec pour contenu : | Nous allons devoir stopper les services **lxcfs.service**, **lxc-net.service**, **lxc.service**. Pour se faire, veuillez ouvrir un [[:terminal|terminal]], avec pour contenu : | ||
- | <code bash>sudo -i && systemctl stop lxc*.service</code> | + | <code bash>sudo -i && systemctl stop lxcfs.service lxc-net.service lxc.service</code> |
Il vous faudra ensuite [[:tutoriel:comment_modifier_un_fichier|créer un dossier]] portant le nom de votre container. | Il vous faudra ensuite [[:tutoriel:comment_modifier_un_fichier|créer un dossier]] portant le nom de votre container. | ||
Ligne 415: | Ligne 423: | ||
C'est terminé, il y'a plus qu'à redémarrer **lxcfs.service**, **lxc-net.service**, **lxc.service** : | C'est terminé, il y'a plus qu'à redémarrer **lxcfs.service**, **lxc-net.service**, **lxc.service** : | ||
- | <code bash>systemctl start lxc*.service && exit</code> | + | <code bash>systemctl start lxcfs.service lxc-net.service lxc.service && exit</code> |
Et démarrer ensuite votre container : | Et démarrer ensuite votre container : | ||
Ligne 429: | Ligne 437: | ||
Nous allons devoir stopper les services **lxcfs.service**, **lxc-net.service**, **lxc.service**. Pour se faire, veuillez ouvrir un [[:terminal|terminal]], avec pour contenu : | Nous allons devoir stopper les services **lxcfs.service**, **lxc-net.service**, **lxc.service**. Pour se faire, veuillez ouvrir un [[:terminal|terminal]], avec pour contenu : | ||
- | <code bash>sudo systemctl stop lxc*.service</code> | + | <code bash>sudo systemctl stop lxcfs.service lxc-net.service lxc.service</code> |
[[:tutoriel:comment_modifier_un_fichier|Créons]] maintenant l'emplacement où on va recevoir notre container LXC, et attribuons y les bonnes [[permissions|permissions]] : | [[:tutoriel:comment_modifier_un_fichier|Créons]] maintenant l'emplacement où on va recevoir notre container LXC, et attribuons y les bonnes [[permissions|permissions]] : | ||
Ligne 450: | Ligne 458: | ||
C'est terminé, il y'a plus qu'à redémarrer **lxcfs.service**, **lxc-net.service**, **lxc.service** : | C'est terminé, il y'a plus qu'à redémarrer **lxcfs.service**, **lxc-net.service**, **lxc.service** : | ||
- | <code bash>sudo systemctl start lxc*.service</code> | + | <code bash>sudo systemctl start lxcfs.service lxc-net.service lxc.service</code> |
Et démarrer ensuite votre container : | Et démarrer ensuite votre container : | ||
Ligne 469: | Ligne 477: | ||
<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 479: | Ligne 487: | ||
<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 486: | Ligne 494: | ||
<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_machine_hôte(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@mysweethome:~$ ip a |grep veth0 | ||
+ | #### 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@mysweethome:~$ 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@mysweethome:~$ 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 -A INPUT -i lxcbr0 -p udp --dport 67:68 --sport 67:68 -j ACCEPT | ||
+ | iptables -A INPUT -i veth0 -p udp --dport 67:68 --sport 67:68 -j ACCEPT | ||
+ | |||
+ | exit 0 | ||
+ | </file> | ||
+ | |||
---- | ---- | ||
===== Voir aussi ===== | ===== Voir aussi ===== | ||
- | * [[https://www.youtube.com/watch?v=caXHwYC3tq8|3 premières minutes de cette vidéo explique ce qu'est lxc]] | + | * [[https://www.youtube.com/watch?v=caXHwYC3tq8|3 premières minutes de cette vidéo explique ce qu'est LXC]] |
- | * [[:LXD]] pour gérer les containers. [[:Docker]] décrit dans la vidéo citée précédemment n'utilise plus lxc. | + | * https://wiki.debian.org/LXC |
+ | * https://wiki.debian.org/EvgeniGolov/LXC | ||
+ | * 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]]. |