From fa58530fe5c6248c000377490d7d62ebbc6982be Mon Sep 17 00:00:00 2001 From: Djeex Date: Fri, 26 Sep 2025 13:02:01 +0000 Subject: [PATCH] Socat Proxy --- content/5.betises/2.bash/3.socat-proxy.md | 89 +++++++++++++++++++++++ public/img/betises/socat-proxy.svg | 4 + 2 files changed, 93 insertions(+) create mode 100644 content/5.betises/2.bash/3.socat-proxy.md create mode 100644 public/img/betises/socat-proxy.svg diff --git a/content/5.betises/2.bash/3.socat-proxy.md b/content/5.betises/2.bash/3.socat-proxy.md new file mode 100644 index 0000000..827dc88 --- /dev/null +++ b/content/5.betises/2.bash/3.socat-proxy.md @@ -0,0 +1,89 @@ +--- +navigation: true +title: Socat Proxy +main: + fluid: false +--- +:ellipsis{left=0px width=40rem top=10rem blur=140px} + +# Socat Proxy +--- + +Ce projet répond à un cas d'usage problématique : +- J'ai [Beszel](https://beszel.dev/), un conteneur de monitoring en mode host, nécessitant d'exposer le socket de Docker afin qu'il récupère les stats des conteneurs +- Afin de ne pas laisser le socket complètement ouvert pour Beszel, j'ai [Docker Socket Proxy](https://github.com/Tecnativa/docker-socket-proxy), un conteneur qui se place entre le scoket de docker et le conteneur qui en a besoin, et qui filtre le requêtes en paramétrant les bonnes permissions pour ne pas tout exposer au conteneur qui l'utilise. + +Problème, si __Beszel__ est en mode host, il doit contacter __Docker Socket Proxy__ directement sur un port de l'host, c'est à dire en exposant un port de __Docker Socket Proxy__. Ce qui fait que n'importe quel conteneur/application sur mon host peut l'appeler et utiliser le socket docker. + +C'est là qu'intervient [Socat Proxy](https://git.djeex.fr/Djeex/socat-proxy). Ce dernier est un conteneur qui : + +- Crée un socket UNIX +- Ecoute ce socket +- Envoie les requetes vers Docker Socket Proxy et vice versa +- Permet de remplacer le vrai socket docker en exposant le socket proxy créé, dans le conteneur final via un bind mount (ici, Beszel) + +Ainsi, un filtre comme Docker Socket Proxy dialogue avec Socat Proxy dans leur propre réseau isolé (en mode bridge), et le bind mount du socket UNIX créé est localisé sur l'host dans un dossier avec les permissions nécessaires pour ne pas etre visible des autres conteneurs/applicatifs. + +En gros : + +![](/img/betises/socat-proxy.svg) + + +Par exemple, pour Beszel cela rendrait comme ceci : + +```yaml +services: + socat-proxy: + image: git.djeex.fr/djeex/socat-proxy:latest + container_name: socat-proxy-beszel + environment: + - TARGET_HOST=${TARGET_HOST} + - TARGET_PORT=${TARGET_PORT} + - UNIX_SOCKET_PATH=${UNIX_SOCKET_PATH} + - HOST_SOCKET_PATH=${HOST_SOCKET_PATH} + - UNIX_SOCKET_NAME=${UNIX_SOCKET_NAME} + volumes: + - ${HOST_SOCKET_PATH}:${UNIX_SOCKET_PATH} + restart: unless-stopped + depends_on: + - ${TARGET_HOST} + + socket-proxy: + image: lscr.io/linuxserver/socket-proxy:latest + container_name: ${TARGET_HOST} + security_opt: + - no-new-privileges:true + environment: + - CONTAINERS=1 + - INFO=1 + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + restart: unless-stopped + read_only: true + tmpfs: + - /run + + beszel-agent: + image: henrygd/beszel-agent:latest + container_name: beszel-agent + restart: unless-stopped + network_mode: host + security_opt: + - no-new-privileges:true + volumes: + - ${HOST_SOCKET_PATH}/${UNIX_SOCKET_NAME}:/var/run/docker.sock:ro + environment: + - #... your Beszel environment var + depends_on: + - socat-proxy +``` + +Plus d'infos directement sur le repo : + + + ::card + #title + 🐋 __Socat Proxy__ + #description + [A lighteweight bind mount socket proxy](https://git.djeex.fr/Djeex/socat-proxy) + :: diff --git a/public/img/betises/socat-proxy.svg b/public/img/betises/socat-proxy.svg new file mode 100644 index 0000000..21f6b87 --- /dev/null +++ b/public/img/betises/socat-proxy.svg @@ -0,0 +1,4 @@ + + +HostIsolated docker bridge networkDocker socket ProxyCustom filterSocat-Proxy Host storageContainer in Host mode Host Network- Host apps- Other host containers- OS....- External request...Strict permission folder.../custom/docker.sock#root/var/run/docker.sockSocat Proxy - secureHostIsolated docker bridge networkDocker socket ProxyCustom filter Host storageContainer in Host mode Host Network#root/var/run/docker.sockSocket Proxy with exposed port - insecureExposed port- Host apps- Other host containers- OS....- External request...Host Host storageContainer in Host mode Host Network#root/var/run/docker.sockFull access to docker socket - Higly insecure- Host apps- Other host containers- OS....- External request... \ No newline at end of file