Control Aula

De Jose Castillo Aliaga
Ir a la navegación Ir a la búsqueda

Visió General

El servidor soluciona les següents qüestions:

  • Aïllar l’aula per evitar problemes de configuració durant les pràctiques i evitar atacs.
  • Fer de proxy i limitar el tràfic de xarxa.
  • Limitar el nombre de IPs que ha de donar el zentyal central.
  • Poder tallar l’accés a Internet per IP o a tota l’aula.
  • Donar IPs estàtiques a les màquines de l’aula.
  • Monitoritzar millor els ordinadors clients i l’aula en general.

El Server proporciona IPs internes en el rang 192.168.<n rack>.0/24

Xarxaaules.png

El gw dona servei de DHCP, DNS, port d'enllaç i administració de la xarxa. Aquest reeenvia a gwlent les peticions dels alumnes que no siguen per al moodle i altres. El professor, per un altra banda, va per el gwrapid.

Pas per pas

  • Instal·lar Ubuntu server
 # apt update && apt upgrade
  • El servidor té 3 targetes de xarxa. Cal configurar la de dins de l'aula com a 192.168.aula.250
  • La targeta externa serà assignada per Zentyal encara que no és precís que siga una fixa.
  • Crear el container LXD que fa de gw.
# lxd init
# lxc profile create xarxa
# lxc profile edit xarxa
name: xarxa
config: {}
description: ""
devices:
  eth0:
    name: eth0
    nictype: macvlan
    parent: enp0s3
    type: nic
  eth1:
    name: eth1
    nictype: macvlan
    parent: enp0s8
    type: nic
  eth2:
    name: eth2
    nictype: macvlan
    parent: enp0s3
    type: nic
# lxc launch ubuntu:16.04 gw --profile=xarxa
  • Entrar dins i fer-lo porta d'enllaç. Aquest container servirà com a plantilla per als altres dos. Per tant, cal fer-lo porta d'enllaç abans de fer-lo servidor dhcp i la resta de coses.
    • La seua IP de eth1: 192.168.aula.254. La de fora serà per Zentyal, pot ser fixa o no.
    • Actualitzar.
    • Descomentar en /etc/sysctrl.conf el ipv4 forward.
    • Aplicar les IPtables:
root@gw:~# iptables -A INPUT --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
root@gw:~# iptables -A FORWARD --in-interface eth0 --out-interface eth1 -j ACCEPT
root@gw:~# iptables -A FORWARD --in-interface eth1 --out-interface eth0 -j ACCEPT
root@gw:~# iptables -t nat  -A POSTROUTING --out-interface eth0 -j MASQUERADE
root@gw:~# iptables-save > /etc/iptables/rules.v4
root@gw:~# apt install iptables-persistent

Estat actual de les rules.v4:

* Buidar la cau apt# Generated by iptables-save v1.6.0 on Fri Dec  2 17:21:05 2016
*nat
:PREROUTING ACCEPT [2436:404058]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [15:4135]
:POSTROUTING ACCEPT [11:3608]
-A POSTROUTING -o eth0 -j MASQUERADE
-A POSTROUTING -o eth2 -j MASQUERADE
COMMIT
# Completed on Fri Dec  2 17:21:05 2016
# Generated by iptables-save v1.6.0 on Fri Dec  2 17:21:05 2016
*mangle
:PREROUTING ACCEPT [1050664964:285226141160]
:INPUT ACCEPT [810295182:141593723917]
:FORWARD ACCEPT [129387725:125975609719]
:OUTPUT ACCEPT [116958:24050108]
:POSTROUTING ACCEPT [129500127:125999353122]
COMMIT
# Completed on Fri Dec  2 17:21:05 2016
# Generated by iptables-save v1.6.0 on Fri Dec  2 17:21:05 2016
*raw
:PREROUTING ACCEPT [1050664964:285226141160]
:OUTPUT ACCEPT [116958:24050108]
COMMIT
# Completed on Fri Dec  2 17:21:05 2016
# Generated by iptables-save v1.6.0 on Fri Dec  2 17:21:05 2016
*security
:INPUT ACCEPT [94621:17898130]
:FORWARD ACCEPT [129383169:125975303014]
:OUTPUT ACCEPT [116958:24050108]
COMMIT
# Completed on Fri Dec  2 17:21:05 2016
# Generated by iptables-save v1.6.0 on Fri Dec  2 17:21:05 2016
*filter
:INPUT DROP [810142958:141568219021]
:FORWARD ACCEPT [28386:19835253]
:OUTPUT ACCEPT [11963:1874703]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8000 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3000 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A FORWARD -i eth0 -o eth1 -j ACCEPT
-A FORWARD -i eth1 -o eth0 -j ACCEPT
-A FORWARD -i eth2 -o eth1 -j ACCEPT
-A FORWARD -i eth1 -o eth2 -j ACCEPT
COMMIT
# Completed on Fri Dec  2 17:21:05 2016
root@gw:~# apt clean && apt autoclean
  • Clonar el container per crear el ràpid i el lent, els deixem ahí per tornar després:
lliurex@srv:~$ lxc copy gw gwpreferent
lliurex@srv:~$ lxc copy gw gwlent
  • Tornar a entrar al gw principal per instal·lar la resta de serveis:
root@gw:~# apt install isc-dhcp-server
 
ddns-update-style none;
option domain-name "aula.net";
option domain-name-servers 10.20.0.1;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;

subnet 192.168.9.0 netmask 255.255.255.0 {
  range 192.168.9.150 192.168.9.199;
  option subnet-mask 255.255.255.0;
  option routers 192.168.9.254;
}

root@gw:~# nano /etc/default/isc-dhcp-server     # recordar indicar eth1 en interfaces

root@gw:~# wget -O- https://raw.github.com/ajenti/ajenti/1.x/scripts/install-ubuntu.sh | sudo sh
Now start Ajenti with 'service ajenti restart'
Ajenti will listen on HTTPS port 8000 by default

Default username : root
Default password : admin
# Cal canviar el passwd.

  • Registre de clients
root@gw:~# apt install nmap

Cal executar aquest script

El resultat és la configuració de IPs fixes als clients i de la porta d'enllaç ràpida per al professor si li donem la IP acabada en 100.

Fer que arranquen a l'inici del sistema:

lliurex@srv:~$ lxc config set gw boot.autostart 1
lliurex@srv:~$ lxc config set gwlent boot.autostart 1
lliurex@srv:~$ lxc config set gwpreferent boot.autostart 1

Fer que els gwlent i rapid confien en el gw servidor (fer prèviament la key en ssh-keygen):

lxc exec gw -- cat /root/.ssh/id_rsa.pub > authorized_keys
lxc file push authorized_keys /root/.ssh/
lxc exec gwlent -- chown root:root /root/.ssh/authorized_keys

Control de la velocitat

Per evitar que carreguen la xarxa sols amb youtube podem utilitzar wondershaper. Aquest són els pasos:

  • En el DHCP s'indica que el professor té com a router el gw preferent. Això és la configuració prèvia feta en l'script anterior.
  • En el DHCP s'indica que el router de la resta és el .254
  • Aquest ha de tindre como a porta per defecte la eth2. Mentres que la eth0 queda sols per al moodle.

El comandament per defecte pot ser:

ip route change default via 10.20.0.1 dev eth2

per a que es quede encara que reiniciem, en /etc/network/interfaces:

auto eth0
iface eth0 inet dhcp
post-up ip route change default via 10.20.0.1 dev eth2

No obstant, no serà necessari deixar aquesta ruta per defecte, ja que tot serà automàtic via web.

  • Per a la xarxa local, moodle i altres, tindrà com a porta d'enllaç la eth0.
  • eth2 es configura en wondershaper per tindre una velocitat determinada. Aquesta ha d'estar definida en funció de necessitats.
root@gw:~# ssh root@192.168.9.254 wondershaper eth2 600 200
root@gw:~# ssh root@192.168.9.254 wondershaper clear eth2
  • També podem fer que els clients usen la eth2 i ralentitzar aquesta

Al tindre velocitats baixes però suficients, les webs sense videos funcionaran raonablement. El moodle funciona a la màxima velocitat. Si dos o més alumnes tenen videos ralentiran a la resta de la classe, però no a l'institut.

Exemple:

root@gw:~# wondershaper eth0 1000 500 
root@gw:~# iperf -c 10.20.9.250 -p 9000
------------------------------------------------------------
Client connecting to 10.20.9.250, TCP port 9000
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[  3] local 10.20.8.254 port 39944 connected with 10.20.9.250 port 9000
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-14.1 sec   896 KBytes   520 Kbits/sec
root@gw:~# wondershaper clear eth0  
Wondershaper queues have been cleared.
root@gw:~# 
root@gw:~# iperf -c 10.20.9.250 -p 9000
------------------------------------------------------------
Client connecting to 10.20.9.250, TCP port 9000
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[  3] local 10.20.8.254 port 39946 connected with 10.20.9.250 port 9000
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  1.09 GBytes   940 Mbits/sec

Monitorització

La web admin proporciona una visió aproximada del consum de xarxa total. Per a que funcione necessitem instal·lar sysstat per al sar i activar el servici sysstat, gnuplot per a les gràfiques i una serie de regles IPtables per a comptabilitzar cada IP dels alumnes:

#!/bin/bash
iptables -N TRAFFIC_ACCT_IN
iptables -N TRAFFIC_ACCT_OUT
iptables -I FORWARD -i eth0 -j TRAFFIC_ACCT_IN
iptables -I FORWARD -o eth0 -j TRAFFIC_ACCT_OUT
iptables -I FORWARD -i eth2 -j TRAFFIC_ACCT_IN
iptables -I FORWARD -o eth2 -j TRAFFIC_ACCT_OUT
for i in {1..200}; do iptables -A TRAFFIC_ACCT_IN --dst 192.168.9.$i; iptables -A TRAFFIC_ACCT_OUT --src 192.168.9.$i; done
iptables -L -n -v -x

Se pot reinicialitxzar el comptador:

 iptables -Z TRAFFIC_ACCT_IN

Tutorial complet a: Monitoritzar els clients amb iptables

Tallar internet

Per tallar Internet als alumnes, cal primer donar-los de alta en el DHCP per conèixer la seua IP. Després es poden executar aquestes IPtables:

sudo iptables -I FORWARD 1 -s 192.168.aula.alumne -j DROP     # Tallar a una IP. Es queda com a primera regla de la taula input
sudo iptables -D FORWARD -s 192.168.aula.alumne -j DROP       # Permetre

El control via web ja ho té automatitzat.

Monitorització del servidor

En el servidor interessa instal·lar sysstat, modificar el /etc/defaul/sysstat per a que arreplegue estadístiques i canviar en /etc/cron-d/sysstat el temps de refresc a 1 minut. Quant fem això, podem observar dades estadístiques de la xarxa, per exemple.

Centralitzar la configuració dels clients

Per a fer això, podem utilitzar Ansible.

root@gw:~# apt install ansible
root@gw:~# ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:QUwfjcjUkaFnd8CihW0ANtZwb+7DkUsmXP0hJVtfhlI root@gw
The key's randomart image is:
+---[RSA 2048]----+
|      *O**+Bo.E.o|
|     o +*+Oo+*.o.|
|        o+B.=.o .|
|       ..B o + . |
|        S *   .  |
|         * o     |
|          =      |
|           .     |
|                 |
+----[SHA256]-----+

root@gw:~# ssh-copy-id lliurex@192.168.9.101
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.9.101 (192.168.9.101)' can't be established.
ECDSA key fingerprint is SHA256:yJB1AmXpfIN/Zpaem8pa+5QaO44iYwzPejp+a9h3AQI.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
lliurex@192.168.9.101's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'lliurex@192.168.9.101'"
and check to make sure that only the key(s) you wanted were added.
root@gw:~# ssh-agent bash
root@gw:~# ssh-add ~/.ssh/id_rsa
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
  • Editar el fitxer de /etc/ansible/hosts per tindre tota la llista de hosts administrats.
[alumnes]
192.168.9.101
192.168.9.102
...

Aquesta és la prova de que funciona:

root@gw:~# ansible all -u lliurex -m ping
192.168.9.101 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
...

Comandaments ad-hoc

Podem, per exemple, canviar la contrasenya a Lliurex:

root@gw:~# apt install whois
root@gw:~# mkpasswd --method=sha-512
Password: 
$6$APDy29HR$5lgjvaeU6yaEXhC8tni0f0PzVnQfb2Z1lSJ0IG85YE43cFz42UB65vGZGuhLi1uz1v0PZ6ntI0xNrLJjVWWdT1

root@gw:~# ansible all -u lliurex -m user -a 'name=lliurex password=$6$APDy29HR$5lgjvaeU6yaEXhC8tni0f0PzVnQfb2Z1lSJ0IG85YE43cFz42UB65vGZGuhLi1uz1v0PZ6ntI0xNrLJjVWWdT1' --sudo --ask-become-pass
SUDO password: 
192.168.9.101 | SUCCESS => {
    "append": false, 
    "changed": true, 
    "comment": "lliurex,,,", 
    "group": 1000, 
    "home": "/home/lliurex", 
    "move_home": false, 
    "name": "lliurex", 
    "password": "NOT_LOGGING_PASSWORD", 
    "shell": "/bin/bash", 
    "state": "present", 
    "uid": 1000
}
...

Asegurar-nos de que tenen un programa instal·lat:

root@gw:~# ansible all -u lliurex --sudo --ask-become-pass -m apt -a "name=dia state=present" 

Actualitzar el sistema:

ansible all -u lliurex --sudo --ask-become-pass -m apt -a "upgrade=dist" 

La web Admin

Articul principal: Web de control d'aules

La majoria d'aquestes coses funcionen la web admin que hem fet. codi font

Per a que funcione necessitem:

  • Obrir els ports 80 i 443
  • Install·lar un certificat ssl
  • Configurar Apache per a que funcione el ssl i no deixe entrar en admin per el 80
  • Instal·lar sysstat i activar el servici per a que el SAR funcione.
  • Crear la targeta de xarxa eth2
  • Instal·lar wondershaper
  • Instal·lar gnuplot

Enllaços

https://wiki.archlinux.org/index.php/simple_stateful_firewall

https://albertomolina.wordpress.com/2009/01/09/nat-con-iptables/