Docker CentOS8, Fedora에서 컨테이너 Host 사용 불가능한 문제 해결방법.
CentOS8, Fedora에서 Docker 사용 시 발생한 호스트 연결 문제를 해결했습니다. 방화벽 설정 변경으로 X-REAL-IP 수신 문제도 해결했어요.
CentOS8, Fedora에서 Docker 사용 시 발생한 호스트 연결 문제를 해결했습니다. 방화벽 설정 변경으로 X-REAL-IP 수신 문제도 해결했어요.
이거 때문에, 못해도 토탈 24시간은 소모한거 같다.. nginx 설정 문제인줄 알고, 수정하고 수정하고.. 근데도 계속 안되서... 테스트용 하나 만들어놓고,, 세팅 하나 씩 해가면서, 다시 reinstall 하고.. 계속 반복하면서... 그래서 도달한 결론에 대해서 설명하고자 한다.
CentOS8, Fedora에서 Docker를 설치하고나서, 아래와 같이 명령어를 쳐보면
docker run busybox nslookup google.com
nslookup: write to '108.61.10.10': No route to host
;; connection timed out; no servers could be reached
docker run yauritux/busybox-curl curl google.com안된다.
컨테이너 간의 Host 문제(?) 아무튼, 이러한게 발생해서 라는데.
그래서 발견한게 아래의 링크다.
그래서, 이것으로 해결했었다. 실제로 dnf install도 문제없이되고, nslookup도 문제없이 된다.
firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens3
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:masquerade: yes 가 yes 처리되어있다.
그리고, 컨테이너간의 Host 역시 잘 된다... 하지만,,, 단,,, 단,, 단 !!!!!!!!!!!!!!!!
nginx.conf 로 x-real-ip 를 받아오게 해두거나,
traefik 를 사용하는 경우에 X-REAL-IP를 절대 받아올 수가 없다.
받아오더라도, 무조건 "172.19.0.1" 같이, docker network ip 를 가져온다.
"etc/firewalld/firewalld.conf" 을 수정하는 방법이다.
FirewallBackend=nftables 을
FirewallBackend=iptables 로 수정한다.
firewall-cmd --permanent --zone=trusted --add-interface=docker0
firewall-cmd --reload명령어로 적용한다.
이렇게 하면, docker build 할때 dnf install host 라든가, 기타 등등 모든 연결에 문제 없이 잘 된다. 하지만 !!
만약에, 나의 docker-compose service 에 network 가 frontend 나 backend 처럼 다른 네트워크를 생성해둔 상태라면, 꼭 추가한 네트워크도 trusted 존에 추가시켜줘야 한다.
그렇지않으면, traefik 사용하는 상태에서는 아래와 같은 에러가 발생한다.
'502 Bad Gateway' caused by: dial tcp 172.18.0.4:80: connect: no route to host# ifconfig
br-d193b7e58cd8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255
inet6 fe80::42:17ff:fed7:dc73 prefixlen 64 scopeid 0x20<link>
ether 02:42:17:d7:dc:73 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
br-e34899da24a1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.19.0.1 netmask 255.255.0.0 broadcast 172.19.255.255
inet6 fe80::42:61ff:fe06:9f0c prefixlen 64 scopeid 0x20<link>
ether 02:42:61:06:9f:0c txqueuelen 0 (Ethernet)
RX packets 41 bytes 2757 (2.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 73 bytes 6079 (5.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:6dff:fe00:e5f1 prefixlen 64 scopeid 0x20<link>
ether 02:42:6d:00:e5:f1 txqueuelen 0 (Ethernet)
RX packets 12831 bytes 722769 (705.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 18098 bytes 98702867 (94.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0firewall-cmd --permanent --zone=trusted --add-interface=br-d193b7e58cd8
firewall-cmd --permanent --zone=trusted --add-interface=br-e34899da24a1
firewall-cmd --reload그러니.. 위와 같이, 해당 interface도 추가해주면 된다.
firewall-cmd --list-all-zones
public (active)
target: default
icmp-block-inversion: no
interfaces: ens3
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
trusted (active)
target: ACCEPT
icmp-block-inversion: no
interfaces: br-d193b7e58cd8 br-e34899da24a1 docker0
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:이렇게 해주면, 이제 X-REAL-IP를 정상적으로 받아올 수가 있다.

이 문제는 docker가 nftables를 지원하지 않아서 생기는거라고 이야기하는것 같은데..
어쨌든... 나중에 지원하고, 공식적으로 고쳐줬으면 하는 바램이다.
일단은... 이렇게 해결했으니 다행이다.

firewall-cmd --permanent --zone=public --add-masquerade
로 적용했을때

firewall-cmd --permanent --zone=trusted --add-interface=docker0
firewall-cmd --permanent --zone=trusted --add-interface=br-87014b87949d
firewall-cmd --permanent --zone=trusted --add-interface=br-fb2316a253cd
firewall-cmd --reload로 적용하면 될듯 싶다.