Docker : can’t create socket (must run as root?) : Permission denied

Dans le cadre de la dockerisation de proxy Zabbix, je suis tombé sur un problème étrange.

Je fais les commandes suivantes :

docker run -it zabbix/zabbix-proxy-sqlite3:ubuntu-3.4-latest /bin/bash
[...]
root@220fab01aae4:/var/lib/zabbix# fping palc.fr
palc.fr is alive
root@220fab01aae4:/var/lib/zabbix# su - zabbix -s /bin/bash
zabbix@220fab01aae4:~$ fping palc.fr
(null): can't create socket (must run as root?) : Permission denied

Note : l’option -it /bin/bash me permets d’avoir directement un bash pour faire mes tests. Lors d’un lancement de Docker en prod, il faudrait utiliser les options -d -t à la place.

Note 2 : vous pouvez également avoir une erreur du type socket: Operation not permitted.

Dans le container Docker, la commande fping fonctionne en root mais pas avec l’utilisateur Zabbix. Pourtant sur le système host, qui utilise le même OS, ça fonctionne bien.

Pour corriger le problème il faut simplement ajouter l’option --sysctl net.ipv4.ping_group_range="0 65535" à la commande lançant le container docker. Ça permets à n’importe quel utilisateur d’accéder directement au réseau de l’hôte, ce qui est indispensable pour effectuer des requêtes ICMP, comme le ping. Dans le cas contraire, seul l’utilisateur root serait autorisé à le faire.

TeamViewer : Pas prêt. Veuillez vérifier votre connexion.

J’’ai récemment dû utiliser TeamViewer dans le cadre de mon travail. Mais il restait bloqué indéfiniment sur l’erreur « Pas prêt. Veuillez vérifier votre connexion. » :

Impossible d’entrer un ID de connexion, ou quoi que ce soit.

La cause de ce problème est simple. Au démarrage TeamViewer fait un test de connexion sur un DNS du type masterX.teamviewer.com (X étant un nombre). Mais comme les DNS sont configurés avec les pieds, si vous êtres en IPv6 il se peut que la résolution se fasse n’importe comment et échoue. La seule solution est de désactiver IPv6 sur votre ordinateur.

Sur un Ubuntu ça se fait de la manière suivante :

  • Éditez le fichier /etc/sysctl.d/99-sysctl.conf
  • Rajoutez les trois lignes suivantes à la fin :
    net.ipv6.conf.all.disable_ipv6 = 1
    net.ipv6.conf.default.disable_ipv6 = 1
    net.ipv6.conf.lo.disable_ipv6 = 1
  • Rechargez la configuration avec sudo sysctl -p
  • Relancez TeamViewer

Notez que ça désactivera complètement IPv6 pour le système d’exploitation entier.