네트워크에 대해 어느 정도 공부했으니 이젠 패킷이 IP 주소를 통해 목적지를 지정한다는 것을 알고 있을 것이다.
이렇게 IP 주소를 통해 목적지 1개를 지정하기 위해선 필수적인 조건이 존재하는데 바로 기기마다 고유한 IP 주소를 가지고 있어야 한다는 것이다.
원래 네트워크에서는 모든 서브넷과 기기에 각각 고유한 IP 주소가 할당되어 있었다.
문제는 1990년대 들어서며 인터넷이 일반용으로 전환됨에 따라 네트워크 기기가 많아짐에따라 발생했다.
네트워크 기기마다 중복되지 않는 고유한 IP 주소를 할당해야 하는데 네트워크 기기의 폭발적인 증가 추세에 따라 고유하게 할당할 IP 주소가 없어지는 문제가 발생했다.
이를 방치할 경우 고유하게 할당할 IP 주소 값이 없어져 인터넷 확장이 불가해질 것이며 이는 인터넷을 파국으로 이끌 것이다.
이를 해결하기 위한 아이디어는 모든 컴퓨터 사이에 패킷을 주고 받아야 할 필요는 없다는 것이다.
삼성과 SK라는 회사가 있을 때 해킹 시도를 하지 않을 것이라면 SK 회사 내부망에선 삼성 내부망에 접속할 필요가 없으며 그 반대도 마찬가지이다.
즉, SK와 삼성 회사 내부망의 네트워크 기기는 서로 패킷을 주고 받지 않는다는 것이다.
그렇다면 SK와 삼성 내부망은 패킷을 주고 받지 않을 건데 굳이 내부망에 고유한 값을 할당할 필요가 있는 걸까?
SK 내부망 1.2.3.4에서 5.6.7.8로 패킷을 보내고 싶다면 5.6.7.8은 SK 내부망에 존재하는 것이 자명할 것인데 말이다.
이런 아이디어를 통해 주소 부족 문제를 해결할 수 있다.
사내 내부망에 존재하는 주소라면 다른 회사의 내부망과 중복되어도 좋다고 생각한 것이다.
SK 내부망에 1.2.3.4가 있다 하더라도 삼성 내부망에도 1.2.3.4를 할당하는 것이다.
어차피 1.2.3.4에 패킷을 보내고 싶다하더라도 SK 내부망인지 삼성 내부망인지에 따라 목적지는 고유한 것과 마찬가지이기 때문이다.
(당연하겠지만 내부망에 존재하는 기기들은 각기 다른 주소를 가져야 할 것이다)
이때 사용하는 사내용 주소를 프라이비트 주소(Private address), 공공 인터넷에서 사용되는 이전의 고유한 주소는 글로벌 주소(Global Address)라고 한다.
프라이비트 주소로 활용되는 IP 주소는 아래의 범위로 한정된다.
10.0.0.0 ~ 10.255.255.255
172.16.0.0 ~ 172.31.255.255
192.168.0.0 ~ 192.168.255.255
프라이비트 주소는 내부망에서 사용된다는 목적을 위해 새롭게 만들어진 새로운 IP 주소가 아니라 글로벌 주소 중 사용하지 않는 IP 주소를 프라이비트 주소로 사용하겠다고 약속한 것이다.
192.168.10.10은 프라이비트 주소 범위 내에 존재하는 IP 주소이므로 글로벌 주소에는 192.168.10.10이라는 IP 주소가 존재하지 않는다는 것이다.
따라서 프라이비트 주소는 따로 신청할 필요 없이 누구나 자유롭게 사용할 수 있다.
프라이비트 주소를 통해 주소 절약은 가능해졌지만 다른 문제를 해결해야 한다.
사내 내부망이 인터넷과 완전히 독립되어 있다면 상관없겠지만 대부분의 경우 사내 내부망에서 인터넷을 통해 다른 서버에 접속할 수 있어야 한다. 즉, SK 내부망에서 구글 접속을 수행할 수 있어야 한다.
이런 문제를 해결하기 위해 사내 내부망과 연결되어 있고 동시에 글로벌 주소를 가진 서버와 접속할 수 있게 해주는 공개용 서버를 생성해 준다.
공개용 서버엔 글로벌 주소를 할당하여 인터넷을 통해 패킷을 주고받을 수 있도록(인터넷 통신이 가능하도록) 설정하는 것이다.
그렇다면 사내 내부망에서 인터넷에 접속하기 위해선 프라이비트 주소에서 공개용 서버에 패킷을 전달하고 공개용 서버는 받은 패킷을 내부망 전용 패킷에서 인터넷 전용 패킷으로 변환할 필요가 있는데, 이 구조가 바로 주소 변환이다.
주소 변환의 가장 핵심 개념은 패킷을 중계할 때 IP 헤더에 기재된 송신지 IP 주소와 TCP 헤더의 송신지 포트 번호를 바꿔 쓰는 것이다.
일단 사내 네트워크의 어떤 기기가 패킷을 송신할 것이다.
이때 당연하겠지만 IP 헤더의 송신지 IP 주소는 프라이비트 주소일 것이며 송신지 포트 번호는 내부망 기기에서 할당한 포트 번호일 것이다.
이 패킷은 주소 변환 장치에 전달될 것이다.
주소 변환 기능을 가진 기기는 라우터 말고도 존재하지만 일단 주소 변환 장치를 라우터라고 가정하고 학습하자.
주소 변환 장치인 라우터는 인터넷 측에 연결되어 있을 것이며 인터넷 측에 연결된 포트에는 글로벌 주소가 할당되어 있을 것이다.
라우터는 내부망에서 받은 패킷의 송신처 IP 주소를 프라이비트 주소에서 포트에 할당되어 있는 글로벌 주소로 바꿔 쓴다.
송신처 포트 번호 또한 미사용 번호를 적당히 선택한 후 기존 패킷의 포트 번호에서 선택한 값으로 바꿔준다.
이렇게 송신지 IP 주소와 송신처 포트 번호를 바꿔 썼다면 둘을 한 세트로 묶어 주소 변환 장치 내부에 있는 대응표에 기록해 둔다.
이후 변경한 패킷을 인터넷에 송출한다.
패킷이 정상적으로 송신되었다면 수신지 측에선 요청에 대한 응답 패킷을 보낼 것이므로 패킷을 수신해야 한다.
이때에도 주소 변환 장치인 라우터가 패킷 수신에 중요한 역할을 한다.
라우터가 패킷을 받았다면 패킷의 수신지 IP 주소와 수신지 포트 번호를 조사한다.
라우터 내에 존재하는 대응표에서 두 개의 값으로 검색한 뒤 일치하는 정보가 있다면 해당 정보의 프라이비트 주소 및 포트로 패킷 헤더 값을 치환한 뒤 내부망의 네트워크 기기에 패킷을 전달한다.
데이터 송/수신이 끝나고 연결 끊기 동작이 수행되어 후 접속 동작이 종료된다면 대응표에 등록된 정보를 삭제함으로써 주소 변환에 기본 동작이 종료된다.
아래와 같은 생각이 들 수 있다.
IP 주소를 바꾸는 것은 외부망 접속을 위해서라고 하지만 포트 번호는 왜 바꾸는 걸까? 라우터에서 할당한 포트 번호도 랜덤 값이라면 그냥 내부망에서 정한 포트 번호로 사용하면 안 될까?
10.10.1.1 IP 주소를 가진 기기와 10.10.1.2 IP 주소를 가진 기기가 동시에 동일한 인터넷 서버에 요청을 보낸다고 가정하자.
랜덤 하게 정한 값인 포트 번호가 다르다면 그나마 다행이겠지만 만약 포트 번호도 동일하다고 가정하자.
10.10.1.1:80과 10.10.1.2:80이 송신지 IP 주소 및 송신지 포트 번호가 되는 것이다.
이때 글로벌 주소 1개로 IP 주소 값을 변환한다면 문제가 발생한다.
10.10.1.1:80도 192.18.8.31:80으로 변환될 것이고 10.10.1.2:80도 192.18.8.31:80으로 변환될 것이다.
이렇게 돼버리면 192.18.8.31:80에서 응답 패킷을 보냈을 때 이 응답 패킷이 10.10.1.1:80을 위한 패킷인지 10.10.1.2:80을 위한 패킷인지 모호해지는 것이다.
포트 번호를 유지한 상태로 위와 같은 문제를 해결하는 방법은 두 가지이다.
먼저 내부망에 존재하는 기기가 인터넷에 접속하기 위한 포트를 생성할 때 다른 내부망 기기가 해당 포트를 사용하는지 확인하는 것이다.
하지만 이 방법은 포트 번호 확인을 하는 과정이 추가되어 시간도 길어질뿐더러 포트 번호를 동시에 생성할 경우 중복 여부를 제대로 확인하지 못할 위험성이 존재한다.
두 번째론 내부망에 존재하는 기기마다 다른 IP 주소를 할당하는 방법이다.
하지만 이 경우 프라이비트 주소와 글로벌 주소가 1대 1로 대응되어야 하는데 사내 사원수가 많아질수록 할당해야 하는 글로벌 주소가 많아질 것이고 이렇게 많은 IP 주소를 사용하게 되면 굳이 복잡한 주소 변환 기능을 활용할 필요가 없다.
포트 번호는 16비트 값 중 무작위로 설정한 1개의 값을 사용하면 되므로 수만 개의 값을 사용할 수 있다.
즉, 주소 변환 과정에서 포트 번호를 변경시킨다면 1개의 IP 주소로도 수만 명의 사내 직원이 인터넷에 접속할 수 있게 되며 패킷의 송/수신지가 모호해지는 상황도 거의 발생하지 않는 것이다.
이러한 이유 때문에 송/수신처 IP 주소뿐 아닌 포트 번호도 변경시키는 것이다.
그렇다면 이런 의문이 들 수 있다.
만약 주소 변환 기기(라우터)의 대응표에 정보가 등록되어 있지 않다면 어떻게 패킷을 송신할까?
정답은 패킷을 송신할 수 없다이다.
생각해 보면 당연한 건데 SK 내부망에서 구글에 접근할 수 있다고 구글에서 SK 내부망에 접근해서는 안 되는 것이다.
구글 사이트는 모두가 볼 수 있도록 열어둔 사이트이지만 SK 내부망은 모두가 볼 수 있게 개방해 놓은 사이트가 아니기 때문이다.
이런 원리를 사용하여 부정 침입을 방지할 수도 있다.
하지만 특수한 상황에서는 내부망 외부에 있는 기기도 내부망에 액세스를 허용하고 싶은 경우가 존재한다.
최근에는 VPN을 활용하여 해결하기는 하지만 프리랜서에게 일정 기간 동안 내부망 액세스를 허용하고 싶은 경우가 있을 것이다.
이럴 경우 사전에 수동으로 대응 정보를 대응표에 등록해 두면 된다.
그리고 인터넷에 연결되어 있는 주소 변환 장치 포트에 할당된 IP 주소를 DNS 서버에 등록한다.
그럼 외부에서 내부망에 액세스를 수행할 때 DNS 서버에 지정된 정보에 따라 주소 변환 장치에 패킷이 전달될 것이며 주소 변환 장치의 대응표는 외부 IP 주소에 대한 정보를 가지고 있어 주소 변환이 가능하므로 정상적으로 패킷이 송/수신될 수 있는 것이다.
즉, 내부망에 접근할 수 있게 되는 것이다.
패킷 필터링이란 중계할 때 MAC 헤더, IP 헤더, TCP 헤더에 기록되어 있는 제어 정보를 조사하여 사전에 설정한 조건에 맞는지를 확인하고 이에 따라 패킷을 중계하거나 폐기하는 동작을 말한다.
대부분 방화벽이라는 기기난 소프트웨어는 이 원리를 이용하여 부정 침입을 방지한다.
패킷 필터링의 개념은 간단하지만 그 동작 및 원리는 간단하지 않다.
패킷 필터링을 위해 부정 침입과 정상 액세스를 분리하여 부정 침입만 차단하도록 조건을 설정해야 하는데 이는 간단하지 않다.
이 패킷 필터링은 서버의 동작과 관련되어 있으므로 서버 측을 공부할 때 자세히 설명하겠다.