2 votes

Exécuter un service dans son propre espace de noms ip netns sur Ubuntu 16.04

J'avais l'habitude de lancer les services dans 14.04 en exécutant

ip netns exec namespacename service start servicename

Mais je me suis rendu compte que cela ne fonctionne plus sous 16.04. Le service démarre dans l'espace de noms normal.

J'ai essayé de modifier le fichier /lib/systemd/system/servicename.service pour utiliser l'espace de noms mais sans succès. Le premier problème était que le programme était exécuté avec son propre utilisateur qui n'a pas accès aux espaces de noms. Je l'ai modifié pour exécuter le programme en tant que root puis utiliser sudo dans ExecStart mais pour une raison quelconque, le contrôle du service n'est jamais revenu à l'invite de commande.

Avez-vous des idées sur la façon d'accomplir un service pour qu'il s'exécute automatiquement et en permanence dans un espace de nom à chaque fois qu'il est redémarré sur Ubuntu 16.04 ?

Si cela a de l'importance, le service en question est transmission-daemon.

UPDATE :

J'ai réussi à le faire fonctionner avec le fichier .service suivant. Dans ce fichier, 'vpn' est le nom de l'espace de nom. Mon problème était de définir le mauvais Type pour le service. Je continue à penser que cette solution n'est pas la meilleure. Si vous avez une meilleure solution, dites-le nous !

[Unit]
Description=Transmission BitTorrent Daemon
After=network.target

[Service]
User=root
Type=simple
ExecStart=/bin/sh -c 'exec /sbin/ip netns exec vpn /usr/bin/sudo -u debian-transmission /usr/bin/transmission-daemon -f --log-error --config-dir /var/lib/transmission-daemon/info'
ExecReload=/bin/kill -s HUP $MAINPID

[Install]
WantedBy=multi-user.target

2voto

dmytro.poliarush Points 196

Trouvé récemment dans man systemd.exec(5)

PrivateNetwork=
           Takes a boolean argument. If true, sets up a new network namespace for the executed processes and configures only the loopback network device
           "lo" inside it. No other network devices will be available to the executed process. This is useful to turn off network access by the executed
           process. Defaults to false. It is possible to run two or more units within the same private network namespace by using the JoinsNamespaceOf=
           directive, see systemd.unit(5) for details. Note that this option will disconnect all socket families from the host, this includes AF_NETLINK
           and AF_UNIX. The latter has the effect that AF_UNIX sockets in the abstract socket namespace will become unavailable to the processes
           (however, those located in the file system will continue to be accessible).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X