Diferencia entre revisiones de «LXD per a SX»
Línea 65: | Línea 65: | ||
Dins del container cal fer algunes coses: | Dins del container cal fer algunes coses: | ||
* | * Reconfigurar openssh-server per permetre entrar amb contrasenya per SSH, ('''PasswordAuthentication yes''') | ||
* Donar password a ubuntu per poder accedir per | * Donar password a ubuntu per poder accedir per SSH. (Els containers d'ubuntu tenen un usuari anomenat ubuntu que és sudoer però que no té contrasenya) | ||
* Crear els containers: | * Crear els containers: | ||
** Fer | ** Fer una xarxa interna sols accesible per els containers de dins. (lxc network create br0 ipv4.address=none ipv6.address=none) | ||
** Fer que el client tinga sols el pont i el servidor una en el br0 i l'altra en lxdbr0 | ** Fer que el client tinga sols el pont i el servidor una en el br0 i l'altra en lxdbr0 (lxc network attach br0 client eth1 eth1) | ||
D'aquesta manera, cada alumne entra per ssh a un container, canvia la contrasenya de ubuntu i té disponible una configuració de dos containers dins del seu o pot configurar el que necessite. | D'aquesta manera, cada alumne entra per ssh a un container, canvia la contrasenya de ubuntu i té disponible una configuració de dos containers dins del seu o pot configurar el que necessite. | ||
Línea 79: | Línea 79: | ||
Al copiar un contenidor la MAC és modificada, però no la dels contenidors que conté. Si algú està en macvlan, pot donar problemes. Cal especificar manualment la MAC dels contenidors interns una vegada copiat en de l'alumne. | Al copiar un contenidor la MAC és modificada, però no la dels contenidors que conté. Si algú està en macvlan, pot donar problemes. Cal especificar manualment la MAC dels contenidors interns una vegada copiat en de l'alumne. | ||
<pre class="code"> | <pre class="code"> | ||
# for i in {1.. | # for i in {1..15}; do lxc exec alumne$i -- lxc config set firewall volatile.wan.hwaddr 00:16:3e:e7:ba:$((10+$i)); done | ||
</pre> | </pre> | ||
'''Avís''' | '''Avís''' | ||
Cal pensar que són 15x2 + 15 = 45 contenidors en total els que té que suportar el servidor. Pot ser interessant fer un sleep en el for d'arrancar-los tots per donar temps a que es configuren totalment. L'arranc total pot durar uns minuts en els que els disc dur té molt de treball. Una vegada en marxa tot funciona perfectament. El coll de botella és el disc dur. El meu servidor és un | Cal pensar que són 15x2 + 15 = 45 contenidors en total els que té que suportar el servidor. Pot ser interessant fer un sleep en el for d'arrancar-los tots per donar temps a que es configuren totalment. L'arranc total pot durar uns minuts en els que els disc dur té molt de treball. Una vegada en marxa tot funciona perfectament. El coll de botella és el disc dur. El meu servidor és un i3 amb 16GB de RAM | ||
{{nota|Un altre problema és que els contenidors Ubuntu venen amb el '''unattended upgrades'''. Caldria desinstal·lar-lo}} | {{nota|Un altre problema és que els contenidors Ubuntu venen amb el '''unattended upgrades'''. Caldria desinstal·lar-lo}} | ||
<pre class="code"> | |||
Pot ser que els contenidors no poden ser accedits per SSH. Cal modificar la contrasenya | for i in {1..15}; do lxc exec alumne$i -- lxc exec server1 -- apt remove -y unattended-upgrades ; done | ||
</pre> | |||
Pot ser que els contenidors no poden ser accedits per SSH. Cal modificar la contrasenya d'ubuntu, el fitxer de ssh i reiniciar el servei. | |||
<pre class="code"> | <pre class="code"> | ||
# for i in {1..24}; do lxc file push shadow simulacre$i/etc/shadow; done | # for i in {1..24}; do lxc file push shadow simulacre$i/etc/shadow; done |
Revisión del 11:02 18 feb 2019
Amb la tecnologia LXD es pot configurar un servidor que proporcione un entorn virtual per a fer pràctiques. Una forma de fer-ho ràpidament pot ser amb Proxmox. Aquest manual és per fer-ho sols amb LXD en un Ubuntu 16.04.
El cas (real) que ens ocupa tracta de crear un servidor per a una classe de 15 alumnes per a que practiquen en Servicis en Xarxa. Es tracta de provar DHCP, DNS i altres servidors i clients. Cada alumne té accés a 2 contenidors prèviament configurats per a que tinguen l'estructura de xarxa típica de client servidor. Ells els controlen totalment, però no poden accedir als dels companys.
Configuració del servidor
Abans de tot, cal configurar el servidor correctament segons aquest manual.
En /etc/security/limits.conf:
* soft nofile 1048576 * hard nofile 1048576 root soft nofile 1048576 root hard nofile 1048576 * soft memlock unlimited * hard memlock unlimited
En /etc/sysctrl.conf:
fs.inotify.max_queued_events=1048576 fs.inotify.max_user_instances=1048576 fs.inotify.max_user_watches=1048576 vm.max_map_count=262144
Configurar ZFS
Anem a configurar ZFS per a fer un Striped Mirrored VDEVs que és similar a un RAID10, ja que volem rendiment i seguretat.
# zpool create lxczfs mirror /dev/disk/by-id/wwn-0x5000c5007d44d0b1 /dev/disk/by-id/wwn-0x50014ee2b1d33221 # zpool add lxczfs mirror /dev/disk/by-id/wwn-0x50014ee2b1d33236 /dev/disk/by-id/wwn-0x5000c5007d44b288
Amb aquests comandaments hem creat dos mirrors i els hem unit en un raid0 entre ells.
Podem mirar l'estatus del ZFS:
pool: lxczfs state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM lxczfs ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 wwn-0x5000c5007d44d0b1 ONLINE 0 0 0 wwn-0x50014ee2b1d33221 ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 wwn-0x50014ee2b1d33236 ONLINE 0 0 0 wwn-0x5000c5007d44b288 ONLINE 0 0 0 errors: No known data errors
A continuació, cal iniciar lxd:
# lxd init # Se configura amb quasi tot per defecte (Si pot ser en zfs en raid, millor) # lxc launch ubuntu:16.04 plantillla -c security.nesting=true # lxc config edit plantilla # Es canvia la eth0 de bridged a macvlan amb la targeta del server (també es pot fer el mateix en 'profiles').
Dins del container cal fer algunes coses:
- Reconfigurar openssh-server per permetre entrar amb contrasenya per SSH, (PasswordAuthentication yes)
- Donar password a ubuntu per poder accedir per SSH. (Els containers d'ubuntu tenen un usuari anomenat ubuntu que és sudoer però que no té contrasenya)
- Crear els containers:
- Fer una xarxa interna sols accesible per els containers de dins. (lxc network create br0 ipv4.address=none ipv6.address=none)
- Fer que el client tinga sols el pont i el servidor una en el br0 i l'altra en lxdbr0 (lxc network attach br0 client eth1 eth1)
D'aquesta manera, cada alumne entra per ssh a un container, canvia la contrasenya de ubuntu i té disponible una configuració de dos containers dins del seu o pot configurar el que necessite.
Una vegada tot configurat, es paren els containers de dins i el container plantilla. Després es copia la plantilla:
# for n in {1..15}; do echo "Copiant $n"; lxc copy plantilla alumne$n; done
Aquest for es pot utilitzar després per iniciar-los tots o parar-los. Al copiar un contenidor la MAC és modificada, però no la dels contenidors que conté. Si algú està en macvlan, pot donar problemes. Cal especificar manualment la MAC dels contenidors interns una vegada copiat en de l'alumne.
# for i in {1..15}; do lxc exec alumne$i -- lxc config set firewall volatile.wan.hwaddr 00:16:3e:e7:ba:$((10+$i)); done
Avís Cal pensar que són 15x2 + 15 = 45 contenidors en total els que té que suportar el servidor. Pot ser interessant fer un sleep en el for d'arrancar-los tots per donar temps a que es configuren totalment. L'arranc total pot durar uns minuts en els que els disc dur té molt de treball. Una vegada en marxa tot funciona perfectament. El coll de botella és el disc dur. El meu servidor és un i3 amb 16GB de RAM
for i in {1..15}; do lxc exec alumne$i -- lxc exec server1 -- apt remove -y unattended-upgrades ; done
Pot ser que els contenidors no poden ser accedits per SSH. Cal modificar la contrasenya d'ubuntu, el fitxer de ssh i reiniciar el servei.
# for i in {1..24}; do lxc file push shadow simulacre$i/etc/shadow; done # for i in {1..24}; do lxc exec simulacre$i -- sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config; done # for i in {1..24}; do lxc exec simulacre$i -- service sshd restart; done
Exemple de cóm queda:
lliurex@2smxv:~$ lxc list +----------+---------+--------------------------------+--------------------------------------------+------------+-----------+ | NOMBRE | ESTADO | IPV4 | IPV6 | TIPO | SNAPSHOTS | +----------+---------+--------------------------------+--------------------------------------------+------------+-----------+ | alumne1 | RUNNING | 192.168.66.1 (br0) | fd62:5f40:e210:0:216:3eff:fe31:1c2d (eth0) | PERSISTENT | 0 | | | | 192.168.0.218 (eth0) | | | | | | | 10.235.78.1 (lxdbr0) | | | | +----------+---------+--------------------------------+--------------------------------------------+------------+-----------+ | alumne10 | RUNNING | 192.168.66.1 (br0) | fd62:5f40:e210:0:216:3eff:fe67:f1f7 (eth0) | PERSISTENT | 0 | | | | 192.168.0.227 (eth0) | | | | +----------+---------+--------------------------------+--------------------------------------------+------------+-----------+ | alumne11 | RUNNING | 192.168.66.1 (br0) | fd62:5f40:e210:0:216:3eff:feb9:a80c (eth0) | PERSISTENT | 0 | | | | 192.168.0.228 (eth0) | | | | +----------+---------+--------------------------------+--------------------------------------------+------------+-----------+ | alumne12 | RUNNING | 192.168.66.1 (br0) | fd62:5f40:e210:0:216:3eff:fecc:e507 (eth0) | PERSISTENT | 0 | | | | 192.168.0.232 (eth0) | | | | +----------+---------+--------------------------------+--------------------------------------------+------------+-----------+ | alumne13 | RUNNING | 192.168.66.1 (br0) | fd62:5f40:e210:0:216:3eff:feee:768d (eth0) | PERSISTENT | 0 | | | | 192.168.0.229 (eth0) | | | | +----------+---------+--------------------------------+--------------------------------------------+------------+-----------+ | alumne14 | RUNNING | 192.168.66.1 (br0) | fd62:5f40:e210:0:216:3eff:fe95:14d0 (eth0) | PERSISTENT | 0 | | | | 192.168.0.230 (eth0) | | | | +----------+---------+--------------------------------+--------------------------------------------+------------+-----------+ | alumne15 | RUNNING | 192.168.66.1 (br0) | fd62:5f40:e210:0:216:3eff:fe60:cc7c (eth0) | PERSISTENT | 0 | | | | 192.168.0.231 (eth0) | | | | | | | 10.235.78.1 (lxdbr0) | | | | +----------+---------+--------------------------------+--------------------------------------------+------------+-----------+ | alumne2 | RUNNING | 192.168.66.1 (br0) | fd62:5f40:e210:0:216:3eff:fe21:6a76 (eth0) | PERSISTENT | 0 | | | | 192.168.0.219 (eth0) | | | | +----------+---------+--------------------------------+--------------------------------------------+------------+-----------+ | alumne3 | RUNNING | 192.168.66.1 (br0) | fd62:5f40:e210:0:216:3eff:fe6b:7f64 (eth0) | PERSISTENT | 0 | | | | 192.168.0.220 (eth0) | | | | +----------+---------+--------------------------------+--------------------------------------------+------------+-----------+ | alumne4 | RUNNING | 192.168.66.1 (br0) | fd62:5f40:e210:0:216:3eff:fec2:86ea (eth0) | PERSISTENT | 0 | | | | 192.168.0.221 (eth0) | | | | +----------+---------+--------------------------------+--------------------------------------------+------------+-----------+ | alumne5 | RUNNING | 192.168.0.222 (eth0) | fd62:5f40:e210:0:216:3eff:fe9c:f3aa (eth0) | PERSISTENT | 0 | | | | 192.168.66.1 (br0) | | | | +----------+---------+--------------------------------+--------------------------------------------+------------+-----------+ | alumne6 | RUNNING | 192.168.66.1 (br0) | fd62:5f40:e210:0:216:3eff:fe16:bea4 (eth0) | PERSISTENT | 0 | | | | 192.168.0.223 (eth0) | | | | +----------+---------+--------------------------------+--------------------------------------------+------------+-----------+ | alumne7 | RUNNING | 192.168.66.1 (br0) | fd62:5f40:e210:0:216:3eff:fe73:c391 (eth0) | PERSISTENT | 0 | | | | 192.168.0.224 (eth0) | | | | | | | 10.235.78.1 (lxdbr0) | | | | +----------+---------+--------------------------------+--------------------------------------------+------------+-----------+ | alumne8 | RUNNING | 192.168.66.1 (br0) | fd62:5f40:e210:0:216:3eff:fe90:163e (eth0) | PERSISTENT | 0 | | | | 192.168.0.225 (eth0) | | | | +----------+---------+--------------------------------+--------------------------------------------+------------+-----------+ | alumne9 | RUNNING | 10.235.78.1 (lxdbr0) | fd62:5f40:e210:0:216:3eff:feaa:d8 (eth0) | PERSISTENT | 0 | | | | 192.168.66.1 (br0) | | | | | | | 192.168.0.226 (eth0) | | | | +----------+---------+--------------------------------+--------------------------------------------+------------+-----------+ | plantilla| STOPPED | | | PERSISTENT | 0 | +----------+---------+--------------------------------+--------------------------------------------+------------+-----------+
Script per gestionar targetes:
(Obsolet, no l'esborre perquè té comandaments interessants, però en LXD 2.5 ja es poden fer les coses més fàcils i en Ubuntu 18.04 utilitza Netplan)
Scripts per a crear xarxes completes
(Scripts amb parts obsoletes)
Projecte 2017
Exemple
Exercici1
Exercici2
Simulacre
Script 2018
(El més actualitzat)
Script per a generar un mapa de la xarxa:
#!/bin/bash
echo 'digraph {
graph [pad="0.5", nodesep="0.5", ranksep="2", splines=ortho,];
node [shape=none]
rankdir=LR;'
bridges=($(brctl show | tail -n +2 |cut -f1 | tr "\n" " "))
for i in ${bridges[@]}
do
echo "$i [label=\"$i\" shape=box];"
done
containers=($(lxc list | egrep '(STOPPED|RUNNING)' | cut -d" " -f2 | tr "\n" " "))
xarxes="$(lxc list --format json | jq -r '.[] | {container: .name, dev: .expanded_devices[]} | [.container,.dev.name,.dev.parent,.dev.type] | @csv' | grep '"nic"$')"
relations=""
for i in ${containers[@]}
do
pc="$i [label=<<table border=\"0\" cellborder=\"1\" cellspacing=\"0\"><tr><td bgcolor=\"#CCCCCC\" >$i</td></tr>"
while read dev
do
nom=$(echo $dev | cut -d "," -f2 | tr -d '"')
switch=$(echo $dev | cut -d"," -f3 | tr -d '"')
pc=$pc"<tr><td port=\"$nom\">$nom</td></tr>"
#La IP
ip=$(lxc info $i | tr "\t" " " | grep "$nom: inet " | tr -s " " | cut -d" " -f4)
relations=$relations"$switch -> $i:$nom [dir=none headlabel=\"$ip\"] \n"
relations=$relations"//$i:$nom -> $switch [dir=none taillabel=\"$ip\"] \n"
done <<< "$(echo "$xarxes" | grep "$i")"
pc=$pc"</table>>];"
echo $pc
done
echo -e "$relations"
echo '}'