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
$ lspci
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 è
che restituisce
network={
Esplicitando si ottiene:
# killall wpa_supplicant
# killall wpa_supplicant
Anche in questo caso si potrà verificare lo stato della connessione attraverso l’istruzione:
$ iw dev <wireless_interface_id> link
# 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
# 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"
echo -e "Work in progress:\n"
echo -n " > Powering $interface_id on... "
echo"Configuration completed"
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.
$ 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
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
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"
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"
echo "done"
if [ -v SSID ]
then
echo " > Connecting to Wireless LAN $SSID... "
if [ -v SSID_pwd ]
then
killall wpa_supplicant 2> /dev/null
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 "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
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
Posta un commento