Engade unha regra de política con ip rule e funciona ata que a ligazón desaparece; nese momento simplemente xa non está. Nada fallou ruidosamente: o estado do núcleo cambiou e ningún propietario de configuración sabía que a regra debía existir. Esa é toda a diferenza entre unha regra que sobrevive e unha que non. Nun equipo con systemd-networkd, a solución é darlle á regra un propietario en lugar de volver executar a orde tras cada reconexión.

Unha regra só existe se alguén a posúe

A política de encamiñamento do núcleo é estado, non configuración. Vive no sistema en marcha, e calquera cousa que derrube a interface da que depende pode levala consigo. Unha orde da consola cambia ese estado e non deixa ningún rexistro da intención.

Os xestores de rede traballan ao revés: len a configuración, aplícana e volven aplicala cando un evento da ligazón invalida o estado anterior. Unha regra declarada na súa configuración recréase, mentres que unha regra engadida ao seu lado é un obxecto alleo sen propietario.

Esa distinción ten un nome en networkd, e paga a pena lelo antes de habilitar nada. As regras alleas elimínanse por defecto nas versións recentes, o que sorprende a quen esperaba que as súas entradas manuais persistisen.

Le a versión antes de confiar nun axuste

O comportamento de propiedade contrólase cun axuste de networkd.conf, e ese axuste non existe nas versións antigas de systemd. Comproba a versión instalada antes de deseñar ao seu redor, porque un equipo antigo compórtase de forma distinta á documentación que estás lendo.

Dous valores importan. Un decide se se eliminan as regras non declaradas na configuración de networkd, e o outro fai o mesmo coas rutas. Ambos tratan da propiedade e non do contido da política, e ambos adoptan por defecto o comportamento máis estrito nas versións actuais. Desactivalos globalmente mantén viva cada regra allea, o que é unha decisión moito máis ampla que declarar unha política VPN desexada.

systemctl --version | head -1
networkctl --version | head -1
grep -R "ManageForeign" /etc/systemd/ /usr/lib/systemd/ 2>/dev/null

Ese grep diche que está definido localmente e cal é o valor por defecto do provedor. A ausencia tamén é información, porque significa que se aplica o valor compilado. Anota o valor por defecto para que a seguinte persoa non teña que redescubrilo.

Declara a regra e a táboa á que apunta

Unha regra nun ficheiro .network nomea unha táboa, e iso é todo o que fai un nome. Non crea as rutas dentro desa táboa nin comproba que teñan sentido. Declarar a regra sen as rutas produce unha política que fai coincidir o tráfico e despois o descarta.

Declara as rutas no mesmo ficheiro, con saltos seguintes alcanzables e a táboa correcta. Mantén a prioridade na regra declarada para que caia onde esperas na lista ordenada. Unha regra que chega á táboa equivocada antes do previsto cambia máis tráfico que o servizo que querías arranxar. Le o fragmento de abaixo como unha forma e non como un ficheiro completo, porque a propiedade da interface e o resto da conexión aínda deben estar presentes.

[RoutingPolicyRule]
Family=ipv4
IPProtocol=tcp
SourcePort=443
Table=100
Priority=1000

[Route]
Destination=10.80.0.0/24
Gateway=10.80.0.1
Table=100

Logo recarga e le o estado do núcleo en lugar do ficheiro. Unha configuración que se analizou limpiamente pode producir igualmente unha regra que non querías, e as dúas vistas coinciden só cando a declaración estaba completa.

Escolle un único propietario para a interface

Dous xestores nun túnel producen unha pelexa que parece un fallo en ambos. Importar unha configuración wg-quick existente en networkd é unha migración e non unha adición, e executar ambos deixa a interface e as súas regras baixo dous propietarios.

Fai a migración dunha vez: detén a unidade antiga, desactívaa, declara a interface e as súas rutas en networkd e recarga. Comproba que a unidade antiga non poida volver no arrinque. Unha unidade residual que se reactiva tras un reinicio sobrescribe o estado que acabas de declarar. Conserva o ficheiro de configuración antigo ata que o novo sobrevivise a unha reconexión, e logo retírao.

A propiedade da marca merece o mesmo coidado: se unha regra coincide cunha marca da devasa, algo ten que poñer esa marca. Unha regra que fai referencia a unha marca que ninguén pon é configuración morta que parece deliberada.

Ensaya os eventos do ciclo de vida

A configuración vale tanto como o seu comportamento ao longo dos eventos. Baixa a ligazón, sóbea, reinicia o servizo e renova o enderezo. Despois de cada un, le a lista de regras e o contido da táboa.

sudo networkctl reload
ip rule show
ip route show table 100
sudo systemctl restart systemd-networkd

O resultado buscado é a mesma política con propietario recreada e o estado obsoleto retirado, algo máis duradeiro que volver engadir unha regra da consola tras cada reconexión. Mantén unha liña no rexistro de cambios que nomee o ficheiro propietario da regra e a versión que a admite. Así o seguinte enxeñeiro pode atopar a política sen buscar nun historial da consola. Unha regra que ninguén posúe é unha regra que se volverá perder.

Artigos relacionados