Oracle Ubuntu 22.04에서 Docker로 PostgreSQL과 Spring Boot 애플리케이션을 구성하는중에
컨테이너 간 타임아웃이 발생이 발생하는 상황이다.
2025-11-29T23:25:50.960Z INFO 1 --- [para-note-api][ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2025-11-29T23:26:04.294Z ERROR 1 --- [para-note-api][ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization.
org.postgresql.util.PSQLException: The connection attempt failed.
Caused by: java.net.SocketTimeoutException: Connect timed out
컨테이너 간 ping 테스트
docker exec para-app ping -c 3 db
결과: 100% packet loss - 같은 브리지 네트워크에 있음에도 불구하고 통신 불가상태다
삽질하다보니
컨테이너들끼리는
IP 라우팅이 아니라 L2 브리지(스위치) 를 통해 프레임으로 통신함.
bridge netfilter가 활성화되어 있으면
L2 프레임도 “L3 보안 검사”를 거침.
그래?
그럼 iptable 모조리 비활성화 해보자,
sudo iptables -L 조회
sudo iptables -F 비활성화
그래도 똑같음
L3 계층 문제는 아닌걸로보여짐
그런데 궁금한게 L3 보안을 다 열었는데도 왜?
브리지 netfilter는 “L3 규칙까지 가기도 전에 드롭할 수 있는 별도 훅”이기 때문임.
Docker 브리지는 L2 스위치
br_netfilter가 L2 프레임을 L3 검사로 끌어올림
그러나 그 과정에서 L3 레이어까지 가기 전 단계의 필터가 DROP을 결정함
원인은
Oracle Cloud Ubuntu의 특수성때문인걸로 이해.. 하..^^
컨테이너 A → docker0(브리지) → 컨테이너 B
이 경우:
iptables를 거치지도 않음
rp_filter도 안 걸림
L2 프레임만 스위칭 → 정상
L2 프레임 → L3 netfilter 훅 호출
프레임이 L3로 변환되는 과정 자체에서 커널이 DROP할 수 있음
iptables 규칙이 아니라 br_netfilter / rp_filter가 먼저 컷하는 구조
때문에 위에서 iptables 를 모두 열어도 똑같았던것이다.
실제 커널 동작 흐름:
[컨테이너 A]
↓
[docker0 브리지]
↓
(bridge netfilter 훅 호출) ← 여기서 커널이 DROP 때림
↓ (못 감)
iptables FORWARD (ACCEPT여도 의미 없음)
즉시 적용
sudo sysctl -w net.bridge.bridge-nf-call-iptables=0
sudo sysctl -w net.bridge.bridge-nf-call-ip6tables=0
sudo sysctl -w net.bridge.bridge-nf-call-arptables=0
영구 설정 (재부팅 후에도 유지)
/etc/sysctl.conf에 추가
echo "net.bridge.bridge-nf-call-iptables=0" | sudo tee -a /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables=0" | sudo tee -a /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-arptables=0" | sudo tee -a /etc/sysctl.conf
설정 적용
sudo sysctl -p
설레는 마음으로 ping 테스트
docker exec para-app ping -c 3 db
3PING db (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.103 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.097 ms
64 bytes from 172.19.0.2: seq=2 ttl=64 time=0.087 ms
--- db ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.087/0.095/0.103 ms
Oracle Cloud Ubuntu 22.04에서 Docker를 사용할 때는
net.bridge.bridge-nf-call-iptables 설정을 반드시 확인해야 한다.
OCI 기본 이미지에서는 br_netfilter가 활성화된 상태라,
Docker의 L2 브리지 트래픽이 iptables 검사로 넘어가면서
컨테이너 간 통신이 차단될 수 있다.
OCI가 적용한 기본 보안 설정이 Docker 네트워킹과 충돌할 수 있는 셈이다.
하..몇시간을 날렸는지