docker op RHEL, geen connectie mogelijk naar extern netwerk

Alles over programmeren en development binnen de IT-wereld
Plaats reactie
doopsuiker
Starter
Starter
Berichten: 15
Lid geworden op: 26 feb 2019, 10:27
Bedankt: 2 keer

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
Gebruikersavatar
Mortov Molotov
Premium Member
Premium Member
Berichten: 454
Lid geworden op: 07 jan 2012, 10:57
Uitgedeelde bedankjes: 113 keer
Bedankt: 58 keer
Recent bedankt: 2 keer

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.
Aan vriendschappelijk verleend advies op dit forum kunnen geen rechten worden ontleend :wink:
Plaats reactie

Terug naar “Development”