La majoria de sistemes GNU/Linux amb entorn gràfic utilitzen el servei NetworkManager per a gestionar la xarxa. A més totes tenen un servei per a gestionar-la si la volem configurar-la directament des de la terminal amb els fitxers de configuració, sense utilitzar l’entorn gràfic.
Totes les distribucions GNU/Linux basades en Debian han configurat sempre la xarxa des de la terminal amb el paquet ifupdown. Aquest paquet permet configurar-la amb el servei networking que guarda la configuració de la xarxa en el fitxer /etc/network/interfaces
(encara que també es pot configurar des de l’entorn gràfic amb el servei NetworkManager).
A partir de Ubuntu 17.10 Canonical ha introduit una nova forma de configurar la xarxa: netplan. Ara el servei és systemd-networkd i el fitxer de configuració està dins de /etc/netplan/
i es tracta d’un fitxer en format YAML (on cada subsecció ha d’estar indentada de la secció pare amb uns ESPAIS en blanc). El motiu segons explique és per a superar certes limitacions de ifupdown.
La configuració gràfica continua igual amb el NetworkManager.
En GNU/Linux les targetes de xarxa s’identifiquen com ethX (eth0, eth1, …) si són targetes ethernet cablejades o wlanX si són targetes WiFi (en ocasions es diuen athX si són wifis Atheros o amb altres noms depenent del fabricant).
El problema és que el nom que se li assigna depèn de quan es configura la targeta en arrancar (la primera serà la eth0, la segona la eth1) i això podria canviar entre un reinicie i un altre. A més algunes distribucions, com Ubuntu, assignen sempre el mateix nom d’interfície a cada MAC pel que si es desbarata una targeta i la canviem la nova ja no seria eth0 sinó el següent nom no usat. El mateix també passa en les màquines virtuals on podem canviar les MAC de les nostres targetes.
Moltes configuracions (firewall, enrutament, etc) depenen del nom que tinguen les targetes i si aquest canvia deixaran de funcionar correctament. Per a evitar el problema de no saber com es dirà cada interfície de xarxa, les distribucions GNU/Linux utilitzen Predictable Network Interface Names que assigna identificadors estables a les interfícies de xarxa basant-se en el tipus (local Ethernet, WLAN, WWAN, etc).
El nom que reben les targetes depen del tipus (en… per a les ethernet amb cable, wl… per a les wireless o lo per a la interfície loopback). La resta del nom depen de on està instal·lada (p si està “punxada” en un port PCI, USB, etc, la targeta es dirà enpXsY; o si està en la placa i es dirà enoX). En les màquines de VirtualBox la primera sol ser la emp0s3 i la resta a partir de la enp0s8, …
Si la nostra distribució és Debian o està basada en ell (com Ubuntu, Linux Mint, Lliurex, …) i tenim entorn gràfic el servei responsable de la xarxa serà per defecte el Network Manager, encara que podem configurar el sistema per a gestionar la xarxa sense aquest servei, utilitzant netplan o ifupdown.
Per a vore o canviar la configuració podem prémer amb el ratolí sobre la icona de la xarxa i triar l’opció de Configuració de la xarxa. AIxò obri l’editor del Network Manager:
Per a configurar la xarxa des de la terminal s’utilitzen diferents sistemes segons la distribució utilitzada: les distribucions Debian utilitzen ifupdown i les Ubuntu utilitzen netplan (abans de la versió 17.10 també utilitzaven netplan)
Les principals diferències entre els dos sistemes són, entre uns altres:
/etc/network/interfaces
) i en netplan és un fitxer YAML que es troba dins de /etc/netplan/
networking
i en netplan systemd-networkd
ifup
i ifdown
i en netplan:
ip link set $targeta up
ip link set $targeta down
ifconfig
i en netplan s’ha substituït per ip
status
ens dóna la configuració de cadascun:Si li posem el nom d’una targeta ens dona la informació de la mateixa:
Abans s’utilitzava el comando ifconfig
que es troba en el paquet net-tools junt a route
i altres. Les distribucions modernes en compte d’aquest paquet inclouen el paquet iproute2util que sustitueix aquest comando pel comando ip
que és més potent. Per a veure la configuració escrivim un dels comandos:
ip addr show
ip link show
(o simplement ip a
).
Es tracta de la xarxa d’un equip amb la interfície local (localhost o lo), una targeta ethernet cablejada (enp4s0f0) i una inalàmbrica (wlp3s0). Podem veure només un resum d’aquesta informació amb ip -br a
.
Per a veure la porta d’enllaç el comando és:
ip route show
(o simplement ip r
)
Ens indica que:
Per a vore el DNS mostrem el contingut del fitxer /etc/resolv.conf
:
En aquest cas tenim com DNS principal 127.0.0.1 (és a dir aquesta màquina) i com secundari 8.8.8.8. No és convenient modificar ací els DNS perquè aquest fitxer és sobrescrit pels serveis que configuren la xarxa.
Tant els antics comandos ifconfig
com ip
ens permeten canviar al nostra configuració temporalment (per a canviar-la definitivament hem de fer-ho en els fitxers de configuració):
ip link set enp0s3 down
ifconfig enp0s3 down
ip link set enp0s3 up
ifconfig enp0s3 up
ip addr add 192.168.100.5/24 dev enp0s3
ifconfig enp0s3 add 192.168.100.5/24
ip addr del 192.168.100.5/24 dev enp0s3
ifconfig enp0s3 del 192.168.100.5/24
ip route add default via 192.168.1.1
route add default gateway 192.168.1.1
Podeu consultar més comandos en aquesta pàgina.
Tots els canvis que fem amb ip
o ifconfig
són temporals i es perden quan reiniciem la xarxa. El servei de xarxa (anomenat networking en ifupdown i systemd-networkd en netplan) quan s’inicia configura la xarxa amb el contingut del fitxer de configuració (/etc/network/interfaces
en ifupdown i /etc/netplan/nom-del-fitxer.yaml
en netplan). Per tant, per a canviar la configuració permanentment hem de canviar-la en aquest fitxer.
Ací veurem com configurar la xarxa en:
Per a canviar la configuració podem prémer amb el ratolí sobre la icona de la xarxa i triar l’opció de Editar les connexions. AIxò obri l’editor del Network Manager (també es pot obrir des de la terminal amb nm-connection-editor
):
Al seleccionar la connexió a configurar i prémer el botó Editar podem canviar la configuració. En concret anem a la pestanya de Ajustes de IPv4. L’opció per defecte és Automàtica (DHCP) que ens permet obtindre les dades de la connexió per DHCP sense haver de configurar res. Per a posar nosaltres la IP que vulguem triem el mètode Manual:
Ací podem configurar la IP, la màscara, la porta d’enllaç i els DNS i ja tenim la nostra targeta configurada.
Podem vore des de la terminal la configuració de Network Manager amb el comando nmcli
. Fins i tot podem configurar la xarxa amb el comando nmtui
(NetworkManager Text User Interface).
El fitxer de configuració de la xarxa és /etc/network/interfaces
:
La informació que trobem és:
Un altre exemple amb 2 targetes de xarxa configurades estàticament:
Podem configurar cada interfície de forma:
iface ethX inet static
iface ethX inet dhcp
Si ho fem estàticament hem d’indicar la IP (address), la màscara (netmask), la porta d’enllaç si fa falta (gateway) i els servidors DNS (dns-nameservers). També es pot indicar la xarxa (network) i l’adreça de broadcast però no és necessari perquè es pot calcular a partir de la IP i la màscara.
Després de modificar el fitxer de configuració hem de reiniciar el servei de xarxa (amb systemctl):
systemctl restart networking
o (amb el sistema d’inici SysV)
service networking restart
o directament executant l’script:
/etc/init.d/networking restart
En ocasions cal reiniciar la targeta que hem canviat amb ifdown ethX
i ifup ethX
.
Els servidors DNS es poden configurar també en el fitxer /etc/resolv.conf
encara que se sobreescriu el seu contingut amb el que indiquem en /etc/network/interfícies
en l’apartat dns-nameservers en reiniciar el servei de xarxa pel que s’ha de configurar allí. Un exemple de fitxer és:
A més en el fitxer /etc/hosts podem posar els noms que el nostre propi ordinador ha de resoldre:
Si la nostra màquina té una IP fixa hauríem d’afegir-la ací també al costat del nom del host.
El nou fitxer de configuració és un fitxer que trobem dins de /etc/netplan/
. Es tracta d’un fitxer YAML el que significa que cada opció va en una línia i si una opció és una subopció de l’anterior ha d’anar indentada cap a dins amb espais (ATENCIÓ han de ser espais, no serveix tabulador).
Exemple de fitxer d’una màquina amb una única targeta configurada per DHCP:
Si volem configurar una altra targeta i que siguen ambdues estàtiques:
ATENCIÓ: ha d’haver-hi un espai entre els : i el valor de l’opció i no pot haver-hi espais al final d’una línia.
NOTA: en versions d’Ubuntu anteriors a la 22.04 per q configurar la porta d’enllaç en compte de la secció routes
s’afegia una línia amb gateway4
(en l’exemple en compte de les 3 línies de routes tendríem una línia amb gateway4: 10.0.2.2
).
Perquè s’apliquen els canvis no és necessari reiniciar el servei de xarxa sinó que n’hi ha prou amb fer:
netplan apply
Si volem obtindre més informació de què fa o si hi ha errors li posem l’opció --debug
:
netplan --debug apply
També podem utilitzar el paràmetre try
en compte de apply
per a que ens mostre que farà abans de decidir si volem que es canvie o no la configuració de la xarxa.
Si volem fer la configuració des de l’entorn gràfic amb NetworkManager ho indiquem en el fitxer que hi ha en /etc/netplan/
, posant-ho com a renderer:
Aquesta és l’opció per defecte en distribucions amb entorn gràfic. Si volem tornar a utilitzar el fitxer canviarem el renderer a systemd (o eliminem la línia ja que systemd és l’opció per defecte):
network:
renderer: systemd
version: 2
ethernets:
...
systemd-networkd es un dimoni del sistema que gestiona les configuracions de xarxa. Detecta i configura els dispositius de xarxa segons es detecten i també pot crear dispositius de xarxa virtuals.
Per a usar systemd-networkd cal iniciar/activar el servei systemd-networkd.service
.
Totes les configuracions es guarden en fitxers en /etc/systemd/network
de tipus .network
, .netdev
i .link
.
Exemples
/etc/systemd/network/wired.network
[Match]
Name=enp1s0
[Network]
DHCP=ipv4
/etc/systemd/network/static.network
[Match]
Name=enp1s0
[Network]
Address=10.1.10.9/24
Gateway=10.1.10.1
DNS=10.1.10.1
#DNS=8.8.8.8
Més informació:
La configuració es similar a la de netplan i utilitzem també el comando ip
. Però en compte d’un fitxer on es configuren totes les targetes cadascuna té el seu propi fitxer de configuració en /etc/sysconfig/network-scripts/ifcfg-enp0sX
.
Les principals opcions que hem de configurar són:
L’opció ONBOOT indica al sistema que ha d’activar la targeta al iniciar el servei network (igual que auto en Ubuntu). BOOTPROTO indica com es configurarà la xarxa i potser dhcp, static o none.
Si volem configurar la targeta estàticament posarem:
Si no volem usar IPv6:
A més de configurar la xarxa canviant directament els fitxers podem utilitzar l’eina nmcli
que és el client del NetworkManager. Fins i tot tenim una interfície de text anomenada nmtui
(NetworkManager Text User Interface) que ens permet configurar la xarxa com es fa des de l’entorn gràfic. Podem obtindre informació de com utilitzar aquestes eines en pàgines com LinuxConfig: How to configure a static IP address on RHEL 8 / CentOS 8 Linux.
Per a reiniciar el servei de xarxa es recomana utilitzar el comando nmcli
:
nmcli nerworking off
nmcli nerworking on
Encara que també el podem reiniciar amb systemctl
systemctl restart NetworkManager.service
NOTA: En CentOS 7 i anteriors el servei en un sistema sense interfície gràfica és network.service i no tenim el comando nmcli
. Si te interfície gràfica el servei encarregat de la xarxa és també NetworkManager i és el que haurem de reiniciar.
Si hem afegit posteriorment una nova targeta no es crea el seu fitxer de configuració dins de /etc/sysconfig/network-scripts/. Si tenim entorn gràfic seleccionem la nova interfície i polsem la icona de afegir perfil (+) que apareix a la seua dreta.
Si no el tenim poder crear-ho manualment però és molt més senzill fer-ho amb nmtui
. Al obrir-ho seleccinem ‘Modificar una connexió’ i com no ens apareix polsem sobre ‘Afegir’ i seleccionem el tipus de targeta (en el nostre cas Ethernet). Ens apareix una finestra on configurar la nova targeta:
El que ens pregunta és:
Això crea el fitxer ifcfg-NomDelPerfil. Reiniciem la xarxa i ja tenim la targeta funcionant.
Si volem configurar una màquina virtual que siga el servidor de una xarxa de màquines virtuals clients haurà de tindre al menys 2 targetes de xarxa: una ‘externa’ per a connectar-se a l’enterior i una interna per a cada xarxa interna de clients que vulga connectar. Cada targeta interna la configurarem en VirtualBox com a ‘Xarxa interna’ i li assignarem un nom (és com si fóra el nom del switch al que es connecta el seu cable). Per a la interfície externa Virtualbox ens ofereix 2 opcions:
Si la xarxa no funciona podem veure els missatges d’inici relacionats amb la xarxa amb:
dmesg | grep eth
o si el nom de les nostrres targetes és enpXsY
dmesg | grep enp
Si estem configurant un servidor de comunicacions que proporcione eixida a l’exterior a una xarxa haurà de tindre al menys 2 targetes de xarxa:
Una vegada totes les targetes estiguen correctament configurades com hem vist en l’apartat anterior, perquè els clients tinguen accés a Internet haurem de configurar l’enrutamient en el servidor, la qual cosa permetrà als paquets que arriben per les targetes internes eixir a través de la targeta externa.
Si es tracta d’una màquina virtual la targeta interna la configurarem en VirtualBox com a ‘Xarxa interna’ i li assignarem un nom (és com si fóra el nom del switch al que es connecta el seu cable). Per a la interfície externa Virtualbox ens ofereix 2 opcions:
Per a configurar l’enrutament hem de fer 2 accions:
L’enrutament el que fa és redirigir a la targeta de xarxa externa el tràfic de la targeta interna amb destinació a altres xarxes (com Internet).
Per a habilitar l’enrutament editem el fitxer /etc/sysctl.conf
i descomentem la línia:
net.ipv4.ip_forward=1
En sistemes amb netplan podem utilitzar el fitxer /etc/ufw/sysctl.conf
que ho habilitarà quan iniciem el Firewal ufw. En CentOS ja està habilitat per defecte (si tinguerem que afegir opcions ho faríem en el fitxer /etc/sysctl.d/99-sysctl.conf
)
Perquè faça efecte hem de recarregar la configuració amb:
sysctl -p
També podem habilitar-ho temporalment, fins que reiniciem la màquina, executant l’ordre
echo 1 > /proc/sys/net/ipv4/ip_forward
(si en comptes de echo 1 posem echo 0 ho deshabilitem).
Per a comprovar si està habilitat executem l’ordre
cat /proc/sys/net/ipv4/ip_forward
(si retorna 1 és que està habilitat i 0 és que està deshabilitat).
Amb netplan s’utilitza el Firewal ufw (uncomplicated firewall) i és l’encarregat de gestional el NAT. Per defecte està desactivat i podem activar-ho o desactivar-ho amb els comandos ufw enable
i ufw disable
. Per a veure la configuració executem:
ufw status verbose
Per a configurar NAT hem d’activar ufw i realitzar les següents accions:
/etc/default/ufw
i canviar la línia DEFAULT_FORWARD_POLICY="DROP"
perDEFAULT_FORWARD_POLICY="ACCEPT"
/etc/ufw/before.rules
i afegir les següents línies al principi (abans de les regles de filtrat *filter). Aquest exemple és per a enrutar la xarxa interna 192.168.226.0:# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Forward traffic through eth0 - Change to match you out-interface
-A POSTROUTING -s 192.168.226.0/24 -o enp0s3 -j MASQUERADE
# don't delete the 'COMMIT' line or these nat table rules won't be processed
COMMIT
Només queda reiniciar el Firewall (ufw reload
). Per a comprovar les regles que estan aplicant-se executem el comando iptables
:
iptables -t nat -L
Si volem eliminar totes les regles que tenim ara en iptables (per a tornar-las a posar o per si ens hem equivocat):
iptables -t nat -F
NOTA: Si fem la configuració de l’enrutament des de Webmin tot funciona igual però s’enrutament l’activa en /etc/sysctl.conf
(no en /etc/ufw/sysctl.conf) i les regles de nat les guarda en /etc/iptables.up.rules (en compte de en /etc/ufw/before.rules) i les carrega afegint la següent línia a /etc/network/interfaces:
post-up iptables restore < /etc/iptables.up.rules
Des de Debian 10 (Buster) nftables reemplaça a iptables que tenia certes limitacions (podem continuar utilitzar els comandos iptables ja que el nou framework és compatible). El comando per a configurar-les és ntf
.
Podem utilitzar nftables en distribucions antigues que no ho porten per defecte, només hem d’instal·lar-les i configurar-les:
apt install nftables
systemctl enable nftables.service
Per a crear les regles d’enrutament NAT crearem una nova taula nat on activem prerouting i postrouting:
nft add table nat
Per a vore les tables creades executem nft list tables
.Si volem borrar-la farem nft delete table nat
. Ara creem la cadena de postrouting:
nft add chain nat postrouting { type nat hook postrouting priority 100 \;}
I a continuació afegim les regles que vulgam. Per exemple si la nostra targeta externa és la enp0s3 amb IP 10.0.2.20 i volem enrutar la xarxa interna 192.168.101.0, el comando per a fer-ho seria::
nft add rule nat postrouting ip saddr 192.168.101.0/24 oif enp0s3 snat 10.0.2.20
El que indiquem és d’on provindrà el tràfic a enrutar (saddr xarxa interna/màscara, és a dir, saddr 192.168.101.0/24
) a quina targeta s’enviarà (oif targeta externa, és a dir, oif enp0s3
) i que enrute a la IP que tinga la targeta externa (snat 10.0.2.20
). Si nostra IP externa pot canviar perquè estiga per DHCP hem de posar en compte de_snat_ l’opció masquerade
.
Si hem d’enrutar més d’una xarxa interna (per exemple la 192.168.101.0 i la 192.168.102.0) executem aquest comando per a cada xarxa a enrutar:
nft add rule nat postrouting ip saddr 192.168.101.0/24 oif enp0s3 masquerade
nft add rule nat postrouting ip saddr 192.168.102.0/24 oif enp0s3 masquerade
Per a veure les regles que tenim establertes ara fem:
nft list ruleset
Podem borrar totes les regles amb:
nft flush ruleset
I per a tindre eixes regles actives al iniciar el servei hem de guardar-les en el fitxer de configuració de nftables en /etc/nftables.conf. Podem fer-ho amb:
nft list ruleset > /etc/nftables.conf
Es recomana utilitzar nftables en compte de iptables que és una implementació més antiga i llimitada.
Per a configurar NAT hem d’afegir regles a iptables. Per exemple si la nostra targeta externa és la enp0s3 amb IP 10.0.2.20 i la nostra xarxa interna és la 192.168.101.0 el comando per a activar NAT seria:
iptables -t nat -A POSTROUTING -s 192.168.101.0/24 -o enp0s3 -j MASQUERADE
El que indiquem és d’on provindrà el tràfic a enrutar (-s xarxa interna/màscara, és a dir, -s 192.168.10.0/24
) a quina targeta s’enviarà (-o targeta externa, és a dir, -o enp0s3
) i que enrute a la IP que tinga la targeta externa (-j MASQUERADE
). Si nostra IP externa sempre serà la mateixa podem posar l’opció -j SNAT --to 10.0.2.20
(on 10.0.2.20 seria la IP externa) en compte de -j MASQUERADE.
Si hem d’enrutar més d’una xarxa interna repetirem aquest comando per a cada xarxa a enrutar:
iptables -t nat -A POSTROUTING -s 192.168.102.0/24 -o enp0s3 -j MASQUERADE
Per a evitar haver d’executar aquest comando cada vegada que reiniciem el sistema tenm 2 opcins:
Si instal·lem iptables-persistent ens pregunta si emmagatzema la configuració actual de iptables (v4 i v6). Si li hem dit que sí cada vegada que reiniciem el sistema carregarà automàticament aquesta configuració. Si posteriorment fem modificacions en les iptables per a que ens torne a preguntar si guarda els canvis farem
dpkg-reconfigure iptables-persistent
Per a comprovar si el nostre sistema està fent NAT executem l’ordre:
iptables -t nat - L
Si volem eliminar totes les regles que tenim ara en iptables (per a tornar-las a posar o per si ens hem equivocat):
iptables -t nat -F
En CentOS també s’utilitza un firewall per a gestionar els paquets de les diferents interfícies pel que hem de configurar-ho. Hi ha diferents zones ja creades (public, dmz, external, internal, …) i hem de configurar les zones internal i external que són les que usarem.
Per a aquest exemple tenim les targetes:
En primer lloc assignem a la zona internal la seua targeta de xarxa:
firewall-cmd --change-interface=enp0s8 --zone=internal --permanent
Fem el mateix amb la zona external:
firewall-cmd --change-interface=enp0s3 --zone=external --permanent
Posem com a zona per defecte la internal (abans era public):
firewall-cmd --set-default-zone=internal
Ara configurem l’enrutament entre les targetes interna i externa:
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -I POSTROUTING -s 192.168.100.0/24 -o enp0s3 -j SNAT --to 10.0.2.10
(com hem dit quan parlavem d’ifupdown, en compte de -j SNAT --to ...
podem posar -j MASQUERADE
)
Finalment només queda reiniciar el firewall:
firewall-cmd --reload
firewall-cmd --complete-reload
Podem veure les regles que estan aplicant-se igual que hem vist al parlar d’ifupdown.
Com hem vist hi ha moltes coses a configurar per a que un equip puga connectar-se amb internet. Per això si no hi ha connexió els motius poden ser molt variats.
Si tenim un mètode de què comprovar evitarem “tocar” configuracions que tenim correctament per provar coses. Els pasos a fer són:
Vore la configuració de la xarxa d’eixe equip per a comprovar que tot és correcte (IP, màscara, porta d’enllaç i DNS). Ho farem amb networkctl status
(si és un equip Windows amb ipconfig /all
)
ping
a la porta d’enllaç. Si la configuració és correcta fem un ping a la porta d’enllaç que ens ha mostrat el comando del pas anterior. Si falla pot ser:
ping
a un equip de fora de la xarxa. Si el ping anterior ha funcionat farem un ping a un equip de fora, per exemple al 8.8.8.8 (si estem en l’institut podem fer-ho al servidor del centre, el 172.16.20.1, perquè el router no deixa eixir els pings fora). Si falla és
nslookup
per a comprovar el DNS. El farem a algun servidor de internet (per exemple a google.com) i, si estem dins d’un domini, també al nostre domini. Si falla:
nslookup
és que no hem posat una adreça de DNS en el nostre equip o la que hem posat no és un servidor DNSSi funcionen correctament aquestes 4 coses la nostra xarxa està perfectament configurada.