Passa ai contenuti principali

Gestione della connessione in Linux

Nonostante siano ormai numerosissimi gli strumenti grafici che assistono l’utente nella gestione della connessione alla rete in ambiente Linux, esistono tuttavia situazioni nelle quali è ancora utile - alle volte indispensabile! - utilizzare la riga di comando. Si pensi ad esempio all’installazione di macchine server (che di norma non prevedono GUI), o al ripristino di funzionalità di sistema in condizioni di emergenza.

Oltre a ciò, conoscere gli strumenti che Linux offre per la gestione della connessione alla rete tornerà comunque utile per prescindere da una specifica distribuzione, creare script o comprendere la logica che sta dietro alle stesse utility dette.

Di seguito, dunque, una semplice guida per amministrare la connettività da shell in Linux.

Poiché gli esempi qui riportati sono stati prodotti in ambiente Arch Linux (ver. 2019.03.01 - kernel 4.20.13), in altri contesti gli stessi risultati potrebbero discostarsi leggermente, anche se solo nella forma.


1. Individuare le interfacce di rete

La prima cosa da fare per instaurare una connessione è certamente quella di conoscere le interfacce di rete del nostro sistema. Gli strumenti offerti al riguardo dal Linux sono molteplici. 

Un’indagine preliminare può ad esempio essere condotta attraverso l’utility

$ lspci


che, come noto, fornisce informazioni sui bus PCI di sistema e sui dispositivi ad essi collegati. Sarà in questo modo possibile ottenere informazioni su eventuali schede di rete installate.

È anche possibile ottenere notizie sull’hardware di bordo - in particolare su quello di rete - mediante

$ dmesg 

che, lo si ricorda, descrive in dettaglio la fase di avvio del sistema.


Ma in modo molto più immediato è possibile servirsi del programma “ip” che, con la sua ricca varietà di opzioni, consente di effettuare diagnosi accurate in modo semplice ed efficace. A titolo esplicativo, di seguito il risultato che potrebbe ottenersi da un sistema con le usuali tre interfacce di rete, loopback (lo), ethernet (enp1s0) e wireless (wlp2s0), attraverso il semplice comando


$ ip link

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp1s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
    link/ether 30:65:ec:7e:0d:00 brd ff:ff:ff:ff:ff:ff
3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
    link/ether 5c:e0:c5:4b:0a:d7 brd ff:ff:ff:ff:ff:ff

Per ciascuna interfaccia, si noti ad esempio l’indicazione dello stato (UP/DOWN), il MAC Address e l’eventuale indirizzo IP. 

In realtà “ip link” costituisce solo la base per una varietà di istruzioni dedicate alla gestione delle interfacce di rete. La questione sarà illustrata in dettaglio a breve, ma per rendere da subito l'idea, al fine di analizzare le sole interfacce attive, potrebbe utilizzarsi l’istruzione

$ ip link show up




2. Abilitare le interfacce di rete

Una volta identificato, un dispositivo di rete (in questa sede si assume che i relativi driver siano stati correttamente caricati dal sistema; in caso contrario, provvedere a caricare manualmente i relativi moduli hardware). dovrà essere abilitato prima di poter essere utilizzato.

Di norma le interfacce di rete vengono abilitate automaticamente allo start-up di sistema, ma in assoluto l’istruzione (notare i diritti amministrativi) per abilitare un’interfaccia di rete è




# ip link set <interface_id> up


così come


# ip link set <interface_id> down


è l’istruzione per disabilitarla.

I comandi precedenti potrebbero tuttavia dimostrarsi inefficaci per le schede di rete di tipo wireless che richiedano attivazione manuale o che siano state inibite via software da specifiche applicazioni. In questi casi è opportuno utilizzare l’utility rfkill per verificarne lo stato dell’interfaccia



$ rfkill



ID TYPE      DEVICE SOFT      HARD

 0 wlan      acer-wireless      blocked  unblocked
 1 wlan      phy0              unblocked unblocked
 2 bluetooth hci0              blocked unblocked


ed eventualmente abilitare il dispositivo di interesse:     



# rfkill unblock 0




3. Instaurare una connessione

Instaurare una connessione di rete, wireless o wired, significa in ultima analisi creare un link attraverso il quale poter inviare/ricevere dati. Ora, se collegarsi ad uno switch tramite un cavo di rete è immediato, la medesima operazione verso un access point in modalità wireless richiede qualche accortezza in più.


Concentrandosi pertanto sulle connessioni senza fili, dopo aver attivato la scheda wireless di sistema, è possibile ottenere informazioni sulle reti disponibili, utilizzando il tool “iw”:



# iw dev <wireless_interface_id> scan



Si potrà allora distinguere fra:


Connessione ad una rete aperta

Nel caso in cui si desideri connettersi ad una rete non protetta, l’operazione è immediata:


# iw dev <wireless_interface_id> connect -w "<SSID>"



L'opzione -w (sta per "wait") blocca l'esecuzione in attesa che la connessione sia stata stabilita o viceversa definitivamente fallita. Sarà di lì a poco possibile verificare lo stato della connessione digitando



$ iw dev <wireless_interface_id> link


Connessione ad una rete protetta (PSK-WPA2)

Nel caso in cui, viceversa, ci si intenda connettere ad una rete protetta (in questa sede ci concentriamo intenzionalmente su WPA2 mediante Pre Shared Key poichè la situazione più diffusa) Linux mette a disposizione dell'utente due ottimi strumenti
  • wpa_supplicant, l’implementazione open di IEEE 802.1X/WPA per la negoziazione lato client della chiave con un WPA Authenticator, e
  • wpa_passphrase, il tool attraverso il quale crittare la chiave 

Il funzionamento di wpa_passphrase risulta chiaro eseguendo:
$ wpa_passphrase <SSID> <Password>


che restituisce


network={

ssid="<SSID>"
psk=<encrypted_password>
}


L'effetto di wpa_passphrase è in definitiva quello di cifrare la chiave WPA2 per la rete con dato <SSID>. Ma il codice così generato costituisce soprattutto il parametro di input <wpa_configuration> (l’opzione -B sta per “background”) in:

# wpa_supplicant -B -i <interface_id> -c <wpa_configuration>


 Esplicitando si ottiene:


# killall wpa_supplicant

# wpa_supplicant -B -i <interface_id>
  -c wpa_passphrase <SSID> <Password>


o, se si preferisce,


# killall wpa_supplicant

# wpa_passphrase <SSID> <SSID_pwd> > /etc/wpa_supplicant.conf
# wpa_supplicant -B -i <interface_id> -c /etc/wpa_supplicant.conf


(l’istruzione di killing non sempre sarà indispensabile, ma garantirà in ogni caso il corretto funzionamento di wpa_supplicant).


Anche in questo caso si potrà verificare lo stato della connessione attraverso l’istruzione:


$ iw dev <wireless_interface_id> link




4. Configurare la connessione


Una volta instaurata una connessione - sia questa via cavo o wireless - il passo successivo è quello di assegnare alla scheda di rete utilizzata un indirizzo IP / Subnet Mask, un Default Gateway e specificare uno o più servizi DNS. Come noto, questo potrà essere realizzato in modalità automatica (se presente un servizio DHCP sulla rete) o manualmente.



Configurazione automatica


In presenza di DHCP, la configurazione automatica è sicuramente la via più semplice ed immediata. Le modalità operative cambiano a seconda dei servizi di rete attivi sulla propria macchina. Non potendo in questa sede esaurire l’argomento, ci si limiterà a fornire un semplice esempio per l’ottenimento di un indirizzo IP dinamico mediante servizio dhcpcd


# systemctl start dhcpcd.service

# dhcpcd <interface_id>



Configurazione manuale


Nei casi in cui invece sia necessario disporre di uno specifico indirizzo IP (o semplicemente lì dove non sia disponibile un servizio DHCP), bisognerà configurare manualmente l’interfaccia di rete.


I passi sono semplici e vengono riportati di seguito:


A. Rimuovere eventuali indirizzi IP preesistenti


# ip addr flush dev <interface_id>


B. Impostare indirizzo IP / /Netmask


# ip addr add <ip_address>/<netmask_bits> dev <interface_id>


C. Rimuovere eventuali rotte preesistenti


# ip route flush dev <interface_id>


D. Aggiungere una rotta per il Default Gateway


# ip route add <default_gateway> dev <interface_id>


E. Impostare la stessa rotta come Default Gateway


# ip route add default via <default_gateway> dev <interface_id>


F. Impostare in /etc/resolv.conf uno o più indirizzi DNS nella forma seguente:


# echo "nameserver <dns_ip_1>" > /etc/resolv.conf

# echo "nameserver <dns_ip_2>" >> /etc/resolv.conf



Un semplice script



Si propone di seguito un semplice script per riassumere e dare concretezza ai concetti fin qui esposti. Il codice, sufficientemente autoesplicativo, è stato scritto per configurare automaticamente un'interfaccia di rete con prestabiliti parametri ed instaurare quindi una connessione wired o wireless free o PSK-WPA2. 

#!/bin/bash
clear

if [ $USER != "root" ]
then 
    echo "You must be root to run this script."
    exit
fi

###     SETTINGS      ###

# Please set variables with appropriate values. Unset (comment)
# "SSID" and/or "SSID_pwd" blank for wired connections or free 
# Wi-Fi.

export interface_id="wlp2s0"
export SSID="My_SSID"
export SSID_pwd="My_Password"
export ip="192.168.1.117"
export netmask_bits="24"
export default_gateway="192.168.1.1"
export dns="8.8.4.4"

###     End Settings     ###

echo -e "Network connection settings:\n"
if [ -v SSID ]
then
    echo " > Connection type: Wireless"
    echo " > SSID: $SSID"

    if [ -v SSID_pwd ]

    then
        echo " > WPA/WPA2: Yes"
        echo " > Password: $SSID_pwd"
    else
        echo " > WPA/WPA2: No"
    fi
else
    echo " > Connection type: Wired"
fi
echo " > IP address: $ip"
echo " > Netmask: /$netmask_bits"
echo " > Default Gateway: $default_gateway"
echo " > Domain Name Server IP: $dns"
echo -e "\n"

echo -e "Work in progress:\n"

echo -n " > Powering $interface_id on... "
ip link set $interface_id up || exit
echo "done"

if [ -v SSID ]
then
echo " > Connecting to Wireless LAN $SSID... "
    if [ -v SSID_pwd ]
    then
        killall wpa_supplicant 2> /dev/null
       wpa_passphrase $SSID $SSID_pwd > wpa_supplicant.conf
       wpa_supplicant -B -i $interface_id -c wpa_supplicant.conf > /dev/null
       rm wpa_supplicant.conf
    else
    iw dev $interface_id connect -w "$SSID"
    fi
    echo "started"
fi

echo -n " > Setting IP address/subnet_mask $ip/$netmask_bits... "
ip addr flush dev $interface_id
ip addr add $ip/$netmask_bits dev $interface_id || exit
echo "done"

echo -n " > Setting default gateway $default_gateway... "
ip route flush dev $interface_id
ip route add $default_gateway dev $interface_id || exit
ip route add default via $default_gateway dev $interface_id || exit
echo "done"

echo -n " > Setting DNS: $dns... "
echo "nameserver $dns" > /etc/resolv.conf || exit
echo "done"

echo -e "\n"

echo"Configuration completed"
echo -e "\n"


E se c'è il proxy?

Capita spesso, specialmente in contesti produttivi, di avere a che fare con reti “sorvegliate” da un server proxy.

Se il problema è di facile soluzione con i browser, semplicemente agendo sulla configurazione, con programmi quali ad esempio wget (tipicamente utilizzato dai gestori di pacchetti) la cosa potrebbe risultare un po' più complessa, ma anche in questi casi operare sulla configurazione dello specifico software (ad esempio in /etc/wgetrc è possibile impostare un proxy per i differenti protocolli http, https, ftp) .

Alcune distribuzioni accettano in alternativa la configurazione di specifiche variabili d'ambiemte. Tipicamente:


http_proxy o HTTP_PROXY

https_proxy o HTTPS_PROXY
ftp_proxy o FTP_PROXY
rsync_proxy o RSYNC_PROXY
no_proxy o NO_PROXY

Potrebbe ad esempio essere:

$ export http_proxy=http://10.203.0.1:5187/
$ export https_proxy=$http_proxy
$ export ftp_proxy=$http_proxy
$ export rsync_proxy=$http_proxy
$ export no_proxy="localhost,127.0.0.1"

A seconda dei contesti e delle distribuzioni potrebbe anche rendersi necessario eseguire i precedenti comandi con i diritti amministrativi e/o far eseguire gli stessi, tramite script, all’avvio del sistema. 

Importante notare al riguardo che, qualora il server proxy dovesse richiedere credenziali di accesso, la forma da utilizzare dovrà essere la seguente:

$ export http_proxy=http://user:password@host:port

Ad esempio,

$ export http_proxy=http://john:my_password@10.203.0.1:5187/
$ export https_proxy=$http_proxy
$ export ftp_proxy=$http_proxy

In altre distribuzioni poi la definizione delle stesse variabili d'ambiente deve invece avvenire all'interno di specifici file di configurazione.

 







Commenti

Post popolari in questo blog

Introduzione alle reti 3 - Switch tecnologies

In questa sezione verranno esaminate le Virtual LAN, prima espressione della tecnologia LAN Switching.    Virtual Local Area Network (VLAN) Come già detto, uno dei punti di forza di uno switch risiede nella possibilità di creare sotto-reti a basso costo. Le VLAN ( Virtual Local Area Network ) , in particolare,  rappresentano la risposta a quelle situazioni nelle quali, pur non disponendo di grandi risorse, si renda comunque necessario tener distinti due o più ambiti della stessa rete, o, come è usuale dire, suddividere in più parti un dominio di broadcast.  L'esempio tipico è quello di una (piccola) impresa che abbia necessità di tener separati sulla rete i propri device in base alle attività produttive. La rete potrebbe allora pensarsi composta di tante VLAN quante sono le attività aziendali, ciascuna VLAN potendo contenere al proprio interno l'hw destinato ad ogni specifica attività. Dal punto di vista sistemistico, una  VLAN  è costituita da un sottoinsiem

Switch Commands - istruzioni Cisco HP Extreme "in a nutshell"

Indirizzamento IP

Obiettivo di questo articolo, senza pretesa di esaurire l'argomento, è quello di presentare in modo chiaro e comprensibile un argomento alle volte ostico: l'indirizzamento IP.  Questo, fra l'altro, consentirà di affrontare, anche agli utenti meno esperti, operazioni semplici quali   la configurazione di una scheda di rete con maggiore consapevolezza. Gli indirizzi IP Come noto, con IP  ci si riferisce ad uno dei protocolli di comunicazione di rete più affermati nel mondo delle telecomunicazioni:  Internet Protocol .   Un indirizzo IP è, in particolare, un codice binario che identifica univocamente un dispositivo di rete (una scheda ethernet, la porta di uno switch o di un router, etc.) all'interno di una rete di computer.  Di primaria importanza, nell'ambito dell'indirizzamento, è la lunghezza degli indirizzi, ovvero il numero di bit utilizzati per rappresentare un indirizzo di rete. Questo, evidentemente, perché con n bit sarà possibile ind