I start the Kafka cluster in docker containers on Ubuntu 20.04 guest running on Windows VirtualBox host.
When it runs locally I can connect to kafka cluster with kcat using the following
bootstrap.servers=localhost:29092,localhost:29093,localhost:29094
The Web UIs kafdrop and provectuslabs/kafka-ui are also working fine from localhost.
Windows machine connected to the modem via WiFi. On the modem side, I assigned the static address to Windows host 192.168.0.25 and created advertised listeners EXTERNAL_REMOTE_HOST://192.168.0.25:29082 (see my docker-compose below)
I created inbound rules to pass Internet traffic on Windows host for ports 29082-29084 and forwarded this ports to Ubuntu 20.04 guest changing VirtualBox settings for Ubuntu guest virtual machine.
I have another computer, lets call it remote host, which I assigned the IP address 192.168.0.21 on the modem side. It is connected to the modem by cable and shares the same network 192.168.0.*.
The connection from remote host 192.168.0.21 to Ubuntu guest running on Windows VirtualBox is successful.
# Ubuntu 20.04 on 192.168.0.21
ip a
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:94:62:db brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.21/24 brd 192.168.0.255 scope global noprefixroute enp1s0
       valid_lft forever preferred_lft forever
    inet6 fe80::bd3c:b937:87b8:8a05/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
# try to connect to Ubuntu guest on Windows VirtualBox
nc -zvw10 192.168.0.25 29082
Connection to 192.168.0.25 29082 port [tcp/*] succeeded!
But connection from remote host 192.168.0.21 to Kafka cluster fails
# Ubuntu 20.04 on 192.168.0.21
cat ~/.config/kcat.conf 
bootstrap.servers=192.168.0.25:29082,192.168.0.25:29083,192.168.0.25:29084
kcat -L
% ERROR: Failed to acquire metadata: Local: Broker transport failure (Are the brokers reachable? Also try increasing the metadata timeout with -m <timeout>?)
What is wrong with my Kafka brokers configuration?
My docker-compose is:
version: '3.0'
services:
  zookeeper:
    image: myown/kafka:1.0
    hostname: zookeeper
    container_name: zookeeper
    networks: 
      - kafka
    links: 
     - "proxy"
    volumes:
      - /opt/kafka/zookeeper:/opt/kafka/zookeeper
    environment:
      ZOOKEEPER_ADDRESS: localhost
      ZOOKEEPER_PORT: 29090
      ZOOKEEPER_ID: 0
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
  kafka-broker-0:
    image: myown/kafka:1.0
    build: .
    hostname: kafka-broker-0
    container_name: kafka-broker-0
    depends_on:
      - zookeeper
    networks: 
      - kafka
    links:
      - "zookeeper"
    ports:
      - "29092:29092"
      - "29082:29082"
    volumes:
      - /opt/kafka/log:/opt/kafka/log
    environment:
      KAFKA_BROKER_ID: 0
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: INTERNAL://kafka-broker-0:9082,INTERNAL_NETWORK://kafka-broker-0:9092,EXTERNAL_HOST://0.0.0.0:29092,EXTERNAL_REMOTE_HOST://0.0.0.0:29082
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-broker-0:9082,INTERNAL_NETWORK://kafka-broker-0:9092,EXTERNAL_HOST://localhost:29092,EXTERNAL_REMOTE_HOST://192.168.0.25:29082
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,INTERNAL_NETWORK:PLAINTEXT,EXTERNAL_HOST:PLAINTEXT,EXTERNAL_REMOTE_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
      DELETE_TOPIC_ENABLE: "true"
  kafka-broker-1:
    image: myown/kafka:1.0
    hostname: kafka-broker-1
    container_name: kafka-broker-1
    depends_on:
      - zookeeper
    networks: 
      - kafka
    links:
      - "zookeeper"
    ports:
      - "29093:29093"
      - "29083:29083"
    volumes:
      - /opt/kafka/log:/opt/kafka/log
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: INTERNAL://kafka-broker-1:9082,INTERNAL_NETWORK://kafka-broker-1:9092,EXTERNAL_HOST://0.0.0.0:29093,EXTERNAL_REMOTE_HOST://0.0.0.0:29083
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-broker-1:9082,INTERNAL_NETWORK://kafka-broker-1:9092,EXTERNAL_HOST://localhost:29093,EXTERNAL_REMOTE_HOST://192.168.0.25:29083
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,INTERNAL_NETWORK:PLAINTEXT,EXTERNAL_HOST:PLAINTEXT,EXTERNAL_REMOTE_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
      DELETE_TOPIC_ENABLE: "true"
  kafka-broker-2:
    image: myown/kafka:1.0
    hostname: kafka-broker-2
    container_name: kafka-broker-2
    depends_on:
      - zookeeper
    networks: 
      - kafka
    links:
      - "zookeeper"
    ports:
      - "29094:29094"
      - "29084:29084"
    volumes:
      - /opt/kafka/log:/opt/kafka/log
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: INTERNAL://kafka-broker-2:9082,INTERNAL_NETWORK://kafka-broker-2:9092,EXTERNAL_HOST://0.0.0.0:29094,EXTERNAL_REMOTE_HOST://0.0.0.0:29084
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-broker-2:9082,INTERNAL_NETWORK://kafka-broker-2:9092,EXTERNAL_HOST://localhost:29094,EXTERNAL_REMOTE_HOST://192.168.0.25:29084
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,INTERNAL_NETWORK:PLAINTEXT,EXTERNAL_HOST:PLAINTEXT,EXTERNAL_REMOTE_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3
      DELETE_TOPIC_ENABLE: "true"
  kafdrop:
    image: obsidiandynamics/kafdrop:3.30.0
    hostname: kafdrop
    container_name: kafdrop
    restart: "no"
    networks: 
      - kafka
    ports:
      - 9000:9000
    environment:
      KAFKA_BROKERCONNECT: kafka-broker-0:9092,kafka-broker-1:9092,kafka-broker-2:9092
      JVM_OPTS: "-Xms16M -Xmx48M -Xss180K -XX:-TieredCompilation -XX:+UseStringDeduplication -noverify"
    depends_on:
      - kafka-broker-0
      - kafka-broker-1
      - kafka-broker-2
  kafka-ui:
    image: provectuslabs/kafka-ui:7837622d5eaacae9bade7342f14732967e1b48d0
    container_name: kafka-ui
    networks: 
      - kafka
    depends_on:
      - kafka-broker-0
      - kafka-broker-1
      - kafka-broker-2
    ports:
      - "8080:8080"
    restart: always
    environment:
      KAFKA_CLUSTERS_0_NAME: local
      KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka-broker-0:9092,kafka-broker-1:9092,kafka-broker-2:9092
networks:
  kafka:
    external: true
 
    