Archivi categoria: Debian

Debian è il sistema operativo universale: una tre le prime distribuzioni di Linux, che continua ad essere ai massimi livelli e che non ha una azienda privata alle spalle.

Analisi di problemi su squid

Quando c’è un problema con squid, io non so mai che pesci pigliare. Per evitare di fare sempre le stesse ricerche e trovare le stesse risposte, nonché per delineare una modalità di indagine, aggiornerò questo articolo ad ogni nuova occasione.

squid impiega parecchio tempo per avviarsi, ma a volte, se si fanno solo modifiche alla configurazione, si può evitare di riavviarlo mandando il segnale per la rilettura del file di configurazione.

# systemctl restart squid # riavvio completo
# squid -k reconfigure # rilegge la configurazione

Access log

Il principale file di log è quello che mostra tutte le richieste che ha ricevuto e la risposta che ha dato. Il file è /var/log/squid/access.log e contiene righe fatte così:

1611652062.938 1 192.168.215.45 TCP_DENIED/403 4044 CONNECT cdn-gl.imrworldwide.com:443 - HIER_NONE/- text/html
1611652065.142 63192 192.168.215.45 TCP_TUNNEL/200 1671 CONNECT outlook.office365.com:443 - HIER_DIRECT/40.101.137.66 -

Il primo numero è una marca temporale non formattata. Per sapere veramente a che ora si riferisca si può usare il comando date così

# date --date @1611652073.326
mar 26 gen 2021, 10.07.53, CET

il secondo numero è il tempo, in millisecondi, impiegato da squid per rispondere al client dopo aver svolto l’operazione

il terzo campo è l’IP del client

il quarto campo è l’esito. Gli esiti maggiormente diffusi sono:

  • TCP_DENIED/403, indica che la richiesta è stata rifiutata con codice HTTP 403
  • TCP_TUNNEL/200, indica che la richiesta di apertura di un tunnel è stata accetta con codice HTTP 200
  • TAG_NONE/503, indica un errore interno di quid, ad esempio che non riesce a risolvere il nome con il DNS

il quinto campo è il metodo HTTP richiesto dal client: GET, POST, HEAD, CONNECT

il sesto campo è la coppia nome host e porta da contattare.

Cache log

Questo secondo file di log è /var/log/squid/cache.log e contiene informazioni aggiuntive. Ci sono le informazioni di debug che vengono scritte in base alla direttiva debug_options. Normalmente contiene solo le segnalazioni di problemi. Per avere un po’ più di informazioni, aggiungere:

debug_options ALL,2

al file di configurazione /etc/squid/squid.conf e farlo rileggere a squid. Ci si possono trovare informazioni come questa:

2021/01/26 09:43:04.511 kid1| 85,2| client_side_request.cc(744) clientAccessCheckDone: The request CONNECT mail.google.com:443 is ALLOWED; last ACL checked: localnet
 2021/01/26 09:43:04.511 kid1| 85,2| client_side_request.cc(720) clientAccessCheck2: No adapted_http_access configuration. default: ALLOW
 2021/01/26 09:43:04.511 kid1| 85,2| client_side_request.cc(744) clientAccessCheckDone: The request CONNECT mail.google.com:443 is ALLOWED; last ACL checked: localnet
 2021/01/26 09:43:04.511 kid1| 44,2| peer_select.cc(258) peerSelectDnsPaths: Find IP destination for: mail.google.com:443' via mail.google.com
 2021/01/26 09:43:04.511 kid1| 44,2| peer_select.cc(280) peerSelectDnsPaths: Failed to select source for 'mail.google.com:443'
 2021/01/26 09:43:04.511 kid1| 44,2| peer_select.cc(281) peerSelectDnsPaths:   always_direct = DENIED
 2021/01/26 09:43:04.511 kid1| 44,2| peer_select.cc(282) peerSelectDnsPaths:    never_direct = DENIED
 2021/01/26 09:43:04.511 kid1| 44,2| peer_select.cc(295) peerSelectDnsPaths:        timedout = 0
 2021/01/26 09:43:04.511 kid1| 4,2| errorpage.cc(1261) BuildContent: No existing error page language negotiated for ERR_DNS_FAIL. Using default error file.

che indicano una richiesta di apertura di un tunnel verso mail.google.com che viene inizialmente accettata tramite le ACL, ma poi rifiutata per un problema del DNS usato da squid.

Aggiornamento di Jitsi: sala d’attesa e co-moderatori

Quest’anno ho messo un server Jitsi a disposizione di chiunque lo voglia usare. Si tratta di un sistema per le video chiamate che ho attivato nell’ambito del progetto iorestoacasa.work che, nell’ottica di affrontare meglio la pandemia di Covid-19 del 2020, offre servizi di video chiamata gratuiti a tutti. Lo potete usare qui, con un semplice browser o con l’app Jitsi Meet che potete scaricare dalla pagina principale del sito.

A inizio dicembre ho aggiornato la macchina, passando dalla versione stabile (rilasciata il 14 ottobre 2020, non molto tempo prima) a quella in via di sviluppo. Come il nome fa già capire, questa versione ha funzionalità più nuove, ma è stata sottoposta a controlli minori; ma pare che funzioni a dovere e ha, tra le altre, due nuove funzionalità importanti:

  • la parte del moderatore non è solo di chi apre la stanza, ma può essere assegnata anche ad altri. Un moderatore può selezionare il riquadro del video di un partecipante e aprire il menu contestuale. Lì si trova l’opzione per dare il diritto di moderatore al partecipante;
  • c’è la sala d’attesa. Per proteggere l’accesso alle stanze era già possibile impostare una password (ed è tuttora possibile), ma se un partecipante spiritoso la comunica ad altri meno divertenti, questi si potrebbero collegare alla stanza per disturbare. La sala d’attesa è un posto nel quale finiscono tutti i nuovi arrivati, che vanno ammessi da uno dei moderatori, manualmente. In questo modo è possibile controllare chi si collega (c’è un nome e, eventualmente anche l’email).

qemu e “Failed to lock byte 100”

QEMU non ha grande simpatia per i file system di rete. Di recente ho provato a creare una nuova macchina virtuale partendo da una immagine ISO depositata su un altro server e accessibile via NFS. non ha funzionato.

L’immagine era usata per il lettore CD, il quale era di tipo SATA. L’errore ricevuto era apparentemente difficile da interpretare, ma una volta riletto più volte è diventato chiaro. Oltre ad essere riportato nella GUI del virt-manager era anche presente nel file di log in /var/log/libvirt/qemu/nomeVM.log. Il messaggio era:

qemu-system-x86_64: -device ide-cd,bus=ide.1,drive=libvirt-2-format,id=sata0-0-1: Failed to lock byte 100

Le parti da capire sono «ide-cd» che vuol dire che l’errore è relativo ad un device virtuale di tipo CD-ROM collegato ad un controller IDE/SATA, «ide.1» che indica che si tratta del primo CDROM (io ne avevo due: uno per il sistema opeartivo e uno con i driver aggiuntivi per VirtIO), e infine il messaggio vero è proprio «Failed to lock byte 100» che indica un problema nell’accesso al file.

Il file in questione, vista la natura del device (CD-ROM) è l’immagine ISO del sistema operativo. L’errore sul lock indica che il file system non permette l’operazione di blocco che qemu vorrebbe fare. E in effetti NFS non permette di fare i lock sui file.

Morale: spostata l’immagine ISO sul disco locale, e riconfigurato QEMU con il nuovo percorso, tutto ha funzionato.

Connessione fai da te in fibra ottica

I provider, da un po’ di tempo, offrono connessioni in fibra ottica. In questa pagina cerco di descrivere brevemente come funziona e come configurare il router (o un semplice PC).

La connessione in fibra è costituita da un fascio luminoso che viene trasmesso dentro un cavo. Alla centrale del provider c’è un apparato «server» chiamato OLT che comunica con parecchi apparati «client» chiamati ONT. Il fascio di luce parte dall’OLT e attraversa una serie di splitter per arrivare a tutti gli ONT ad esso collegati. Si tratta di una specie di «broadcasting» nel quale l’OLT non può comunicare con un solo client, ma manda tutto a tutti. Nella direzione contraria, i vari ONT si mettono d’accordo e usano il fascio di luce in «timesharing» vale a dire uno alla volta, secondo una divisione temporale statica. In pratica, se l’OLT è connesso a 100 ONT, allora ogni ONT ha 1/100 della banda.

La velocità di upload è quindi statica: 1/100 della banda riservato ad ogni ONT permette di avere una velocità costante. Invece la velocità in download è variabile: se ad esempio, due persone collegate a due diversi ONT richiedono due pagine web in contemporanea, poiché l’OLT trasmette tutto a tutti, le pagine verranno trasmesse dall’OLT una alla volta: la prima pagina avrà come destinatario l’ONT della prima persona, ma il fascio di luce arriverà anche alla seconda, che dovrà ignorarlo, mentre la seconda pagina avrà come destinatario il secondo ONT ma andrà anche al primo, che dovrà ignorarlo. In questo senso, se a scaricare dati da Internet sono in pochi, allora la velocità sarà maggiore, mentre se sono in tanti, la veclocità sarà minore.

Oltre al traffico Internet, nelle connessioni in fibra ci sono il traffico televisivo e quello voce della fonia. Il primo e il terzo sono bidirezionali, il secondo funziona solo nella direzione dall’OLT all’ONT.

In casa, quando viene tirato il cavo della fibra, vengono messi una borchia e poi l’ONT. Il primo è una scatoletta non alimentata dalla corrente, il secondo richiede invece l’alimentazione e ha anche una porta RJ45 per la connessione Ethernet.

Questi terminali ONT sono in genere dei piccoli apparati con Linux o altri semplice sistemi embedded. Spesso hanno un indirizzo IP fisso sulla porta RJ45 e rispondono al telnet oppure via HTTP. A volte, ci si può collegare a rilevare i dati sulla qualità del segnale ottico.

All’ONT, dicono i vari provider, va collegato un router, di quelli da comprare in negozio, specifico per le connessioni in fibra. Ma vediamo a cosa serve esattamente il router.

Il router va collegato all’ONT con un cavo ethernet e ha di norma anche una serie di porte RJ45 per potervi collegare i computer, oppure le antenne per la connessione Wi-Fi. Se + un computer per la fibra allora ha anche una o due porte per i telefoni PSTN, cioè quelli normali, non quelli VoIP. Non ci sono attacchi speciali per la televisione.

Il router va configurato in modo che si colleghi al provider attraverso l’ONT. Di norma la connessione avviene con il protocollo PPPoE, cioè la classica connessione PPP che anziché usare un segnale seriale (tipico dei tempi del modem PSTN o anche delle linee ADSL), utilizza una connessione a pacchetti ethernet. La connessione richiedere quindi di inserire delle credebziali (login e password) e di norma anche un codice VLAN. Il codice VLAN si usa per fare passare via ethernet varie informazioni, nel nostro caso voce, tv e Internet, semplificandone la separazione. Il router deve accedere ad Internet, quindi deve usare la VLAN di Internet, altrimenti l’ONT lo ignorerà. TIM usa la VLAN 835, altri provider usano altre VLAN per Internet.

Le credenziali permettono al provider di riconoscere chi si collega e applicare le varie configurazioni. Ad esempio, TIM mette sulla sua pagina web le informazioni per la configurazione standard, che offre la connessione con IP dinamico, ma si possono richiedere le credenziali corrette, ad esempio, per avere l’IP statico legato al proprio contratto.

Il router, se ha la porta RJ41 per il telefono, dovrà essere configurato per il VoIP. I parametri sono forniti dal provider e, sostanzialmente, permettono al router di collegarsi, tramite una diversa VLAN, al provider e ottenere la linea telefonica VoIP. Il VoIP, su linea in fibra, ha la priorità sul traffico Internet e quindi funziona bene. Personalmente ho collegato un FAX PSTN alla porta RJ41 del router e ha funzionato bene anche con trasmissioni alla massima velocità.

Il router, per permette alla televisione di ricevere le trasmissioni, fa da proxy IGMP. Quando si accende la TV, collegata alla rete LAN del router, questa cerca un proxy IGMP e si registra tra quelli interessati a ricevere le trasmissioni. Le tramissioni sono inviate dall’OLT a tutti gli ONT secondo la modalità «multicast», il router le riceve e le inotra a quei dispositivi che ne hanno fatto richiesta.

Se si prende un computer qualsiasi e vi si installa GNU/Linux, è facile poi configurarlo come router. Si dovrebbe avere un computer con due schede di rete moderne, che vadano alla velocità della connessione in fibra, quindi in genere gigabit. Ad un interfaccia di rete si attacca il cavo che lo collega all’ONT, all’altra interfaccia si collega lo switch.

Sul computer vanno installati i pacchetti per la connessione pppoe e per il proxy igmp. La parte delle VLAN si configura con il pacchetto iproute2, che normalmente è già installato.

La configurazione può essere fatta a mano, oppure si possono utilizzare progetti come il debian-v9-router che si trova qui.

Combattere lo SPAM con exim

Affrontare lo SPAM è una guerra continua, con regole e situazioni che cambiano di frequente. Riporto qui di seguito alcune considerazioni legate alla configurazione di exim4, in particolare su Debian.

Non elencherò qui le soluzioni più diffuse, come utilizzare spamassassin per la verifica della posta in ingresso, oppure utilizzare le varie blacklist per negare l’accesso a server poco accreditati. Invece, scriverò solo metodi aggiuntivi, per rafforzare ulteriormente il server.

Nome account diverso dal nome della casella di posta elettronica

Molto spesso, chi raccoglie indirizzi di posta elettronica tramite ricerceh su web o tramite la lettura delle rubriche private, tenta poi l’accesso al server di posta utilizzando come nome utente l’indirizzo di posta, con o senza il dominio.

Per esempio, se sulla macchina «macchina.tld» esiste un utente Francesco Rossi con una utenza «francesco», molto probabilmente esistena la casella di posta «francesco@macchina.tld». Se si fa un server di posta, dedicato alla parte SMTP e/o IMAP, vanno definite le utenze e le caselle di posta. Il suggerimento è di usare utenze diverse dalle caselle di posta. Ad esempio, si può dare a Francesco l’utenza «kl2482gg@macchina.tld» che corrisponda alla casella di posta «francesco@macchina.tld».

In questo modo, chi conoscerà la casella di posta «francesco@macchina.tld» tenterà di accedere usando l’utenza «francesco» oppure «francesco@macchina.tld», che non esistono.

Geolocalizzazione

Altra cosa importante è che le credenziali vengono comunque rubate, in un modo o nell’altro, magari tramite virus. Una volta che queste sono in mano agli spammer, verranno effettuate migliaia di connessioni correttamente autenticate verso il server SMTP, che accetterà i messaggi SPAM e cercherà di inviarli.

Una via per limitare questo attacco, è quella di bloccare email inviate da IP stranieri. Per farlo conviene mettere un log per tracciare le nazioni dalle quali si riceve la posta autenticata e capire quali siano le nazioni valide. Su Debian c’è un pacchetto chiamato «geoip-database» che contiene l’elenco degli IP con l’indicazione della nazione di appartenenza. Per exim esiste una libreria dinamica (disponibile qui) che permette di interrogare quel database. Una volta compilata e installata seguendo le istruzioni sul sito della libreria, si devono aggiungere alcuni file di configurazione a exim. Il primo crea una variabile con la nazione dell’IP, chiamiamolo «/etc/exim4/conf.d/acl/exim4-config_check_geoip_parte1»:

#imposta la variabile acl_c_geoip_country_code
warn set acl_c_geoip_country_code = \
${dlfunc{/usr/local/lib/exim4/exim-geoipv6-dlfunc.so}\
{geoip_country_code}{$sender_host_address}}

Il secondo usa la variabile per bloccare l’accesso, chiamiamolo «/etc/exim4/conf.d/acl/exim4-config_check_geoip_parte2»:

#
# Controllo dell'IP origine della connessione.
# Utilizza una libreria e il database degli IP
# la libreria è https://github.com/snabb/exim-geoipv6-dlfunc
# il database e' nel pacchetto geoip-database
#

# nella fase di test, aggiungo una intestazione per controllare la
# variabile
#warn
# condition = ${if def:acl_c_geoip_country_code}
# authenticated = *
# log_message = Accesso autenticato dalla nazione $acl_c_geoip_country_code

# nella fase di test, aggiungo una intestazione per controllare
# l'indirizzo se non è nel database
warn
!condition = ${if def:acl_c_geoip_country_code}
authenticated = *
!hosts = 10.0.0.0/24
log_message = Accesso autenticato da un IP sconosciuto e non della LAN

# accetta email che arrivano da IP della LAN a condizione che
# sia stata fatta l'autenticazione
accept
authenticated = *
hosts = 10.0.0.0/24
log_message = Accesso autenticato da computer in LAN

# accetta email che arrivano da IP di nazioni conosciute, ma mancanti dal database,
# a condizione che sia stata fatta l'autenticazione
accept
authenticated = *
# 88.209.103.0 - 88.209.103.255, Monaco-Telecom, MC
hosts = 88.209.103.0/24
log_message = Accesso autenticato da computer in LAN
# accetta email che arrivano da IP in Francia e Monaco a condizione
# che sia stata fatta l'autenticazione
accept
authenticated = *
condition = ${if def:acl_c_geoip_country_code}
condition = ${if inlist{$acl_c_geoip_country_code}{FR:IT:MC}}
log_message = Accesso autenticato da IP della nazione $acl_c_geoip_country_code

# blocca i messaggi per i quali è stata fatta l'autenticazione SMTP,
# cioè si conosce la password, ma vengono da una naziona conosciuta
# e straniera
# nota: in alcuni casi, acl_c_geoip_country_code non viene inizializzata
# perché l'IP non è nel database. In quel caso, non si entra in questa
# regola
deny
authenticated = *
condition = ${if def:acl_c_geoip_country_code}
!condition = ${if inlist{$acl_c_geoip_country_code}{FR:IT:MC}}
message = Authenticated access from foreign country denied.
log_message = Accesso autenticato da nazione non autorizzata. Rifiutato.

Infine, per fare usare questi due file ad exim, è necessario modificare il file con le opzioni locali, come ad esempio, «/etc/exim4/conf.d/main/000_local_options» aggiungendovi quest righe:

# controllo accessi tramite verifica geografica
CHECK_RCPT_LOCAL_ACL_FILE = /etc/exim4/conf.d/acl/exim4-config_check_geoip_parte1
CHECK_DATA_LOCAL_ACL_FILE = /etc/exim4/conf.d/acl/exim4-config_check_geoip_parte2

Con la geolocalizzazione si bloccano le richieste dall’estero, ma questo potrebbe essere un problema se uno si spostasse all’estero, magari in vacanza. Va quindi usata con attenzione.

Una seconda possibilità, più onerosa dal punto di vista computazionale, è quella di fare il controllo antispam, con spamassassin o altro, anche ai messaggi che arrivano da connessioni autenticate.