Nginx(Npm)

NPM에 Cloudflare Proxy를 통한 클라이언트 실제 IP 확인 방법

dae-ya 2025. 11. 13. 09:42

홈 서버를 운영시 도메인이 필요한 상황이 꽤 나오게 된다.

이럴 때 iptime ddns나 duckdns 같은 쉽고 편한 무료 dns가 있지만 결국 궁극적인 끝은 유료 dns가 된다.

iptime ddns는 https를 지원하지 않고 duckdns 같은 경우는 dns가 불안정하여 접속이 불가능한 경우가 꽤 있다.

그래서 cloudflare를 추천하는데 속도가 아주 중요한 웹페이지나 서버가 아닌 이상 프록시를 거치는 걸 추천한다.

이렇게 되면 클라이언트는 cloudflare 프록시 서버를 거쳐 내 서버에 들어오게 되는데 서버 로그를 보면 실제 클라이언트 ip 대신 cloudflare 프록시 ip가 로그에 남아있는 걸 볼 수 있다.

 

그렇다면 보안적으로 좋게 웹사이트를 운영하기 위해서는 프록시를 거치는 게 좋은데 실제 ip를 알 수 없다는 건 꽤 큰 단점이 될 것이다.

방법은 프록시 서버에서 넘어오는 ip헤더 서버를 운영시 도메인이 필요한 상황이 꽤 나오게 된다.

 

이럴 때 iptime ddns나 duckdns 같은 쉽고 편한 무료 dns가 있지만 결국 궁극적인 끝은 유료 dns가 된다.

 

iptime ddns는 https를 지원하지 않고 duckdns 같은 경우는 dns가 불안정하여 접속이 불가능한 경우가 꽤 있다.

 

그래서 cloudflare를 추천하는데 속도가 아주 중요한 웹페이지나 서버가 아닌 이상 프록시를 거치는 걸 추천한다.

 

이렇게 되면 클라이언트는 cloudflare 프록시 서버를 거쳐 내 서버에 들어오게 되는데 서버 로그를 보면 실제 클라이언트 ip 대신 cloudflare 프록시 ip가 로그에 남아있는 걸 볼 수 있다.

 

 

 

그렇다면 보안적으로 좋게 웹사이트를 운영하기 위해서는 프록시를 거치는 게 좋은데 실제 ip를 알 수 없다는 건 꽤 큰 단점이 될 것이다.

 

방법은 프록시 서버에서 넘어오는 데이터에  CF-Connecting-IP 헤더를 확인하면 된다.

기본적으로 cloudflare 프록시를 거쳐서 넘어오는 데이터에는  CF-Connecting-IP 헤더가 들어가 있어서 NPM에 이 헤더를 확인하여 로그에 작성하라고 하면 된다.

 

그렇게 설정하려면 먼저 cloudflare 프록시에서 넘어오는 ip의 범위를 알아야 한다.

다행히도 이러한 범위를 cloudflare에서 제공한다.

 

https://www.cloudflare.com/ko-kr/ips/?ref=it-svr.com

 

IP 범위

이 페이지는 Cloudflare의 현재 IP 범위에 대한 최종 출처를 제공하기 위함입니다.

www.cloudflare.com

 

Nginx를 ssh나 다른 방법으로 설정하려면 꽤 귀찮지만 NPM을 사용 시 web ui로 빠르고 쉽게 설정이 가능하다.

NPM 설정 화면

 

빨간 부분에 edit을 눌러 Advanced에 아래의 설정만 추가해주면 된다.

# ===============================================================
# Cloudflare로부터 실제 방문자 IP를 가져오기 위한 설정
 # 출처: https://www.cloudflare.com/ips
 # ===============================================================
 # Cloudflare IPv4 주소 대역
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;
# Cloudflare IPv6 주소 대역
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;
# 실제 IP를 가져올 헤더 지정
# Cloudflare는 CF-Connecting-IP 헤더에 실제 방문자 IP를 담아 보냅니다.
real_ip_header CF-Connecting-IP;
# 만약 X-Forwarded-For 헤더를 사용하고 싶다면 아래와 같이 설정할 수도 있습니다.
# real_ip_header X-Forwarded-For;

 

대부분은 ipv4를 쓰지만 ipv6로 접속한다는 가정을 아예 버릴 수는 없어서 ipv6 설정도 하는 것을 추천한다.

저 ip를 자주 바뀌지 않지만 가끔씩은 확인하는 것을 추천한다.

저렇게 설정하고 log를 보면 실제 클라이언트 ip를 확인할 수 있다.

 

NPM cli에 접속하여 /data/logs 디렉터리를 확인하면 여러 로그를 확인할 수 있는데 npm에 추가한 순서대로 숫자가 부여된다.

tail 명령어로 최근 접속 로그를 확인할 수 있다.

Client 부분에 접속자의 ip가 적혀있다