# NetworkManager

**NetworkManager** és un servei de sistema (dimoni) que s'encarrega de gestionar automàticament les connexions de xarxa a Linux.

# 1. Funcions principals

**Detecta i gestiona dispositius de xarxa**
Ethernet, Wi-Fi, mòbil (3G/4G), VPN, bridges, bonds, VLANs... Quan connectes un cable o t'apropes a una xarxa Wi-Fi coneguda, NetworkManager ho detecta i actua.

**Gestiona perfils de connexió**
Cada xarxa configurada es guarda com un fitxer `.nmconnection` a `/etc/NetworkManager/system-connections/`. Aquests perfils contenen IP, DNS, gateway, credencials Wi-Fi, etc.

**Automatitza DHCP i DNS**
Quan una connexió s'activa, NetworkManager llança un client DHCP intern (o delega a `dhclient`/`dhcpcd`) i configura `/etc/resolv.conf` amb els DNS rebuts.

**Reacciona a canvis**
Si desconnectes un cable, apagues el Wi-Fi o canvies de xarxa, NetworkManager ho detecta i reconfigura les rutes i adreces automàticament, sense intervenció manual.

# 2. Arquitectura

![Arquitectura NetworkManager](https://proferamon.com/tic/imatges/nmcli/nmcli01.png)

# 3. Com s'executa

És un servei systemd:

```bash
systemctl status NetworkManager   # comprova l'estat
systemctl enable NetworkManager   # activa a l'arrencada
systemctl restart NetworkManager  # reinicia
```

# 4. On desa la configuració

| Ruta | Contingut |
|---|---|
| `/etc/NetworkManager/system-connections/` | Perfils de connexió (`.nmconnection`) |
| `/etc/NetworkManager/NetworkManager.conf` | Configuració global del servei |
| `/run/NetworkManager/` | Estat en temps real |

# 5. Relació amb altres eines

| Eina | Relació |
|---|---|
| `netplan` | A Ubuntu, genera configuració per a NetworkManager |
| `systemd-networkd` | Alternativa a NetworkManager (més minimalista) |
| `ifupdown` | El tradicional sistema de Debian (`/etc/network/interfaces`) |
| `ip`, `ss` | Eines de baix nivell; no parlen amb NetworkManager |

# 6. Quan NO és present

En servidors Debian ni tan sols s'instal·la en favor de `ifupdown` o `systemd-networkd`, perquè NetworkManager està pensat principalment per a entorns d'escriptori on la xarxa canvia sovint. En servidors la xarxa és estàtica i no cal tanta automatització.

# 7. L'eina nmcli

**nmcli** (NetworkManager Command Line Interface) és l'eina de línia d'ordres per interactuar amb **NetworkManager**, el servei que gestiona les connexions de xarxa a la majoria de distribucions Linux modernes.

## 7.1. Què permet fer nmcli?

| Àmbit | Exemples |
|---|------|
| Connexions | crear, modificar, esborrar, activar, desactivar |
| Dispositius | veure estat, connectar, desconnectar |
| Wi-Fi | escanejar xarxes, connectar-se |
| VPN | activar/desactivar túnels |
| Monitoratge | veure esdeveniments en temps real |

## 7.2. On desa la configuració?

```bash
ls -l /etc/NetworkManager/system-connections/
# Fitxers .nmconnection per cada perfil
```

```ini
total 8
-rw------- 1 root root 241  2 de març  22:58 'Perfil 1.nmconnection'
-rw------- 1 root root 274  2 de març  21:51  XSF4.nmconnection
```

## 7.3. Verifica que el servei funciona

```bash
systemctl status NetworkManager
```

```ini
● NetworkManager.service - Network Manager
     Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; preset: enabled)
     Active: active (running) since Mon 2026-08-17 09:37:29 CEST; 2h 27min ago
 Invocation: 49daf51aeb8445c59d30ab13766aa12c
       Docs: man:NetworkManager(8)
   Main PID: 1015 (NetworkManager)
      Tasks: 4 (limit: 18484)
     Memory: 18.5M (peak: 19.2M)
        CPU: 1.274s
     CGroup: /system.slice/NetworkManager.service
             └─1015 /usr/sbin/NetworkManager --no-daemon

d’ag. 17 09:37:32 debian NetworkManager[1015]: <info>  [1786952252.8728] device (enp2s0): state change: ip-config -> ip-check (reason 'none', managed-type: 'full')
d’ag. 17 09:37:32 debian NetworkManager[1015]: <info>  [1786952252.8752] device (enp2s0): state change: ip-check -> secondaries (reason 'none', managed-type: 'full')
d’ag. 17 09:37:32 debian NetworkManager[1015]: <info>  [1786952252.8753] device (enp2s0): state change: secondaries -> activated (reason 'none', managed-type: 'full')
d’ag. 17 09:37:32 debian NetworkManager[1015]: <info>  [1786952252.8757] manager: NetworkManager state is now CONNECTED_SITE
d’ag. 17 09:37:32 debian NetworkManager[1015]: <info>  [1786952252.8759] device (enp2s0): Activation: successful, device activated.
d’ag. 17 09:37:32 debian NetworkManager[1015]: <info>  [1786952252.8765] manager: NetworkManager state is now CONNECTED_GLOBAL
d’ag. 17 09:37:32 debian NetworkManager[1015]: <info>  [1786952252.8769] manager: startup complete
d’ag. 17 09:37:34 debian NetworkManager[1015]: <info>  [1786952254.7635] agent-manager: agent[71095e79ad443ed4,:1.33/org.gnome.Shell.NetworkAgent/110]: agent registered
d’ag. 17 09:37:44 debian NetworkManager[1015]: <info>  [1786952264.0885] agent-manager: agent[b61604e252de9593,:1.82/org.gnome.Shell.NetworkAgent/1000]: agent registered
d’ag. 17 09:50:53 debian NetworkManager[1015]: <info>  [1786953053.5077] manager: (vboxnet0): new Ethernet device (/org/freedesktop/NetworkManager/Devices/4)
```

En resum: **nmcli és el frontend de terminal per a NetworkManager**, equivalent a fer clic a la icona de xarxa de l'escriptori però des de la línia d'ordres, amb accés a totes les opcions avançades.

## 7.4. Connexions configurades

```bash
nmcli connection show
# o abreujat
nmcli con show
```

```ini
NAME      UUID                                  TYPE      DEVICE 
Perfil 1  61dc0363-5f64-411c-ab1e-73b3f32a67f0  ethernet  enp2s0 
lo        78b420db-f49f-488e-8e72-0c3d32c328b2  loopback  lo     
XSF4      d5d0bf8b-200e-4528-b5a7-ac2a495ae9c5  wifi      --     
```

## 7.5. Dispositius de xarxa (interfícies físiques/virtuals)

```bash
nmcli device show
# o abreujat
nmcli dev show
```

Sortida:

```ini
GENERAL.DEVICE:                         enp2s0
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         48:21:0B:37:C4:CB
GENERAL.MTU:                            1500
GENERAL.STATE:                          100 (connectat)
GENERAL.CONNECTION:                     Perfil 1
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/2
WIRED-PROPERTIES.CARRIER:               actiu
IP4.ADDRESS[1]:                         192.168.1.43/24
IP4.GATEWAY:                            192.168.1.1
IP4.ROUTE[1]:                           dst = 192.168.1.0/24, nh = 0.0.0.0, mt = 100
IP4.ROUTE[2]:                           dst = 0.0.0.0/0, nh = 192.168.1.1, mt = 100
IP4.DNS[1]:                             80.58.61.250
IP4.DNS[2]:                             80.58.61.254
IP4.DOMAIN[1]:                          Home
IP4.WINS[1]:                            192.168.1.1
IP6.GATEWAY:                            --

GENERAL.DEVICE:                         lo
GENERAL.TYPE:                           loopback
GENERAL.HWADDR:                         00:00:00:00:00:00
GENERAL.MTU:                            65536
GENERAL.STATE:                          100 (connected (externally))
GENERAL.CONNECTION:                     lo
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/1
IP4.ADDRESS[1]:                         127.0.0.1/8
IP4.GATEWAY:                            --
IP6.ADDRESS[1]:                         ::1/128
IP6.GATEWAY:                            --

GENERAL.DEVICE:                         wlo1
GENERAL.TYPE:                           wifi
GENERAL.HWADDR:                         56:27:41:93:2C:2B
GENERAL.MTU:                            1500
GENERAL.STATE:                          20 (no disponible)
GENERAL.CONNECTION:                     --
GENERAL.CON-PATH:                       --
IP4.GATEWAY:                            --
IP6.GATEWAY:                            --

GENERAL.DEVICE:                         vboxnet0
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         0A:00:27:00:00:00
GENERAL.MTU:                            1500
GENERAL.STATE:                          10 (sense gestió)
GENERAL.CONNECTION:                     --
GENERAL.CON-PATH:                       --
WIRED-PROPERTIES.CARRIER:               inactiu
IP4.GATEWAY:                            --
IP6.GATEWAY:                            --
```

```bash
# Només una interfície concreta
nmcli dev show enp2s0
```

## 7.6. Resum de l'estat de les interfícies

```bash
nmcli device status
# o abreujat
nmcli dev status
```

Exemple de sortida:

```ini
DEVICE    TYPE      STATE                   CONNECTION 
enp2s0    ethernet  connectat               Perfil 1   
lo        loopback  connected (externally)  lo         
wlo1      wifi      no disponible           --         
vboxnet0  ethernet  sense gestió            --         
```

## 7.7. Detalls d'una connexió concreta

```bash
nmcli con show "Perfil 1"

# Filtrar per IP
nmcli con show "Perfil 1" | grep IP4
```

## 7.8. Format compacte (com ifconfig/ip a)

```bash
# sense arguments ja mostra un resum de tot
nmcli
```

```ini
enp2s0: connectat to Perfil 1
        "Intel I225-LM"
        ethernet (igc), 48:21:0B:37:C4:CB, hw, mtu 1500
        ip4 default
        inet4 192.168.1.43/24
        route4 192.168.1.0/24 metric 100
        route4 default via 192.168.1.1 metric 100

lo: connected (externally) to lo
        "lo"
        loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536
        inet4 127.0.0.1/8
        inet6 ::1/128

wlo1: no disponible
        "Intel 6 AX201"
        wifi (iwlwifi), 56:27:41:93:2C:2B, sw disabled, hw, mtu 1500

vboxnet0: sense gestió
        "vboxnet0"
        ethernet (vboxnet), 0A:00:27:00:00:00, hw, mtu 1500

DNS configuration:
        servers: 80.58.61.250 80.58.61.254
        domains: Home
        interface: enp2s0

Use "nmcli device show" to get complete information about known devices and
"nmcli connection show" to get an overview on active connection profiles.

Consult nmcli(1) and nmcli-examples(7) manual pages for complete usage details.
```

En general:

- `nmcli con` → parla de **perfils de connexió** (configuració guardada)
- `nmcli dev` → parla de **dispositius físics** (estat real de la interfície)

## 7.9. Modificacions

L'ordre `sudo nmcli con modify "Perfil 1"` permet modificar qualsevol paràmetre d'una connexió de NetworkManager.

### Paràmetres IPv4

```bash
# Tipus de configuració (manual o automàtica)
sudo nmcli con modify "Perfil 1" ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns "8.8.8.8,8.8.4.4"
sudo nmcli con modify "Perfil 1" ipv4.method auto

# Adreça IP i màscara
sudo nmcli con modify "Perfil 1" ipv4.addresses "192.168.1.100/24"

# Porta d'enllaç (gateway)
sudo nmcli con modify "Perfil 1" ipv4.gateway "192.168.1.1"

# DNS (un o més, separats per comes)
sudo nmcli con modify "Perfil 1" ipv4.dns "8.8.8.8,8.8.4.4"

# Dominis de cerca DNS
sudo nmcli con modify "Perfil 1" ipv4.dns-search "thos.local"

# Rutes estàtiques
sudo nmcli con modify "Perfil 1" ipv4.routes "10.0.0.0/8 192.168.1.1"
```

### Paràmetres IPv6

```bash
sudo nmcli con modify "Perfil 1" ipv6.method ignore   # Desactivar IPv6
sudo nmcli con modify "Perfil 1" ipv6.method auto
sudo nmcli con modify "Perfil 1" ipv6.method manual ipv6.addresses fd00::100/64 ipv6.gateway fd00::1 ipv6.dns "2001:4860:4860::8888,2001:4860:4860::8844"
```

### Paràmetres de connexió generals

```bash
# Nom de la connexió
sudo nmcli con modify "Perfil 1" connection.id "nova-connexio"

# Interfície associada
sudo nmcli con modify "Perfil 1" connection.interface-name enp2s0

# Activar/desactivar connexió automàtica en engegar
sudo nmcli con modify "Perfil 1" connection.autoconnect yes
sudo nmcli con modify "Perfil 1" connection.autoconnect no

# Prioritat d'autoconnexió (major número = més prioritat)
sudo nmcli con modify "Perfil 1" connection.autoconnect-priority 10
```

### Paràmetres Ethernet (capa 2)

```bash
# MAC address personalitzada
sudo nmcli con modify "Perfil 1" ethernet.cloned-mac-address "AA:BB:CC:DD:EE:FF"

# MTU
sudo nmcli con modify "Perfil 1" ethernet.mtu 9000

# Forçar 100 Mb/s full dúplex (sense autonegociació; l'altre extrem ha de tenir el mateix mode)
sudo nmcli con modify "Perfil 1" ethernet.auto-negotiate no ethernet.speed 100 ethernet.duplex full

# Limitar l'anunci a 1 Gb/s full dúplex (amb autonegociació; a 1 Gb/s o més és obligatòria)
sudo nmcli con modify "Perfil 1" ethernet.auto-negotiate yes ethernet.speed 1000 ethernet.duplex full

# Tornar al comportament per defecte
sudo nmcli con modify "Perfil 1" ethernet.auto-negotiate yes ethernet.speed 0 ethernet.duplex ""
```

### Esborra un valor (posar-lo a buit)

```bash
# Treure DNS configurats
sudo nmcli con modify "Perfil 1" ipv4.dns ""

# Treure rutes estàtiques
sudo nmcli con modify "Perfil 1" ipv4.routes ""
```

### Aplica els canvis

Els canvis no s'apliquen fins que es reactiva la connexió:

```bash
sudo nmcli con down "Perfil 1" && sudo nmcli con up "Perfil 1"
```

O de forma més ràpida:

```bash
sudo nmcli con up "Perfil 1"
```

Per configurar la connexió perquè obtingui l'adreça IP automàticament via DHCP:

```bash
sudo nmcli con modify "Perfil 1" ipv4.method auto
sudo nmcli con modify "Perfil 1" ipv4.addresses ""
sudo nmcli con modify "Perfil 1" ipv4.gateway ""
sudo nmcli con modify "Perfil 1" ipv4.dns ""
```

> [!WARNING]
> Els camps `addresses`, `gateway` i `dns` s'han de buidar explícitament, perquè si `method` passa a `auto`, però hi ha valors estàtics guardats, NetworkManager pot combinar-los o generar conflictes.

I després reactiva la connexió:

```bash
sudo nmcli con up "Perfil 1"
```

Per verificar que ha agafat adreça del DHCP:

```bash
nmcli con show "Perfil 1" | grep IP4
# o
ip a show enp2s0
```

#### Versions d'aquest document

> + [HTML](https://proferamon.com/tic/nmcli.html)
> + [PDF](https://proferamon.com/tic/pdf/nmcli.pdf)
> + [ODT](https://proferamon.com/tic/odt/nmcli.odt)
> + [MD](https://proferamon.com/tic/md/nmcli.md)

[Domini Públic (CC0)](https://creativecommons.org/publicdomain/zero/1.0/deed.ca)
