테스트 환경
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 인 상태에서 방법이 없을까요?
리눅스가 아닌 맥이라서 안되는건가 의심도 해보고 있고요. 구글링을 해봐도 답이 쉽게 찾아지지가 않습니다.
단순히 테스트를 위해서 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가 나옵니다.
우분투에서 했더니 아무런 설정 없이도 $_SERVER['REMOTE_ADDR'] 이 잘 나옵니다.
Docker for Mac이 macOS의 하이퍼킷 위에 동작함으로 인한 한계가 아닌가 싶습니다.
테스트 환경
bridge 네트워크 모드의 아파치 컨테이너로 외부 컴퓨터가 접속 시 $_SERVER['REMOTE_ADDR']에 당연히 bridge의 내부 IP가 잡히는건 맞습니다. 위 환경에 의해 172.1.0.1이 잡힙니다.
그래서 아파치의 remoteip 모듈을 써서 $_SERVER['HTTP_X_FORWARDED_FOR'] 로 받기 위해 아래와 같이 설정 했습니다.
그런데 전혀 $_SERVER['HTTP_X_FORWARDED_FOR'] 가 생성되지 않습니다.
네트워크 모드를 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 대역을 맞게 수정해줬습니다.
하지만 PHP에서는 여전히 $_SERVER['HTTP_X_FORWARDED_FOR'] 정보를 찾을 수 없습니다. $_SERVER['REMOTE_ADDR'] 또한 당연히 172.17.0.1가 나옵니다.
=== Ubuntu Docker 에서 nginx 테스트 추가 ===
우분투에서 했더니 아무런 설정 없이도 $_SERVER['REMOTE_ADDR'] 이 잘 나옵니다.
Docker for Mac이 macOS의 하이퍼킷 위에 동작함으로 인한 한계가 아닌가 싶습니다.