본문 바로가기
Network Security/우분투 리눅스 기반의 IDS IPS 설치와 운영

[침탐] 2장, 네트워크 계층의 헤더 기능

by Y06 2021. 3. 29.

보안 장비 운영과 관련해 IP 헤더 구조는 TCP 헤더 구조와 더불어 중요하게 간주하는 헤더인 만큼 각각의 항목에 대해 집둥하도록 하자.

 

IP 헤더 크기는 일반적으로 20 바이트 크기를 사용하지만 경우에 따라 IP 추가(IP Options) 항목을 이용해 21 바이트 이상으로 사용할 수도 있다.

 

IP 헤더에서 제일 먼저 버전(Version) 항목을 볼 수 있다. IPv4 주소라면 4가 들어가고 IPv6 주소라면 6이 들어간다.

 

버전 항목 다음에 나오는 헤더 길이(Header Length) 항목에는 IP 헤더의 크기가 들어간다. 일반적으로 20 바이트 크기를 사용하기 때문에 20이 들어간다.

 

헤더 길이 항목 다음에 나오는 Tyoe of Service 항목에는 해당 패킷의 전송 우선 순위를 저장한다.

 

ToS 항목 다음에 나오는 전체 길이(Total Length) 항목에는 IP 헤더를 포함한 패킷 전체의 길이 정보가 담긴다. 만약 전체 길이 할목에 100이라고 나온다면 헤더 길이 항목에 담긴 20이란 정보를 통해 남은 크기를 추론해 볼 수 있다.

 

전체 길이 항목 다음에 나오는 ID(Identification) 항목과 플래그(Flags) 항목과 플래그먼트 오프셋(Fragment Offset) 항목은 MTU에 따른 패킷 분할 정보를 담는 항목이다.

 

MTU(Maximun Transmission Unit)란 최대 전송 단위라는 의미다. 다시 말해 각각의 프로토콜에서 정한 데이터 크기의 최대 범위를 의미한다. 일례로 이더넷 방식에서 MTU는 1,500 바이트다. 이더넷 구간을 통과할 수 있는 데이터 최대 크기가 1,500 바이트까지라는 단위다. 만약 5,900 바이트 크기의 데이터가 발생하면 어떻게 이더넷 구간을 통과할 수 있을까? 이런 경우 ID 항목과 플래그 항목 그리고 플래그먼트 오프셋 항목이 필요하다. 주의할 점은 IP 헤더의 플래그 항목은 제어 신호를 설정하는 데 사용하지만 IP 헤더의 플래그 항목은 두 개의 비트(원래는 세 개의 비트이지만 실제로는 두 개의 비트만을 사용)를 이용해 패킷의 분할 유무를 표시한다.

 

D 비트와 M 비트는 플래그 항목에서 사용하는 두 개의 비트를 의미한다. D 비트는 Do not fragment 비트라는 의미이고 M 비트는 More fragments 비트라는 의미다. D 비트가 1이다. 패킷 분할이 없다는 의미다. 이처럼 D 비트가 1인 경우 ID 항목이나 플래그먼트 오프셋 항목은 의미가 없다.

 

D 비트가 1이 아닌 0이라는 것은 해당 패킷을 분할했단느 의미이기 때문이다. 또한 M 비트가 1인 경우 해당 패킷 말고 또 다른 분할 패킷이 있다는 의미다. 플래그먼트 오프셋을 보면 시작 위치가 0 바이트다.

 

분할 패킷이며 또 다른 분할 패킷이 있다는 의미다. D 비트와 M 비트 역시도 각각 0과 1이기 때문에 세 번째 패킷은 이전 패킷처럼 분할 패킷이며 또 다른 분할 패킷이 있다는 의미다.

 

마지막 패킷의 경우 이전 패킷과 달리 M 비트가 0이다. 더 이상 분할 패킷이 없다는 의미다. 다시 말해 네 번째 패킷이 마지막 분할 패킷이란 의미다.

 

수신 측 운영 체제에서는 송신 측 운영 체제가 부여한 표를 네 개의 분할 패킷을 순서에 따라 재조립한다. 빈번한 패킷 분할은 과부하를 유발할 수 있는 요인이기도 하다.

 

생존 시간(Time To Live) 항목은 라우팅 루프가 일어난 구간에서 패킷을 폐기하기 위한 용도로 사용한다. 다시 말해 해당 패킷이 통과할 수 있는 라우터의 개수 정보를 담는 항목이다. 일례로 TTL 값이 10이면 해당 패킷은 10대의 라우터를 통과할 수 있고 그 이상은 통과할 수 없다는 의미다.

 

생존 시간 항목 다음에 있는 프로토콜(Protocol) 항목은 상위 계층에 속한 프로토콜 번호를 저장한다. 만약 송신 측에서 UDP 페이로드를 생성했다면 17로 설정하고 TCP 페이로드를 생성했다면 6으로 설정한다. 그럼 수신 측에서는 프로토콜 항목을 읽어 해당 패킷의 속성을 파악한다. 다시 말해 프로토콜 번호가 17이면 해당 패킷을 데이터그램으로 간주하고, 프로토콜 번호가 6이면 세그먼트로 간주해 상위 계층으로 해당 패킷을 넘긴다.

 

헤더 오류 검사(Header Checksum) 항목은 비활성 상태다. 다시 말해 헤더 오류 검사 항목은 일반적으로 사용하지 않는다. 

 

IP 주소는 IANA에서 관리한다. IP 주소의 범위는 0부터 255까지다. 다시 말해 IP 주소는 0.0.0.0부터 255.255.255.255까지 총 32 비트로 이뤄진 체계다.

 

IP 주소를 처음 설계할 당시에는 IP 주소를 A 등급부터 E 등급까지 분류했지만 일반적으로 A 등급부터 C 등급까지 사용한다. IP 주소의 등급은 주어진 첫 번째 자리를 가지고 구분한다.

 

등급 범위 기본 서브넷 마스크 비고
A 1~126 255.0.0.0 127.0.0.1 루프백 주소
B 128 ~ 191 255.255.0.0  
C 192 ~ 223 255.255.255.255.0  

기본 서브넷 마스크 표기에서 보는 바와 같이 IP 주소는 등급에 따라 네트워크 ID와 호스트 ID가 다르다. 네트워크 ID란 LAN 영역에 대한 고유한 식별자를 의미하고 호스트 ID란 해당 LAN 영역에 속한 호스트에 대한 고유한 식별자를 의미한다. 특히 호스트 ID에서 모든 미트가 0인 경우를 네트워크 IP 주소(C 등급에서 192.168.10.0인 경우)라고 하며 모든 비트가 1인 경우를 브로드캐스트 IP 주소(C 등급에서 192.168.10.255인 경우)라고 한다.

 

네트워크 IP 주소와 브로드캐스트 IP 주소는 운영 체제 내부에서 사용하기 때문에 C 등급의 경우 실제 사용 가능한 IP 주소의 범위는 192.168.10.1번부터 192.168.10.254번까지 총 254개다. A 등급과 B 등급 역시도 총 개수에서 네트워크 IP 주소와 브로드캐스트 IP 주소를 제외한 개수가 실제 사용 가능한 개수에 해당한다.

 

 

ICMP(Internet Control Message Protocol)는 IP 등장 이후 전송 작업을 화면에 출력하기 위한 용도로 등장했다. 다시 말해 ICMP는 화면 출력 메시지에 기반해 오류 통보 기능과 질의 응답 기능 등을 수행하기 위한 프로토콜이다.

 

ICMP 방식의 오류 통보란 전송 중 일어날 수 있는 목적지 도달 불가나 발신지 억제 또는 시간 초과나 매개 변수의 문제 등을 사용자 화면에 출력하기 위한 기능을 의미한다. 그렇지만 사용자 입장에서 ICMP는 오류 통보보다는 질의 응답 기능이 더욱 중요하다.

 

운영 체제에서는 네트워크 게층에 기반해 쓰레기 값으로 채워진 페이로드를 생성한다. FTP나 SSH 등과 같은 프로토콜은 응용 계층에서 사용자의 실제 정보를 담은 페이로드를 생성하지만 ICMP 프로토콜은 네트워크 계층에서부터 페이로드를 생성한다.

 

구분 상위 계층과의 연속성 페이로드 생성 계층 전송 단위
IP 있음 응용 계층 패킷
ICMP 없음 네트워크 계층 패킷

 ICMP 헤더에는 주요하게 해당 ICMP가 요청인지 아니면 응답인지를 구분하기 위한 정보가 타입(Type) 항목에 담긴다.

 

타입 항목에서 8은 요청을 의미하고 0은 응답을 의미한다. ICMP 페이로드에 ICMP 헤더를 추가해 ICMP 패킷을 생성한 뒤 다시 그 앞에 그임과 같은 IP 헤더가 붙는다. IP 헤더가 있어야 라우팅이 가능하기 때문이다. 이처럼 ICMP 패킷은 네트워크 계층에서 시작해 데이터 링크 계층과 물리 계층으로 넘어간다.

 

 

ping 명령어와 마찬가지로 ICMP 방식에 기반해 구현한 또 다른 명령어가 있다. 바로 tracert 명령어다. ping이 출발지와 목적지 사이의 통신 여부를 점검하기 위한 용도라면 tracert는 출발지와 목적지 사이의 라우팅 과정을 확인하기 위한 용도하고 할 수 있다.

 

tracert 명령어는 ping 명령어에서 나타나는 TTL 속성을 이용해 구현한다. 앞에서 해당 패킷이 통과할 수 있는 라우터의 개수 정보라고 설명하면서 TTL 값이 10이면 해당 패킷은 10대의 라우터를 통과할 수 있고 그 이상은 통과할 수 없다고 했다.

 

tracert 명령어를 사용할 때 두 가지를 염두에 둘 필요가 있다. 일반적으로 윈도우 계열에서는 ICMP 방식을 이용하고 유닉스/리눅스 계열에서는 UDP 방식을 이용한다는 점이다. UDP 방식을 이용할 경우 포트 번호 33435번을 사용한다. 또한 경로 추적을 수행할 때 라우팅 상황에 따라 이전과 다른 경로가 나올 수도 있다. 이것은 동적으로 동적하는 라우팅 알고리즘 때문이다. 다시 말해 목적지까지 도달하기 위한 무수한 경로 중 최선의 상황에 따라 동적으로 변하기 깨문이다.

 

참고로 IPv6 환경에서는 ICMP가 IGMP와 ARP 기능까지 수행한다.