#29785·podman

Bug report: intermittent `host.containers.internal` forwarding timeout on rootful macOS Podman machines

Author: rwalleCreated Sep 16, 2026Updated Sep 17, 2026
Labelskind/bugremotemacosmachinetriaged

Issue Description

On a rootful macOS Podman machine, a Squid proxy running under podman compose intermittently fails to reach a host listener via its cache_peer at host.containers.internal (192.168.127.254): about 40% of requests through the proxy fail (Squid HIER_NONE/502) even though the host listener is healthy the whole time. The same Compose topology on a rootless machine on the same host never fails. This points to a rootful-specific problem in the container→host forwarding path (libkrun / gvproxy / netavark).

The reproduction deliberately uses the realistic topology — a Squid cache_peer targeting host.containers.internal, started via podman compose — because simpler setups (a direct connection, a bare podman run) were more reliable in our testing. The failure surfaces through the Squid + Compose path, so the reproducer keeps that full stack rather than reducing it to a bare connection.

Steps to reproduce the issue

See attached script. It is self-contained: it creates a disposable VM, runs N cycles, then removes it and restores the previous machine. Each cycle starts a fresh host HTTP listener, brings up a small Compose stack, and makes container→host requests via host.containers.internal.

podman-host-forwarding-repro.public.sh

Requirements: podman, python3, and curl in PATH, and internet access to pull two public images (docker.io/curlimages/curl and docker.io/ubuntu/squid). No sudo needed. Runs entirely from a macOS terminal.

Warning — it changes your Podman state (and restores it on exit): the script stops your currently running Podman machine, creates a disposable machine, and switches the default connection to it for the duration. On exit (including Ctrl-C) it removes the disposable machine and restarts the original machine and default connection.

1. bash podman-host-forwarding-repro.public.sh --mode rootful  --cycles 20
2. bash podman-host-forwarding-repro.public.sh --mode rootless --cycles 20
3. rootful reports ~40% failed cycles; rootless reports 0.

Describe the results you received

On a rootful machine, requests through the Squid proxy fail intermittently (~40% of cycles), while the host still reaches its own listener:

  • Agent request through Squid: HTTP 502 (curl: (22)), and the CONNECT tunnel fails the same way.
  • Squid's log for the same request: TCP_MISS_ABORTED/502 ... HIER_NONE — Squid never established a connection to the host peer.
  • Host self-check during the same failing cycle: curl http://127.0.0.1:PORT/ returns 200, so the listener is up.
  • /etc/hosts maps 192.168.127.254 host.containers.internal; VM routing is normal.

Passing and failing cycles interleave, so it is a per-connection intermittency, not a warmup effect.

Describe the results you expected

Every container→host connection to host.containers.internal should succeed while the host listener is up — as it does 100% of the time on rootless.

podman info output

yaml
Client:
  APIVersion: 6.1.2
  BuildOrigin: pkginstaller
  Built: 1789516849
  BuiltTime: Tue Sep 15 20:00:49 2026
  GitCommit: 04f3aa430e6df81bea059978bc5bafbc846ba3e7
  GoVersion: go1.27.1
  Os: darwin
  OsArch: darwin/arm64
  Version: 6.1.2
host:
  arch: arm64
  buildahVersion: 1.45.1
  cdiSpecDirs:
  - /etc/cdi
  - /var/run/cdi
  cgroupControllers:
  - cpuset
  - cpu
  - io
  - memory
  - pids
  - rdma
  - misc
  - dmem
  cgroupManager: systemd
  cgroupVersion: v2
  conmon:
    package: conmon-2.2.1-2.fc44.aarch64
    path: /usr/bin/conmon
    version: 'conmon version 2.2.1, commit: '
  cpuUtilization:
    idlePercent: 93.74
    systemPercent: 4.57
    userPercent: 1.69
  cpus: 5
  databaseBackend: sqlite
  distribution:
    distribution: fedora
    variant: podman-machine-os
    version: "44"
  emulatedArchitectures:
  - linux/386
  - linux/amd64
  - linux/arm64be
  eventLogger: journald
  freeLocks: 2046
  hostname: localhost.localdomain
  idMappings:
    gidmap: null
    uidmap: null
  kernel: 7.1.10-200.fc44.aarch64
  linkmode: dynamic
  logDriver: journald
  memAvailable: 1525014528
  memFree: 890949632
  memTotal: 2033741824
  networkBackend: netavark
  networkBackendInfo:
    backend: netavark
    defaultNetwork: podman
    dns:
      package: aardvark-dns-2.1.0-1.fc44.aarch64
      path: /usr/libexec/podman/aardvark-dns
      version: aardvark-dns 2.1.0
    package: netavark-2.1.0-1.fc44.aarch64
    path: /usr/libexec/podman/netavark
    version: netavark 2.1.0
  ociRuntime:
    name: crun
    package: crun-1.29.1-1.fc44.aarch64
    path: /usr/bin/crun
    version: |-
      crun version 1.29.1
      commit: f0d911de5587342cfeb16473bf32ecdfeaf25957
      rundir: /run/crun
      spec: 1.0.0
      +SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +CRIU +LIBKRUN +WASM:wasmedge +JSON_C
  os: linux
  pasta:
    executable: /usr/bin/pasta
    package: passt-0^20260728.gf8df3f1-2.fc44.aarch64
    version: |
      pasta 0^20260728.gf8df3f1-2.fc44.aarch64-pasta
      Copyright Red Hat
      GNU General Public License, version 2 or later
        <https://www.gnu.org/licenses/old-licenses/gpl-2.0.html>
      This is free software: you are free to change and redistribute it.
      There is NO WARRANTY, to the extent permitted by law.
  remoteSocket:
    exists: true
    path: unix:///run/podman/podman.sock
  rootlessNetworkCmd: pasta
  rootlessPortForwarder: rootlessport
  security:
    apparmorEnabled: false
    capabilities: CAP_CHOWN,CAP_DAC_OVERRIDE,CAP_FOWNER,CAP_FSETID,CAP_KILL,CAP_NET_BIND_SERVICE,CAP_SETFCAP,CAP_SETGID,CAP_SETPCAP,CAP_SETUID,CAP_SYS_CHROOT
    rootless: false
    seccompEnabled: true
    seccompProfilePath: /usr/share/containers/seccomp.json
    selinuxEnabled: true
  serviceIsRemote: true
  swapFree: 0
  swapTotal: 0
  uptime: 0h 0m 37.00s
  variant: v8
plugins:
  authorization: null
  log:
  - k8s-file
  - none
  - passthrough
  - journald
  network:
  - bridge
  - macvlan
  - ipvlan
  volume:
  - local
registries:
  search:
  - docker.io
store:
  containerStore:
    number: 0
    paused: 0
    running: 0
    stopped: 0
  graphDriverName: overlay
  graphOptions:
    additionalImageStores:
    - /usr/lib/containers/storage
    imagestore: /usr/lib/containers/storage
    overlay.mountopt: nodev,metacopy=on
  graphRoot: /var/lib/containers/storage
  graphRootAllocated: 106769133568
  graphRootUsed: 4276781056
  graphStatus:
    Backing Filesystem: xfs
    Native Overlay Diff: "false"
    Supports d_type: "true"
    Supports shifting: "true"
    Supports volatile: "true"
    Using metacopy: "true"
  imageCopyTmpDir: /var/tmp
  imageStore:
    number: 2
  runRoot: /run/containers/storage
  transientStore: false
  volumePath: /var/lib/containers/storage/volumes
version:
  APIVersion: 6.1.2
  BuildOrigin: 'Copr: packit/podman-container-tools-podman-29779'
  Built: 1789430400
  BuiltTime: Mon Sep 14 20:00:00 2026
  GitCommit: 04f3aa430e6df81bea059978bc5bafbc846ba3e7
  GoVersion: go1.26.8-X:nodwarf5
  Os: linux
  OsArch: linux/arm64
  Version: 6.1.2

Podman in a container

No

Privileged Or Rootless

Privileged

Upstream Latest Release

Yes

Additional environment details

M5 Macbook Air, macOS 26.5.1

Additional information

No response

Source: podman-container-tools/podman