Izolacja sieci Podman

Pracując z kontenerami uruchamianymi z pomocą Podmana czasami zachodzi potrzeba odizolowania możliwości komunikacji między nimi (np. kontener z reverse proxy ma przekierowywać ruch do aplikacji, ale ma nie mieć dostępu do bazy danych). Na szczęście korzystając z domyślnego sterownika (bridge network) to relatywnie proste - dla “dockerowców” jedyną przeszkodą będzie to, że działa to inaczej niż w Dockerze.

Domyślne sieci dockerowe są od siebie odizolowane. Podmanowe nie są - trzeba samodzielnie zadeklarować to poprzez isolate: true. Mając to ustawione wszystkie sieci z tą opcją tracą możliwość komunikacji z sobą (ale uwaga - domyślne sieci bez tej flagi wciąż mogą z nimi “gadać”), przy zachowaniu możliwości dostępu do “świata”.

Gdyby zaszła potrzeba kompletnie odizolowanej sieci z pomocą przychodzi opcja internal: true. Mając ją włączoną tracimy możliwość komunikacji z innymi sieciami.

Poniżej prosty plik compose umożliwiający pobawienie się tymi możliwościami:

name: pod-net-opts
services:
  app1:
    name: app1
    image: jonlabelle/network-tools
    command: tail -F anything
    networks:
      - app1-net

  app2:
    name: app2
    image: jonlabelle/network-tools
    command: tail -F anything
    networks:
        - app2-net

  app3:
    name: app3
    image: jonlabelle/network-tools
    command: tail -F anything
    networks:
        - app3-net

  app4:
    name: app4
    image: jonlabelle/network-tools
    command: tail -F anything
    networks:
        - app4-net

networks:
  # can reach outside, can be reached
  app1-net:
    name: app1-net
    driver: bridge
  # can reach outside, can't be reached from other with isolate: true 
  # but watch out - regular bridged netw still can access it
  # so app3 can't access app2 (and vice versa), but app1 can
  app2-net:
    name: app2-net
    driver: bridge
    driver_opts:
      isolate: true
  app3-net:
    name: app3-net
    driver: bridge
    driver_opts:
      isolate: true
  # fully isolated, internal network
  app4-net:
    name: app4-net
    internal: true

Te kontenery korzystają z obrazu, który ma podstawowe narzędzia sieciowe - wystarczy tylko uruchomić poprzez podman compose up, podpiąć się do terminala w kontenerze i spróbować np. ping-a :) .

Źródła:

https://docs.podman.io/en/v5.3.1/markdown/podman-network-create.1.html

Obrazek(-ki):

Steve Adams, @Unsplash