SharedIT | 묻고 답하기(AMP)

외부나갔다가 들어오더라도 내부 ip가 찍히게하려면 어떻게해야하나요?


안녕하십니까,, 여전히 지식이 부족해 이곳에 여쭙게되네요

얼마전까지 2번의 방식으로 접속하더라도 서버엔 PC의 사설IP가 잘 찍혔습니다.  근데 어느날부터 공인 IP가 찍혀서 내부 사용자를 특정 지을수가 없게 되었습니다. 

문제는 라우터상의 셋팅이 변경되어 2번처럼 계속 공인ip가 찍히고있는지, 서버의 프로그램 코드가 변경되어 공인ip가 찍히는건지 히스토리 확인이 어려운 상태입니다. (공인ip가 찍히기시작한 시점에 네트워크 작업이 있었는지 확인이 안됨)

2번으로 접속하더라도 사설IP가 찍혀야하는데 말이죠.

혹시라도 네트워크 작업으로 인해 저렇게 공인ip가 찍히게된거라면,,, 다시 사설ip가 찍히게 하기 위해서는 어떤 작업을 해야할까요?


Tags : 태그가 없습니다.

4개의 답변이 있습니다.

빨간신발
  0 추천 | 약 2년 전

한달전까지는 아마도 nat를 안탔을 겁니다.

네트워크에서 뭔가 작업이 있었을 듯 하네요.

라우터에서 내부 ip가 서버의 공인 ip로 접근하면 nat를 안태우고 바로 보내면 가능하겠죠..

네트워크에서 가능한지 여부에 따라서 달라지겠네요.

웹에서는 공인ip에서 사설ip를 찾는 기능을 없는 것으로 알고 있습니다.

힘냅시다 | 약 2년 전

다시 확인해봐야겠네요 감사합니다!

빨간신발
  0 추천 | 약 2년 전

웹(HTTP, HTTPS)을 통해서 공인 ip로 접근한 경우 사설ip를 확인하기 어렵습니다.

기존처럼 사설ip를 사용하는 pc에서 같은 네트워크 상의 서버로 다이렉트로 접근하면 사설ip를 확인이 가능하지만, 현재처럼 사설ip를 사용하는 pc가 nac을 거쳐 공인ip를 타면 서버에서는 사설ip를 확인할 수 없습니다.

http, https 메소드에는 캡슐화된 사설ip를 꺼내서 알려주는 기능은 없는 것으로 압니다.

보안측면에서도 안될거 같습니다.

힘냅시다 | 약 2년 전

불과 한달전까지만해도 nat를 거쳐 공인ip를 타고 접속했는데도 사설ip가 찍히긴했습니다..! 근데 소스코드 변경작업은 없었다길래 그래서 의문입니다..

Genghis Khan
  0 추천 | 약 2년 전

같은 네트워크 상에 있고

라우터에서 고정으로 유동적이지 않은 

고정으로 할장하거나

PC에서 서버를 바라볼때

cmd에서 route add로 metric 값을

지정할수도 있겠구요

아니면  아래 hosts에 설정을 해주면 되겠네요

C:\windows\system32\drivers\etc\hosts


wansoo
  0 추천 | 약 2년 전

IP 패킷이 NAT을 거쳐서 외부로 나갈때

패킷 목적지는 변함이 없지만, 패킷의  출발지 주소가 NAT 서버(라우터)가 가진 외부 IP(공인 IP)로 변경되어서 전달되어 줘야만 목적지의 서버(웹서버)가 클라이언트 요청에 대한 결과를 NAT 서버(라우터) 쪽으로 다시 보내 줄 수 있겠고요.

NAT 서버(라우터)는 외부 웹서버가 보내준 결과를 받아서, IP 패킷의 목적지를 내부 클라이언트로 변경해서 처음 요청한 내부 클라이언트쪽에로 전달해 줄 수 있겠는데요.


이 과정을 OSI TCP/IP 3계층 관점에서 보면 IP 패킷이 클라이언트에서 출발해서, 게이트웨이인 NAT 서버를 거쳐서, 목적지인 외부에 있는 웹 서버에 도착하게 되어, 

웹 서버가 클라이언트의 요청을 처리한 후에, 결과 값을 다시 클라이언트로 보내게 되는데,

이때는 웹 서버에서 IP 패킷이 출발해서, 클라이언트가 있는 네트워크의 게이트웨이인 NAT 서버를 거쳐서, 목적지인 내부 클라이언트에게 응답이 전달되게 되겠고요.


이 과정을 좀 더 구체적으로 다시 설명해 보면...

내부 클라이언트에서 출발할때 IP 패킷의 목적지는 외부 웹서버의 IP 주소, IP 패킷의 출발지는 내부 클라이언트의 (사설) IP가 되겠고요.

게이트웨이에서 클라이언트의 요청을 처리하기 위해 외부 웹서버로 IP 패킷을 전달할때, 목적지 주소는 그대로 외부 웹서버 주소로 해서 보내면 되겠지만, IP 패킷의 출발지 주소를 자신의  (공인) IP 주소로 변경해서 보내면서,  IP 주소를 버리지 않고 나중에 결과 값을 서버로 부터 돌려 받았을때 처음 요청한 클라이언트로 다시 전달하기 위해 IP 패킷의 데이터로 캡슐화해서 함께 전달하게 되겠고요.

웹서버 관점에서 IP 패킷만으로 분석했을 경우에는 요청한 클라이언트가 클라이언트 네트워크 측의 NAT 서버 공인 IP라고 판단하게 되지만...

IP 패킷에 캡슐화된 데이터를 꺼내어 볼때, 실제 요청한 내부 사설 IP의 주소도 함께 꺼내 볼수 있어 실제 요청한 클라이언트의 IP 주소가 무엇인지도 알수 있겠고요.


글을 적다 보니... 길게 적어 버렸는데... 위에 내용은 참고만 하면 될 것 같고...


웹서버에서 클라이언트 쪽 공인 IP 주소는 REMOTE_ADDR 환경 변수 값으로 확인 가능한데요.

아마도 REMOTE_ADDR 환경 변수로 부터 IP 주소를 추출해서 보여 주는 형태로 바뀐게 아닌가 추정되네요.

한번 캡슐화된 IP 주소는 HTTP_FORWARDED라는 환경 변수로 부터 꺼내서 보여 준다면 내부 사설 IP 주소를 표시해 줄 수 있을걸로 보여 지고요.


경우에 따라서는 여러개의 NAT을 거칠 수도 있고, 내부 Proxy Server를 거치거나 해서 서 실제 IP 주소가 다양한 환경 변수에 저장될 수도 있겠는데...

웹서버에서 클라이언트 IP 주소가 저장된 여러 환경 변수가 아래와 같이 다양하게 저장되기 때문에 참고하면 도움 되겠고요.

이들 환경 변수에 저장된 주소값 중에서 원하는 IP 주소를 추출해서 사용하면 될 것 같네요. 아마 대부분 NULL 값이 저장되어 있기 때문에 주소값이 저장된 환경 변수 중에서 적절한걸 선택해서 사용하면 되겠네요.

X-Forwarded-For

HTTP_CLIENT_IP

Proxy-Client-IP

WL-Proxy-Client-IP

HTTP_X_FORWARDED_FOR

HTTPXFORWARDED_FOR

HTTP_X_FORWARDED

HTTPXFORWARDED

HTTPXCLUSTERCLIENTIP

HTTPCLIENTIP

HTTPFORWARDEDFOR

HTTP_FORWARDED_FOR

HTTP_FORWARDED

HTTP_VIA

REMOTE_ADDR


제일 위의 환경 변수부터 체크해서 IP 주소가 들어 있으면 추출해서 클라이언트 IP 주소로 표시하도록 수정하면 되지 않을까 싶어 보이네요.

wansoo | 약 2년 전

아래의 PHP로 만들어진 실제 IP 주소 추출해오는 함수도 참고해 보면 도움될 것 같네요.


function getRealClientIp() {


$ipaddress = '';


if (getenv('HTTP_CLIENT_IP')) {


$ipaddress = getenv('HTTP_CLIENT_IP');


} else if(getenv('HTTP_X_FORWARDED_FOR')) {


$ipaddress = getenv('HTTP_X_FORWARDED_FOR');


} else if(getenv('HTTP_X_FORWARDED')) {


$ipaddress = getenv('HTTP_X_FORWARDED');


} else if(getenv('HTTP_FORWARDED_FOR')) {


$ipaddress = getenv('HTTP_FORWARDED_FOR');


} else if(getenv('HTTP_FORWARDED')) {


$ipaddress = getenv('HTTP_FORWARDED');


} else if(getenv('REMOTE_ADDR')) {


$ipaddress = getenv('REMOTE_ADDR');


} else {


$ipaddress = '알수없음';


}


return $ipaddress;


}

힘냅시다 | 약 2년 전

자세한 설명 정말 감사드립니다. 말씀해주신 내용을 요약하자면 라우터를 거쳤기때문에 공인ip로 보이겠지만 사설ip도 캡슐화되어있기 때문에 사용 가능할거다 라고 이해되거든요. 그럼 이 문제를 소스코드가 아닌 네트워크단에서 라우터의 세팅변경으로도 해결할 수 있나요?