질문을 삭제하지 말아주세요.!
 
3
2
1

테스트 환경

  • 도커: Docker for Mac
  • 컨테이너: Apache 2.4 + PHP-FPM (각각 분리된 컨테이너로 link 연결)
  • 컨테이너 네트워크 모드: bridge
  • 컨테이너 네트워크 대역: 172.1.0.0/24
  • Apache 컨테이너 포트: 80:80, 443:443


bridge 네트워크 모드의 아파치 컨테이너로 외부 컴퓨터가 접속 시 $_SERVER['REMOTE_ADDR']에 당연히 bridge의 내부 IP가 잡히는건 맞습니다. 위 환경에 의해 172.1.0.1이 잡힙니다.

그래서 아파치의 remoteip 모듈을 써서 $_SERVER['HTTP_X_FORWARDED_FOR'] 로 받기 위해 아래와 같이 설정 했습니다.


<IfModule remoteip_module>
    RemoteIPHeader X-Forwarded-For
    RemoteIPTrustedProxy 127.0.0.1 10.0.0.0/8 172.1.0.0/12 192.168.0.0/16
</IfModule>


그런데 전혀 $_SERVER['HTTP_X_FORWARDED_FOR'] 가 생성되지 않습니다.

하도 안되서 RemoteIPTrustedProxy 에 혹시나 IP 대역은 있는대로 다 넣었습니다.

네트워크 모드를 host가 아닌 bridge 인 상태에서 방법이 없을까요?

리눅스가 아닌 맥이라서 안되는건가 의심도 해보고 있고요. 구글링을 해봐도 답이 쉽게 찾아지지가 않습니다.


=== nginx 테스트 추가 ===

단순히 테스트를 위해서 richarvey/nginx-php-fpm 도커 이미지로 웹서버를 띄워봤습니다.

nginx의 http_realip_module 모듈이 있는 것을 nginx -V 로 확인했습니다.

nginx 도커 컨테이너의 네트워크는 위와 동일한 bridge 모드이고 Gateway는 172.17.0.1 로 나왔습니다.

그래서 /etc/nginx/sites-enabled/default.conf 에 아래와 같이 주석을 풀고 IP 대역을 맞게 수정해줬습니다.


server {
	...
	real_ip_header X-Forwarded-For;
	set_real_ip_from 172.17.0.0/16;
	...
}

하지만 PHP에서는 여전히 $_SERVER['HTTP_X_FORWARDED_FOR'] 정보를 찾을 수 없습니다. $_SERVER['REMOTE_ADDR'] 또한 당연히 172.17.0.1가 나옵니다.


=== Ubuntu Docker 에서 nginx 테스트 추가 ===

우분투에서 했더니 아무런 설정 없이도 $_SERVER['REMOTE_ADDR'] 이 잘 나옵니다.

Docker for Mac이 macOS의 하이퍼킷 위에 동작함으로 인한 한계가 아닌가 싶습니다.

    CommentAdd your comment...