Tag Archives: linux

How-to: Installazione di Docker

Introduzione

Docker è un’applicazione che rende semplice la possibilità di utilizzare applicazioni all’interno di un container. I container sono simili alle macchine virtuali, però più portabili, e più dipendenti dalla macchina host, in quanto ne condividono le risorse hardware e il kernel.
In questo tutorial vi spiegherò come installare Docker su Ubuntu 16.04.

Prerequisiti

Per questo tutorial avrete bisogno di:

  • Installazione di Ubuntu 16.04 su macchina fisica a 64bit
  • Utente non root con i privilegi Sudo

Nota: Docker necessita di un’installazione fisica a 64 bit e una versione del kernel uguale o superiore a 3.10. Ubuntu soddisfa le seguenti richieste.

Tutti i comandi di questo tutorial dovrebbero essere lanciati da utenti NON root, se è richiesto l’accesso di root, il comando verrà preceduto da “sudo”.

Step 1: Installare Docker

Il pacchetto di installazione di Docker è presente nei repository ufficiali di Ubuntu 16.04, però potrebbe non essere aggiornato all’ultima versione, per questo è meglio utilizzare il repository ufficiale Docker, dove troveremo sempre le versioni più aggiornate.

Prima di tutto aggiorniamo il database dei pacchetti:

sudo apt-get update

Ora aggiungiamo la chiave GPG del repository di Docker nel portachiavi di sistema:

sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

Aggiungiamo poi il repository di Docker al nostro Ubuntu:

echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo tee /etc/apt/sources.list.d/docker.list

Aggiorniamo di nuovo la lista pacchetti:

sudo apt-get update

Sinceriamoci che la versione di Docker che andremo a installare provenga dal repository Docker e non da quello ufficiale Ubuntu:

apt-cache policy docker-engine

Dovreste ottenere un output di questo tipo:

docker-engine:
Installed: (none)
Candidate: 1.11.1-0~xenial
Version table:
1.11.1-0~xenial 500
500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages
1.11.0-0~xenial 500
500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages

Se tutto è andato come previsto, installiamo Docker:

sudo apt-get install -y docker-engine

A questo punto Docker dovrebbe essere stato installato, abilitato al boot e dovrebbe essere già attivo. Per conoscere lo stato di Docker digitiamo:

sudo systemctl status docker

Questo è l’output che dovremmo ricevere:

● docker.service – Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2016-05-01 06:53:52 CDT; 1 weeks 3 days ago
Docs: https://docs.docker.com
Main PID: 749 (docker)

Installando Docker avrai accesso non solo al demone, ma anche all’utility docker indispensabile per poter configurare/utilizzare Docker.

Vediamo come utilizzare questo comando.

Step 2: Utilizzare Docker senza l’utilizzo di Sudo

Normalmente Docker è un comando che prevede i privilegi di Root, è per questo che dovete sempre usare sudo per poterlo usare. Tale comando però, può essere utilizzato anche dagli utenti che fanno parte del gruppo docker che è automaticamente creato in fase di installazione. Se provate quindi ad utilizzare docker con un utente differente, otterrete il seguente risultato:

docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See ‘docker run –help’.

Se volete utilizzare Docker con il vostro utente normale, dovrete aggiungervi al gruppo docker:

sudo usermod -aG docker $(whoami)

Dovrete effettuare il logout/login per rendere effettive le modifiche.

Il resto di questo tutorial assume che voi utilizziate Docker tramite un utente limitato appartenente al gruppo docker, pertanto da qui in poi sudo verrà omesso.

Step 3 — Usare il comando docker

Con Docker installato e funzionante, è l’ora di divenire familiare con la sua utility a riga di comando. Utilizzarla – come la maggior parte dei software GNU/Linux – consiste nel passargli una serie di opzioni seguite dai relativi argomenti. La sintassi ha questa forma:

docker [option] [command] [arguments]

Per vedere tutte le opzioni disponibili basterà digitare il comando:

docker

Avrete quindi un output di questo tipo:

attach Attach to a running container
build Build an image from a Dockerfile
commit Create a new image from a container’s changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes on a container’s filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container’s filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on a container or image
kill Kill a running container
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
network Manage Docker networks
pause Pause all processes within a container
port List port mappings or a specific mapping for the CONTAINER
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart a container
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop a running container
tag Tag an image into a repository
top Display the running processes of a container
unpause Unpause all processes within a container
update Update configuration of one or more containers
version Show the Docker version information
volume Manage Docker volumes
wait Block until a container stops, then print its exit code

Per vedere tutte le sotto opzioni dovrete digitare:

docker docker-sottocomando --help

Per vedere le informazioni generali dovrete digitare:

docker info

Step 4: Lavorare con le immagini docker

I container Docker vengono sviluppati dalle immagini Docker. Normalmente si possono prendere delle immagini preconfigurate direttamente dal Docker Hub, un repository di immagini gestito dalla società che ha creato Docker. Molte volte troverete l’immagine che cercate direttamente nel Docker Hub.

Per controllare il corretto accesso al Docker Hub digitate:

docker run hello-world

L’output che dovreste ricevere è:

Hello from Docker.
This message shows that your installation appears to be working correctly.

Potete cercare le immagini Docker utilizzando il comando search:

docker search ubuntu

Lo script prenderà i dati dal Docker Hub e vi restituirà un output simile a questo:

NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating s… 3808 [OK]
ubuntu-upstart Upstart is an event-based replacement for … 61 [OK]
torusware/speedus-ubuntu Always updated official Ubuntu docker imag… 25 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of of… 24 [OK]
ubuntu-debootstrap debootstrap –variant=minbase –components… 23 [OK]
nickistre/ubuntu-lamp LAMP server on Ubuntu 6 [OK]
nickistre/ubuntu-lamp-wordpress LAMP on Ubuntu with wp-cli installed 5 [OK]
nuagebec/ubuntu Simple always updated Ubuntu docker images… 4 [OK]
nimmis/ubuntu This is a docker images different LTS vers… 4 [OK]
maxexcloo/ubuntu Docker base image built on Ubuntu with Sup… 2 [OK]
admiringworm/ubuntu Base ubuntu images based on the official u… 1 [OK]

Una volta che hai identificato l’immagine che ti interessa, la puoi scaricare tramite il comando pull:

docker pull ubuntu

Una volta che l’immagine è stata scaricata, potete utilizzarla utilizzando l’istruzione run

docker run ubuntu

Per avere una lista delle immagini scaricate, utilizzate l’istruzione images:

docker images

Dovreste ricevere un output simile a questo:

REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest c5f1cf30c96b 7 days ago 120.8 MB
hello-world latest 94df4f0ce8a4 2 weeks ago 967 B

Queste immagini potranno poi essere modificate per creare altre immagini Docker, ed essere inviate (pushed) al Docker Hub e ad altri registry Docker.

Step 5: Utilizzare un container Docker

Prendendo come esempio l’immagine di Ubuntu scaricata in precedenza, utilizzatela facendo il deploy di un nuovo container:

docker run -it ubuntu

le opzioni -i e -t vi forniranno una console interattiva collegata al container.

Il prompt dei comandi quindi dovrà cambiare, in questo modo si entrerà dentro il container:

root@d9b100f2f636:/#

Come vedete, potete lavorare all’interno del container con le credenziali di root.

A questo punto, potete lavorare dentro al container utilizzando le più comuni utility GNU/Linux. Ad esempio installiamo postfix:

apt-get install -y postfix

Step 6: Controllare i tuoi container

Dopo aver utilizzato Docker per un po’, avrete diversi container attivi o meno. Per vedere i container attivi digitate:

docker ps

Avrete un output simile a questo.

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7c79cc556dd ubuntu “/bin/bash” 3 hours ago Up 3 hours silly_spence

Per vedere tutti i container, attivi e passivi digitate:

docker ps -a

Per vedere l’ultimo container creato digitate:

docker ps -l

Per fermare un container digitate:

docker stop container-id

Il container-id può essere trovato utilizzando il comando docker ps

Conclusione

Docker è uno strumento molto completo, e c’è molto da imparare per poterlo usare al meglio. Con questo tutorial però potrete già iniziare a usare Docker per i vostri progetti o per apprendimento.

Liberamente tratto da Digital Ocean

Creazione di una Web Radio completa

In questo articolo vi spiegherò come ho creato la mia web radio: Radio passaggio a Scirocco partendo da zero ed utilizzando supporti open-source e musica libera dai diritti d’autore.

Si parte inizialmente dalla filosofia e dalla possibilità o meno di “pagare”. Per avere una webradio “regolare” occorre essere iscritti alla SIAE. Ad oggi, per una radio da massimo 30 utenti simultanei NON COMMERCIALE bisogna pagare circa 300 euro l’anno.

Essendo il mio un progetto totalmente amatoriale e personale, ho deciso di evitare di pagare la SIAE e di utilizzare soltanto musica di artisti non iscritti alla SIAE (licenze creative common e aperte), però in caso vi interessasse qualcosa di più “main stram”, potete fare un giro nel sito di Mondo, che è molto ferrato in materia.

Per avere un po’ di buon “materiale” da suonare, mi sono fatto un giro su Free Music Archive, un database di musica gratuita che può essere riprodotta e scaricata gratis.

Al momento non prevedo di inserire delle trasmissioni “live“, ma di suonare musica a rotazione (un jukebox via internet insomma). Ho poi pensato che sarebbe stato meglio registrare le trasmissioni in locale e poi farle ruotare sul server. Questo perché non è facile con una strumentalizzazione amatoriale (pc + streaming server) creare buoni stacchi e tagli.

Come server utilizzerò una Debian Squeeze aggiornata, server web Apache e Icecast2 come server di streaming.

Per prima cosa installiamo icecast2 ed ices2, i due programmi che si occuperanno di effettuare lo streaming della musica ai vostri ascoltatori:

apt-get install icecast2 ices2

una volta installati, questi programmi vanno configurati. Si parte con il file di configurazione di icecast2: /etc/icecast2/icecast.xml. Le parti più importanti del file sono:

<--! massimo numero di clienti simultanei -->
<clients>100</clients>
<sources>2</sources>
<threadpool>5</threadpool>
<queue-size>902400</queue-size>
<client-timeout>30</client-timeout>
<header-timeout>15</header-timeout>
<source-timeout>10</source-timeout>
<burst-on-connect>1</burst-on-connect>
<burst-size>65535</burst-size>

<authentication>
<!-- Password di Ices2 -->
<source-password>sourcepass</source-password>
<!-- Password per Relay (inutilizzato al momento) -->
<relay-password>relaypass</relay-password>

<!-- Password per la web UI -->
<admin-user>admin</admin-user>
<admin-password>adminpass</admin-password>
</authentication>
<hostname>buleria.acido.be</hostname>

<listen-socket>
<port>8000</port>
<!-- <bind-address>109.169.37.166</bind-address> -->
<!-- <shoutcast-mount>/stream</shoutcast-mount> -->
</listen-socket>

Una volta modificato il file, lo avviamo:

/etc/init.d/icecast2 restart

Passiamo poi a ices2: prima di tutto creo il suo ambiente e mi prendo un file di configurazione standard:

mkdir -p /home/ices/music
cp /usr/share/doc/ices2/examples/ices-playlist.xml > /home/ices/

Inizio poi a modificare il file di configurazione. Ecco le parti più importanti:

<ices>
<!-- fork in background -->
<background>1</background>
<!-- location dei logs -->
<logpath>/var/log/ices</logpath>
<logfile>ices.log</logfile>
<!-- 1=error,2=warn,3=info,4=debug -->
<loglevel>4</loglevel>

<stream>

<input>
<module>playlist</module>
<param name="type">basic</param>
<param name="file">/home/ices/playlist.txt</param>
<!-- random play -->
<param name="random">1</param>
<!-- Se la playlist viene cambiata, il playback inizia da capo -->
<param name="restart-after-reread">0</param>
<!-- Se è messo a 1, riproduce tutta la playlist e poi esce -->
<param name="once">0</param>
</input>
<instance>
<!-- Credenziali per il collegamento ad icecast2 -->
<hostname>localhost</hostname>
<port>8000</port>
<password>sourcepass</password>
<mount>/radio</mount>
<reconnectdelay>2</reconnectdelay>
<reconnectattempts>5</reconnectattempts>
<maxqueuelength>80</maxqueuelength>
<encode>
<!-- Bitrate -->
<nominal-bitrate>64000</nominal-bitrate>
<samplerate>44100</samplerate>
<channels>2</channels>
</encode>
</instance>

</stream>
</ices>

A questo punto dobbiamo caricare la nostra prima canzone! Ices2 utilizza OGG come formato musicale open source, quindi probabilmente dovremo convertire il nostro mp3 prima di poterlo mettere in playlist:

mpg321 -q nomefile.mp3 -w - | oggenc -b256 -o nomefile.ogg -

e poi metterlo in playlist:

ls ./*.ogg > /home/ices/playlist.txt

Nel mio caso, dopo qualche test ho preferito effetturare l’encoding del file a 256kb/s ed uno stream a 64kb/s. Questo mi permette di risparmiare banda utilizzando uno stream bitrate basso, ma di avere comunque una buona qualità di ascolto.

Feedbacks sono ben accetti.

Infine avviamo ices2:

ices2 /home/ices/ices-config.xml

Proviamo ad aprire il nostro player musicale (iTunes, VLC, Winamp..), inserendo nel mio caso il seguente URL:

http://buleria.acido.be:8000/radio

Se tutto è andato bene, possiamo mettere l’avvio automatico di ices inserendo il comando nel file /etc/rc.local

Per fare questa operazione su un largo numero di files, mi sono creato uno scriptino in bash: mp32ogg.sh  che rinomina i files mp3 togliendo gli spazi, fa l’encoding dei files ogg inserendo anche gli ID3 ed infila tutto nella playlist di ices2.

Per poterlo usare, la cartella contenente i files mp3 non può avere spazi (mentre i nomi dei files sì) e lo script va lanciato con i path ASSOLUTI. Es:

sh mp32ogg.sh /home/ices/music/album_in_mp3

Il problema è che su Debian al momento, lo script ufficiale per fare encoding di files ogg – mp32ogg – è rotto e perl va in errore. Ho dovuto riparare da me.

Questo script è scritto “con la zappa”, ovvero fa uscire a video un sacco di errori, a volte mpg123 va in segfault, ed è successo che gli ID3 se non sono scritti bene uscissero errati, ma funziona nel 95% dei casi. Se qualcuno ha voglia e tempo di fargli un paio di fix ne sarei contento 😉

Potete controllare tutti i parametri della radio aprendo con un browser questo indirizzo:

http://buleria.acido.be:8000

Per entrare nell’area admin dovrete loggarvi con “admin” e la “adminpass” che avete specificato nel file di configurazione di icecast2

A questo punto, dopo aver messo in piedi la vostra radio bisogna passare al sito web.

Ho pensato che, essendo una web radio, la parte più importante debba essere la musica, quindi ho voluto creare una pagina web molto semplice dove ci fosse solo il player in html5 e qualche info:

http://pas.acido.be

Una cosa che in una web radio è molto utile è l’indicazione in tempo reale della canzone che si sta ascoltando. Per fare questo, ho trovato uno script da qualche parte nel web che prende le info di http://buleria.acido.be:8000/status.xsl e le inserisce in un html. Nella pagina index ho poi inserito un javascript che fa l’update del DIV dove verranno stampate le informazioni.

Per comodità potete scaricare il sorgente completo di http://pas.acido.be e modificarlo a vostro piacimento.

A questo punto la radio è completa! Buon divertimento!

Come prevenire i bruteforce con Iptabes

Ci sono vari modi per bannare un ip che sta effettuando un attacco di bruteforce al server SSH sul nostro server. Vediamo come fare con Iptables.

Il modo è molto semplice, anche se non è utilizzato da molti, in quanto anche il software fail2ban offre questa feature insieme alle altre. Le regole da inserire sono tre ed utilizzeremo un modulo di Iptables chiamato RECENT, che offre la possibilità di marcare i pacchetti a seconda della frequenza con il quale vengono mandati.

Vediamo l’esempio, e consideriamo che l’interfaccia utilizzata sia eth0

Inizialmente dico ad Iptables di creare un database chiamato SSH degli IP che tentano di connettersi alla porta 22 (server SSH):

iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

Dopodiché loggo tutti gli IP che effettuano 3 nuove connessioni in meno di 300 secondi:

iptables -A INPUT -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-level info --log-prefix "SSH SCAN blocked: "

Infine blocco gli IP

iptables  -A INPUT -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP

Una volta che saranno passati i 300 secondi dovrò rimuovere il ban dagli IP:

iptables -A INPUT   -m recent --name SSH --remove

Quello che ho ottenuto è un ban automatico di 300 secondi di un IP che sbaglia 2 volte la password. Se si utilizzano le chiavi SSH è perfetto. Per vedere gli IP che vengono bloccati, essi saranno loggati in /var/log/syslog. Il database degli ip creato da Iptables si trova in /proc/net/ipt_recent/.

Ecco il mio in questo momento:

maradona:/home/luca# cat /proc/net/ipt_recent/SSH
src=66.96.207.19 ttl: 53 last_seen: 1574688771 oldest_pkt: 17 1574675627, 1574676051, 1574676051, 1574676070, 1574676070, 1574676070, 1574676899, 1574676899, 1574677663, 1574677663, 1574677663, 1574678595, 1574678595, 1574681987, 1574681987, 1574688771, 1574688771, 1574675452, 1574675452, 1574675627
src=121.184.33.56 ttl: 45 last_seen: 1523900419 oldest_pkt: 1 1523900419
src=59.30.218.148 ttl: 46 last_seen: 1550603547 oldest_pkt: 1 1550603547
src=122.70.150.106 ttl: 112 last_seen: 1561734410 oldest_pkt: 1 1561734410
src=218.108.0.91 ttl: 112 last_seen: 1580437381 oldest_pkt: 1 1580437381
src=61.236.182.11 ttl: 52 last_seen: 1584381984 oldest_pkt: 4 1584379536, 1584379536, 1584381984, 1584381984, 1584377172, 1584377172, 1584377242, 1584377242, 1584377394, 1584377394, 1584377700, 1584377700, 1584377922, 1584377922, 1584377922, 1584378312, 1584378312, 1584379421, 1584379421, 1584379421
src=195.228.135.138 ttl: 112 last_seen: 1525774504 oldest_pkt: 1 1525774504
src=64.120.26.34 ttl: 52 last_seen: 1548030041 oldest_pkt: 10 1548007267, 1548007267, 1548007583, 1548007583, 1548014434, 1548014434, 1548015069, 1548015069, 1548030041, 1548030041, 1548001891, 1548001968, 1548001968, 1548002398, 1548002398, 1548002398, 1548003683, 1548003683, 1548003840, 1548003840
src=38.108.125.101 ttl: 55 last_seen: 1551424865 oldest_pkt: 1 1551424865
src=85.114.140.73 ttl: 118 last_seen: 1594716674 oldest_pkt: 1 1594716674
src=59.1.90.140 ttl: 46 last_seen: 1550619212 oldest_pkt: 1 1550619212
src=174.36.85.36 ttl: 119 last_seen: 1551527977 oldest_pkt: 1 1551527977
src=211.202.2.107 ttl: 49 last_seen: 1552508574 oldest_pkt: 10 1552476845, 1552476845, 1552478775, 1552478775, 1552483035, 1552483035, 1552491546, 1552491546, 1552508574, 1552508574, 1552475052, 1552475052, 1552475346, 1552475346, 1552475346, 1552475586, 1552475586, 1552476649, 1552476649, 1552476845
src=64.120.26.58 ttl: 52 last_seen: 1589438178 oldest_pkt: 10 1589425634, 1589426141, 1589426141, 1589426141, 1589427426, 1589427426, 1589431010, 1589431010, 1589438178, 1589438178, 1589424066, 1589424066, 1589424290, 1589424290, 1589424641, 1589424641, 1589424641, 1589424738, 1589424738, 1589425634
src=93.93.129.125 ttl: 54 last_seen: 1601942176 oldest_pkt: 19 1601925043, 1601925313, 1601925313, 1601925572, 1601925572, 1601925572, 1601925857, 1601925857, 1601926945, 1601926945, 1601927078, 1601927078, 1601927078, 1601929122, 1601929122, 1601933473, 1601933473, 1601942176, 1601942176, 1601925043
src=112.161.94.145 ttl: 46 last_seen: 1577293804 oldest_pkt: 1 1577293804
src=62.128.149.44 ttl: 50 last_seen: 1562069800 oldest_pkt: 2 1562069208, 1562069800
src=125.138.59.232 ttl: 46 last_seen: 1586717876 oldest_pkt: 1 1586717876
src=14.37.84.210 ttl: 46 last_seen: 1549261247 oldest_pkt: 1 1549261247
src=178.162.239.192 ttl: 54 last_seen: 1593634277 oldest_pkt: 10 1593616610, 1593616610, 1593616805, 1593616805, 1593619302, 1593619302, 1593624293, 1593624293, 1593634277, 1593634277, 1593614621, 1593614621, 1593614934, 1593614934, 1593615110, 1593615110, 1593615110, 1593615557, 1593615557, 1593616610
src=60.190.216.90 ttl: 50 last_seen: 1549489599 oldest_pkt: 0 1549486840, 1549486840, 1549487023, 1549487023, 1549487392, 1549487392, 1549487510, 1549487510, 1549487510, 1549488127, 1549488127, 1549489010, 1549489010, 1549489010, 1549489599, 1549489599, 1549492543, 1549492543, 1549498431, 1549498431
src=112.220.100.226 ttl: 43 last_seen: 1563702466 oldest_pkt: 10 1563673299, 1563673299, 1563674914, 1563674914, 1563678850, 1563678850, 1563686722, 1563686722, 1563702466, 1563702466, 1563671471, 1563671471, 1563671799, 1563671799, 1563671799, 1563671963, 1563671963, 1563672946, 1563672946, 1563673299
src=109.168.123.134 ttl: 120 last_seen: 1571008152 oldest_pkt: 1 1571008152
src=31.210.72.73 ttl: 50 last_seen: 1590914007 oldest_pkt: 9 1590893785, 1590894295, 1590894295, 1590897111, 1590897111, 1590902743, 1590902743, 1590914007, 1590914007, 1590891831, 1590891831, 1590892183, 1590892183, 1590892285, 1590892285, 1590892285, 1590892887, 1590892887, 1590893785, 1590893785
src=109.230.232.145 ttl: 55 last_seen: 1592528351 oldest_pkt: 1 1592528351
src=58.68.174.76 ttl: 54 last_seen: 1520319496 oldest_pkt: 10 1520303368, 1520303369, 1520303369, 1520303369, 1520305672, 1520305672, 1520310280, 1520310280, 1520319496, 1520319496, 1520301352, 1520301352, 1520301640, 1520301640, 1520301869, 1520301869, 1520301869, 1520302216, 1520302216, 1520303368
src=218.108.85.240 ttl: 112 last_seen: 1578974064 oldest_pkt: 1 1578974064
src=95.250.59.247 ttl: 49 last_seen: 1515911697 oldest_pkt: 1 1515911697
src=81.56.117.225 ttl: 47 last_seen: 1562139443 oldest_pkt: 15 1562137225, 1562137303, 1562137303, 1562137303, 1562137911, 1562137911, 1562137955, 1562137955, 1562138784, 1562138784, 1562138784, 1562139351, 1562139351, 1562139443, 1562139443, 1562136857, 1562136857, 1562137199, 1562137199, 1562137225
src=41.139.66.52 ttl: 50 last_seen: 1573686109 oldest_pkt: 1 1573686109
src=109.70.149.42 ttl: 55 last_seen: 1558340790 oldest_pkt: 10 1558325333, 1558325425, 1558325425, 1558325425, 1558327542, 1558327542, 1558331958, 1558331958, 1558340790, 1558340790, 1558323402, 1558323402, 1558323678, 1558323678, 1558323926, 1558323926, 1558323926, 1558324230, 1558324230, 1558325333
src=61.232.11.146 ttl: 115 last_seen: 1590588858 oldest_pkt: 1 1590588858

Tutorial: Limitare il traffico dei proxy con TC ed Iptables

Opensource LogoQualche giorno fa ho dovuto far fronte ad un problema di sovraccarico di rete di alcuni server per un provider americano che eroga servizi di anonimato. Nello specifico, proxy e VPN. Ho dovuto quindi stendere un piccolo script per poter fare un po’ di traffic shaping. Ecco come l’ho creato.

Ambiente e servizi

Prima di tutto ho dato un’occhiata al traffico e al modo in cui la macchina eroga i servizi.

Il carico di rete alto proveniva essenzialmente dai proxy, che vengono usati per fare spidering dei siti internet. Si parla quindi di una grande mole di connessioni simultanee da parte dello stesso IP.

I proxy venivano anche usati per effettuare il download di files o lo streaming di flussi video. Ho provato poi a configurare un account nella mia macchina per controllare il numero medio di connessioni simultanee per un utilizzo standard del servizio ed ho visto che tocca punte di 40 connessioni (posta, browsing, ed altre piccole cose), mentre alcuni IP arrivavano anche a 500-600 connessioni.
Il proxy è in ascolto in porta 80.
Per una maggiore usabilità ho chiaramente dovuto escludere dei servizi dal sistema di shaping, come SSH, lasciandoli “liberi di correre”.

Ho deciso quindi di utilizzare un semplice traffic shaping avvalendomi di 2 tools molto potenti: TC e Iptables, che mi hanno consentito di creare una catena dinamica delle connessioni e dei rispettivi limiti di banda.

Ecco come funziona:

  • La banda viene limitata secondo le possibilità fisiche: se il provider ti offre un limite 10mbit di banda, pena un sovrapprezzo per megabyte, dovremo accuratamente settare la quantità di banda consentita
  • Le prime 50 connessioni simultanee vengono accodate a priorità 1 a massima velocità
  • Dalla connessione 51, le connessioni vengono accodate in una catena a banda limitata
  • I files vengono scaricati a piena velocità da 0 a 9.99Mbyte, da 10Mbyte a 49.99 Mbyte vengono accodati in una coda limitata, e da 50Mbyte in poi, in una coda ancor più limitata.
  • Possibilità di utilizzare solo una parte della banda totale, utilizzando i parametri “DESIRED” e “DEFAULT”

Vediamo un po’ come implementare questa soluzione:

Prima di tutto creo una sezione per la configurazione delle variabili che utilizzerà lo script:

# Configuration part:
# $IPT binary
IPT=/sbin/iptables
# Tc binary
TC=/sbin/tc
# Physical interface - no virtual interfaces allowed ($ETH:0, $ETH:1 etc)
ETH=eth0
# SSH server port - we accept all connections in order to bypass the shaper
SSH_PORT=131
# Total bw rate
TOTAL_BW=10mbit
# Bandwidth peak - Please set it a little lower than your real preference
PEAK_BW=10mbit
# Desired Bandwidth Rate - Useful if you want to use less bw of your real capacity
DESIRED_BW=9mbit
# Desired peak - Same as above
DESIRED_PEAK=10mbit
# Jail rate - Set it quite lower if you want real results
JAIL_BW=512mbit
# Jail peak - Same as above
JAIL_PEAK=1mbit
# Default Bandwidth
# Set: 1 for Total values
#      2 for Desired values
DEFAULT_BW=2
# Connection Limit - Note that we talk about symultaneous connections. A good value is 10
CONNLIMIT=30
# Set first size limit
FIRST_SIZE=10485760
# Set the total available bandwidth for the first size limit
FIRST_SIZE_BW=1mbit
# Set the total available peak for the first size limit
FIRST_SIZE_PEAK=1mbit
# Set second size limit
SECOND_SIZE=52428800
# Set the total available bandwidth for the second size limit
SECOND_SIZE_BW=512kbit
# Set the total available peak for the second size limit
FIRST_SIZE_BW_PEAK=512kbit
# End of configuration file

Dopodiché creo lo script vero e proprio:

Prima di tutto faccio un flush della tavola di mangle (che serve per il mark dei pacchetti) e della catena di OUTPUT – che è l’unica che utilizzerò -:

# Flush all queues
$TC qdisc del dev $ETH root
# Flush mangle chains
$IPT -t mangle -F
$IPT -t mangle -Z
$IPT -t mangle -X
$IPT -F OUTPUT

A questo punto posso creare la qdisc, con le relative classi:

# Creating New TC queue
$TC qdisc add dev $ETH root handle 1: htb default $DEFAULT_BW
$TC class add dev $ETH parent 1: classid 1:1 htb rate $TOTAL_BW ceil $PEAK_BW
$TC class add dev $ETH parent 1:1 classid 1:2 htb rate $DESIRED_BW ceil $DESIRED_PEAK
$TC class add dev $ETH parent 1:1 classid 1:3 htb rate $JAIL_BW ceil $JAIL_PEAK
$TC class add dev $ETH parent 1:1 classid 1:4 htb rate $FIRST_SIZE_BW ceil $FIRST_SIZE_PEAK
$TC class add dev $ETH parent 1:1 classid 1:5 htb rate $SECOND_SIZE_BW ceil $FIRST_SIZE_BW_PEAK

Poi aggancio le classi al device principale:
# Adding the queue lists to the main device
$TC qdisc add dev $ETH parent 1:2 sfq
$TC qdisc add dev $ETH parent 1:3 sfq
$TC qdisc add dev $ETH parent 1:4 sfq
$TC qdisc add dev $ETH parent 1:5 sfq

Dico a TC di effettuare il traffic shaping secondo il mark dei pacchetti di Iptables:

# Adding filter by packet mark
$TC filter add dev $ETH parent 1:0 protocol ip prio 1 handle 7 fw flowid 1:3
$TC filter add dev $ETH parent 1:0 protocol ip prio 1 handle 20 fw flowid 1:4
$TC filter add dev $ETH parent 1:0 protocol ip prio 1 handle 21 fw flowid 1:5

Ed infine creo le regole di MARK su Iptables e il canale preferenziale per SSH:

# Setting packet connmarks:
$IPT -A PREROUTING -t mangle -j CONNMARK --restore-mark
$IPT -A POSTROUTING -t mangle -m mark ! --mark 0 -j ACCEPT
$IPT -A POSTROUTING -t mangle -p tcp  -m connlimit --connlimit-above $CONNLIMIT -j MARK --set-mark 7
$IPT -A POSTROUTING -t mangle -j CONNMARK --save-mark
# Setting file size mark
$IPT -A OUTPUT -p tcp --sport $SSH_PORT -j ACCEPT
$IPT -A OUTPUT -p tcp -o $ETH -m connbytes --connbytes $SECOND_SIZE: --connbytes-dir both  --connbytes-mode bytes -j MARK --set-mark 21
$IPT -A OUTPUT -p tcp -o $ETH -m connbytes --connbytes $FIRST_SIZE:$SECOND_SIZE --connbytes-dir both  --connbytes-mode bytes -j MARK --set-mark 20
$IPT -A OUTPUT -p tcp  -m connlimit --connlimit-above $CONNLIMIT -j MARK --set-mark 7

Conclusione

Non sono sicuro al 100% che questo script sia stato steso in maniera perfetta, certo è che funziona abbastanza bene. I carichi sui suddetti server sono spariti e la navigazione con i proxy è fluida e veloce, nonostante ora venga utilizzato solamente circa un terzo della banda.

Come creare un installer Debian personalizzato: simple-ccd

Debian LogoPiccolo tutorial che spiega come utilizzare simple-ccd, un tool che consente la creazione di un DVD/CD di installazione personalizzato.

Ultimamente ho dovuto creare un CD di installazione automatico da poter distribuire agli utenti e contentente dei programmi proprietari con licenza shareware.
Ho quindi scelto Debian come distribuzione, sopratutto perché ha a disposizione un tool molto potente e personalizzabile: simple-cdd.

Simple-cdd è un set di script che permette la creazione di CD/DVD di installazione personalizzati ed automatici. Vediamo un po’ come funziona.

Per prima cosa installiamo il programma:

apt-get install build-simple-cdd

dopodiché creiamo una nuova directory nella nostra home:

mkdir $HOME/ccd

ci entriamo:

cd $HOME/ccd

e lanciamo subito il nostro nuovo tool:

build-simple-ccd

lanciato così senza paramentri, lo script creerà un installer di base, che installerà un sistema operativo privo di qualsivoglia pacchetto. Durante l’esecuzione, build-simple-cdd creerà un mirror parziale nella directory tmp/ e, se tutto è andato bene, troverete la nuova immagine nella directory images/

Le opzioni principali di Simple-cdd

Proviamo ora ad utilizzare qualche opzione:

in caso vogliate utilizzare un mirror specifico per il download dei pacchetti, potete speficarlo con l’opzione –debian-mirror:

build-simple-cdd --debian-mirror http://debian.fastweb.it/debian

di default, lo script creerà un installer della stessa release della macchina host, in caso vogliate utilizzare un’altra release (ad esempio Lenny) potete utilizzare l’opzione –dist:

build-simple-cdd --debian-mirror http://debian.fastweb.it/debian --dist lenny

Utilizzare i profili con Simple-cdd

Il grande pregio di simple-cdd è la possibilità di creare delle installazioni altamente personalizzabili grazie all’utilizzo di profili caricabili in fase di setup. Vediamo un po’ come funzionano:

creiamo una directory chiamata “profiles” e ci entriamo:

mkdir ./profiles
cd ./profiles

creiamo poi un file chiamato default.packages e lo editiamo inserendoci tutti i pacchetti che vogliamo installare automaticamente:

vi default.packages
# inserisco i pacchetti che mi servono, ma non le dipendenze!

openssh
less
openssl
apache2
mysql-server
freeradius

ricreiamo poi l’immagine con il profilo selezionato:

build-simple-cdd --profiles default --debian-mirror http://debian.fastweb.it/debian --dist lenny

Questo comando ricostruirà la vostra immagine includendo il profilo che avete appena creato.

in caso vogliate provare l’immagine con qemu, c’è l’opzione –qemu apposita per costruire un immagine già pronta per l’emulatore:

build-simple-cdd --profiles default --debian-mirror http://debian.fastweb.it/debian --dist lenny --qemu

L’utilizzo di Preseed

Con simple-cdd è possibile utilizzare i file di preseed.
I file di preseed sono dei file di testo contenenti le risposte alle domande che vengono poste in fase di installazione. Grazie a questi sarà possibile non inserire i dati manualmente mentre l’installazione è in esecuzione.

Vediamo un po’ come implementarle nella nostra immagine personalizzata:

creiamo un file chiamato “default.preseed” e lo editiamo:

vim default.preseed

dentro ci inseriremo alcune info utili alla nostra installazione:

# informazioni sulla rete

# la rete viene configurata secondo i parametri qui esposti e viene disabilitato il DHCP
d-i netcfg/disable_dhcp boolean true
d-i netcfg/get_nameservers string 10.0.69.254
d-i netcfg/get_ipaddress string 10.0.69.234
d-i netcfg/get_netmask string 255.255.255.0
d-i netcfg/get_gateway string 10.0.69.254
d-i netcfg/confirm_static boolean true
d-i netcfg/get_hostname string astTron
d-i netcfg/get_domain string localdomain
d-i netcfg/wireless_wep string

# timezone, package mirror e locale

d-i mirror/country string manual
d-i mirror/http/hostname string http.debian.fastweb.it
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string

d-i clock-setup/utc boolean true
d-i time/zone string Europe/Rome
tzsetup-udeb    time/zone       select  Europe/Rome

d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string time.ien.it

# informazioni sulla partizione

d-i partman-auto/method string regular
d-i partman-auto/choose_recipe select atomic
d-i partman/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true

# password di root

d-i passwd/root-password password test
d-i passwd/root-password-again password test

user-setup-udeb passwd/root-password password test
user-setup-udeb passwd/root-password-again password test

# configurazione di un nuovo utente

d-i passwd/user-fullname string Utente di Amministrazione
d-i passwd/username string adminuser
d-i passwd/user-password password test
d-i passwd/user-password-again password test

user-setup-udeb passwd/user-fullname string Utente di Amministrazione
user-setup-udeb passwd/username string adminuser
user-setup-udeb passwd/user-password password test
user-setup-udeb passwd/user-password-again password test

# configurazione di apt

d-i apt-setup/non-free boolean true
d-i apt-setup/contrib boolean true

d-i apt-setup/services-select multiselect security, volatile
d-i apt-setup/security_host string security.debian.org

d-i apt-setup/volatile_host string volatile.debian.org

# configurazione mysql

mysql-server-5.0 mysql-server/root_password string
mysql-server-5.0 mysql-server/root_password seen true
mysql-server-5.0 mysql-server/root_password_again string
mysql-server-5.0 mysql-server/root_password_again seen true
mysql-server-5.0 mysql-server/root_password password test
mysql-server-5.0 mysql-server/root_password_again password test

# popularity contest
popularity-contest popularity-contest/participate boolean false

# installazione del boot loader

d-i grub-installer/only_debian boolean true
d-i finish-install/reboot_in_progress note

ricostruiamo infine l’immagine con:

build-simple-cdd --profiles default --debian-mirror http://debian.fastweb.it/debian --dist lenny

In questa maniera, gran parte delle informazioni richieste in fase di installazione saranno già incluse nella vostra ISO.

In caso abbiate dei pacchetti costruiti da voi e vogliate includerli nella vostra ISO, dovete creare la directory package in $HOME/cdd

mkdir $HOME/cdd/packages

dove dentro metterete i vostri pacchetti. Aggiungerete poi i il nome dei pacchetti anche nel file default.packages. Infine ricostruirete la vistra ISO con l’opzione –local-packages $HOME/cdd/packages:

build-simple-cdd –profiles default –debian-mirror http://debian.fastweb.it/debian –dist lenny –local-packages $HOME/cdd/packages

Un po’ di info

Potete trovare molte altre informazioni sull’utilizzo di simple-cdd nel sito debian:

http://wiki.debian.org/Simple-CDD/Howto
http://wiki.debian.org/DebianInstaller/Preseed

e nelle directory

/usr/share/doc/simple-cdd/

/usr/share/simple-cdd/