Pagina 1 van 1

docker op RHEL, geen connectie mogelijk naar extern netwerk

Geplaatst: 27 mei 2025, 17:36
door doopsuiker
Ik gebruik de standaardinstellingen voor netwerken, maar een nieuw aangemaakte Docker Compose-container kan het internet niet bereiken in de netwerkbridgemodus. (De netwerkhostmodus werkt prima.) Ik zie geen verkeer op de eth0-interface, terwijl ik wel hetzelfde verkeer zie dat afkomstig is van de Docker-interfaces. Het lijkt erop dat er een NAT-regel of algemene FW-regel ontbreekt, maar voor zover ik weet zou de standaard Docker-configuratie deze moeten aanmaken bij het opstarten van de container.

Kan er mij iemand op weg helpen?

Code: Selecteer alles

[root@m-inf-nrl-a1-01 docker]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
  312 28856 DOCKER-USER  all  --  *      *       0.0.0.0/0            0.0.0.0/0
  312 28856 DOCKER-FORWARD  all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     udp  --  !docker0 docker0  0.0.0.0/0            172.17.0.2           udp dpt:1621
    0     0 DROP       all  --  !br-f0b21bb04949 br-f0b21bb04949  0.0.0.0/0            0.0.0.0/0
    0     0 DROP       all  --  !docker0 docker0  0.0.0.0/0            0.0.0.0/0

Chain DOCKER-BRIDGE (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DOCKER     all  --  *      br-f0b21bb04949  0.0.0.0/0            0.0.0.0/0
    0     0 DOCKER     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0

Chain DOCKER-CT (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all  --  *      br-f0b21bb04949  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED

Chain DOCKER-FORWARD (1 references)
 pkts bytes target     prot opt in     out     source               destination
  312 28856 DOCKER-CT  all  --  *      *       0.0.0.0/0            0.0.0.0/0
  312 28856 DOCKER-ISOLATION-STAGE-1  all  --  *      *       0.0.0.0/0            0.0.0.0/0
  312 28856 DOCKER-BRIDGE  all  --  *      *       0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     all  --  br-f0b21bb04949 *       0.0.0.0/0            0.0.0.0/0
  312 28856 ACCEPT     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DOCKER-ISOLATION-STAGE-2  all  --  br-f0b21bb04949 !br-f0b21bb04949  0.0.0.0/0            0.0.0.0/0
  312 28856 DOCKER-ISOLATION-STAGE-2  all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0

Chain DOCKER-ISOLATION-STAGE-2 (2 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DROP       all  --  *      docker0  0.0.0.0/0            0.0.0.0/0
    0     0 DROP       all  --  *      br-f0b21bb04949  0.0.0.0/0            0.0.0.0/0

Chain DOCKER-USER (1 references)
 pkts bytes target     prot opt in     out     source               destination
  312 28856 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0

[root@m-inf-nrl-a1-01 docker]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  anywhere            !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        anywhere
MASQUERADE  all  --  172.18.0.0/16        anywhere

Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere
DNAT       udp  --  anywhere             anywhere             udp dpt:cmip-man to:172.17.0.2:1621

dns requests van de docker container, maar geen verkeer naar/vanaf eth0

16:05:18.658518 veth7835296 P   IP 172.17.0.2.53514 > 10.184.77.116.domain: 7284+ [1au] AAAA? insights-collector.newrelic.com. (60)
16:05:18.658518 veth7835296 P   IP 172.17.0.2.37497 > 10.184.77.116.domain: 62053+ [1au] A? insights-collector.newrelic.com. (60)
16:05:18.658518 docker0 In  IP 172.17.0.2.53514 > 10.184.77.116.domain: 7284+ [1au] AAAA? insights-collector.newrelic.com. (60)
16:05:18.658518 docker0 In  IP 172.17.0.2.37497 > 10.184.77.116.domain: 62053+ [1au] A? insights-collector.newrelic.com. (60)

docker compose.yaml
name: New-Relic
services:
    ktranslate:
        container_name: ktranslate-DOTA-DOCKER-COMPOSE-TEST
        restart: unless-stopped
        pull_policy: always
        ports:
            - 163:1621/udp
        volumes:
            - "/etc/docker/ktranslate-DOTA-DOCKER-COMPOSE-TEST/snmp-base.yaml:/snmp-base.yaml"
        environment:
            - NEW_RELIC_API_KEY=xxx
        image: kentik/ktranslate:v2
        command: -snmp /snmp-base.yaml -nr_account_id=xxx -metrics=jchf
            -tee_logs=true -service_name=ktranslate-DOTA-DOCKER-COMPOSE-TEST
            -snmp_discovery_on_start=true -snmp_discovery_min=180 nr1.snmp
        network_mode: bridge
Toegevoegd na 50 minuten 47 seconden:
nftables strooide roet in het eten

Re: docker op RHEL, geen connectie mogelijk naar extern netwerk

Geplaatst: 14 jun 2025, 08:14
door Mortov Molotov
ChatGPT vermoedt vrij sterk dat het probleem te maken heeft met firewalld op RHEL (of CentOS/Alma/Rocky). Standaard blokkeert firewalld verkeer van docker0 en br-* interfaces naar de buitenwereld tenzij er expliciet forwarding en masquerading wordt toegestaan. Ondanks dat iptables de juiste NAT-regels toont (MASQUERADE voor 172.17.0.0/16), wordt de forwarding misschien door firewalld intern alsnog tegengehouden.

Kort gezegd: Docker's iptables-regels zijn er, maar firewalld kan ze overrulen.

Oplossing: firewalld configureren

Stap voor stap:

1. Controleer of firewalld actief is:

Code: Selecteer alles

systemctl status firewalld

2. Sta masquerading toe voor de zone waar eth0 zich in bevindt (vaak 'public'):

Code: Selecteer alles

firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --reload

3. Sta forwarding toe vanuit de docker0-subnet:

Code: Selecteer alles

firewall-cmd --zone=trusted --add-interface=docker0 --permanent
firewall-cmd --zone=trusted --add-interface=br-f0b21bb04949 --permanent
firewall-cmd --reload
(Of als je de Docker-netwerken liever in de public zone houdt, moet je daar expliciet forwardingregels definiƫren.)


4. Controleer of forwarding globaal is toegestaan in /etc/sysctl.conf:

Code: Selecteer alles

net.ipv4.ip_forward = 1
En activeer dat eventueel met:

Code: Selecteer alles

sysctl -w net.ipv4.ip_forward=1

5. Test daarna opnieuw de internetconnectie vanuit de container:

Code: Selecteer alles

docker exec -it <container_id> curl -v http://example.com

Alternatief voor testdoeleinden

Om firewalld tijdelijk buiten spel te zetten (alleen als test, niet voor productie):

Code: Selecteer alles

systemctl stop firewalld
Test daarna of de container wel extern netwerk heeft. Als dat het probleem oplost, weet je zeker dat firewalld de boosdoener is.