2013년 8월 21일 수요일

차세대 패킷 포맷, Pcap-NG 를 알고싶다 _ 두번째 이야기

Pcap-NG 의 두 번째 이야기 입니다. 첫번째 이야기를 쓰고 두 번째 이야기를 쓰기까지 시간이 많이 걸렸네요.  PCAP 포맷보다 더욱 커져서 소개해야 될 내용들이 많고 하다보니 길어지고 있습니다. 대부분의 내용은 PCAPNG 파일 포맷에서 소개하고 있는 내용을 나름대로 정리하여 본 것입니다. 몇 가지 더 적을 내용들이 있는데, 두 번째 이야기에서는 여기까지만 소개하고 나머지 계속 이어서 하겠습니다 :-)

참고로 파일의 기본 확장자는 .pcapng 를 사용합니다.

1. PCAPNG 기본 블럭 구조


캡쳐파일은 여러개의 블럭으로 이뤄지는데, 기본적으로 사용되는 골격 형태는 다음과 같은 포맷을 가지고 있습니다.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Block Type                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Block Total Length                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/                          Block Body                           /
/          /* variable length, aligned to 32 bits */            /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Block Total Length                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

32비트의 블럭 타입이 있습니다. 이 블록 타입은 이미 사전정의되어 있으며, 뒤에서 차차 언급하도록 하겠습니다. 그리고 블럭의 전체길이, 블럭 몸체, 블럭의 전체길이가 다시 이어집니다. 특이한 것은 뒷 부분에 다시 블럭의 전체길이가 나오는데, 이것은 패킷 구조내에서 이동에 참고하기 위해서 중복되어 기록되는 내용입니다.

블럭은 해당 패킷파일을 다루는 프로그램에 따라 사용될 수도 있고 안될 수도 있습니다. 어떤 블럭은 반드시 포함되어야 하는 블럭이 있는 반면 어떤 블럭은 옵션에 따라 선택 되는 것이므로 프로그램에서도 해당 블럭을 처리할 것인지는 옵션일 뿐입니다.

2. 블럭 타입 소개


블럭 타입은 아래 [블럭 타입 정보] 에 기술되어 있으며, 각 패킷파일에는 항상 2개의 블럭이 존재해야 합니다.
  • Section Header Block
  • Interface Description Block 

그리고 옵션 블럭으로 가능한 것은
  • Enhanced Packet Block
  • Simple Packet Block
  • Name Resolution Block 
  • Interface Statistics Block 

입니다. 이외 실험적으로 사용되고 있는 블럭은 다음과 같습니다.
  • Alternative Packet Blocks
  • Compression Block
  • Encryption Block
  • Fixed Length Block
  • Directory Block
  • Traffic Statistics and Monitoring Blocks
  • Event/Security Blocks

실험적으로 사용되는 블럭에 대해서는 언급하지 않도록 하겠습니다.

3. 패킷 파일헤더 레이아웃


파일은 처음 SHB(Section Header Block) 부터 시작되어야 합니다. 차세대패킷 포맷은 여러개의 블럭 형태로 이루어져 있기 때문에 해당 블록의 시작을 대표할 수 있는 SHB 가 필요한 것입니다. 블럭 단위로 헤더를 인식하기 위해서 각 헤더는 헤더 초반에 블럭의 타입과 길이에 대한 정보를 반드시 가지고 있어야 합니다. 이후 설명드리는 각 블럭 정보를 보면 아시겠지만 모두 타입과 길이 정보를 가지고 있습니다.

블럭 단위로 패킷 파일이 만들어지기 때문에 기존 패킷파일보다 좀더 유연한 구성이 가능해 집니다. 블럭 단위로 만들어지는 패킷 파일의 다양한 레이아웃을 다음과 같이 살펴보겠습니다.


위와 같이 여러개의 블럭의 조합으로 다양한 레이아웃 형태로 패킷파일을 구성할 수 있습니다.

4. 옵션(Option)


모든 블럭은 옵션 필드를 포함할 수 있습니다. 옵션 필드는 말그대로 선택될 수 있는 정보로 패킷 처리에 있어서 반드시 필요한 정보가 아닙니다. 옵션의 이름대로 데이터를 읽었을때 좀더 유용한 정보를 제공해 줄 수 있는 부가정보라고 볼 수 있습니다. 이런 정보는 구현할 때 해당 정보를 읽을 수도 있고 그렇지 않을수도 있습니다. 즉, 구현하는 소프트웨어에 따라 정보가 있음에도 불구하고 출력해주지 않을수 있는 것입니다. 옵션 필드는 크게 3 가지로 이루어져 있습니다. 타입, 크기 그리고 해당 옵션의 값입니다.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Option Code              |         Option Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/                       Option Value                            /
/          /* variable length, aligned to 32 bits */            /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/                                                               /
/                 . . . other options . . .                     /
/                                                               /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Option Code == opt_endofopt  |  Option Length == 0          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


- 옵션 타입 (2바이트) : 각 블럭에서 사용되는 2바이트 코드 값
- 옵션 길이 (2바이트) : 실제 옵션 값의 길이
- 옵션 값 (유동적) : 옵션의 실제 값이 들어가 있는 필드

옵션은 여러번 반복이 될 수도 있습니다. 예를들어 인터페이스가 여러개의 IP 를 가지고 구성되어 있는 경우 해당 정보를 기록하려면 반복이 될수 있습니다. 옵션 정보가 끝났다는 것은 마지막에 opt_endofopt 코드 정보를 참고합니다. 해당 코드가 있다면 더 이상 옵션 정보를 참고하지 않습니다. 참고로, 패킷 코멘트 정보가 바로 여기에 기록됩니다.

옵션 이름코드번호설명
opt_endofopt0옵션 필드가 끝났다는 것을 알려주는 것
opt_comment1해당 블럭의 코멘트 정보 

5. 블럭정의


5-1. SHB(Section Header Block) - 필수


이 세션 헤더블럭은 꼭 있어야 되는 블럭중에 하나이며, 캡쳐 덤프파일 세션의 가장 처음에 나타납니다. 이 헤더 자체에는 데이터가 포함되지 않으며, 사용될 블럭 정보들이 기록되게 됩니다.

   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +---------------------------------------------------------------+
 0 |                   Block Type = 0x0A0D0D0A                     |
   +---------------------------------------------------------------+
 4 |                      Block Total Length                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 8 |                      Byte-Order Magic                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
12 |          Major Version        |         Minor Version         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16 |                                                               |
   |                          Section Length                       |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
24 /                                                               /
   /                      Options (variable)                       /
   /                                                               /
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      Block Total Length                       |
   +---------------------------------------------------------------+

각 포맷의 의미를 알아보면 처음 시작되는 블럭 타입에 대한 고정된 값이 있습니다. 이 값은 캐리지리턴값 과도 같은 "\r\n\n\r" 입니다. 16진수로는 0x0A0D0D0A 가 되겠죠. 다음은 블럭전체에 대한 길이가 나오고 바이트 오더 매직인 0X1A2B3C4D 가 나옵니다. 1234 와 ABCD 로 연속적인 값이니 외우기는 쉽겠죠? 이 값은 리틀엔디안 또는 빅엔디안 시스템에서 저장된 데이터인지 판별하는데 사용됩니다. 그 다음으로 Major, Minor 버전 정보는 해당 포맷에 대한 정보로 현재 Major 는 1 이고 Minor 는 0 입니다. 포맷 자체가 변경되지 않는 이상 해당 값은 블럭타입과 같이 항상 고정되어 있는 값으로 볼 수 있습니다. Section Length는 이어지는 세션에대한 길이 정보롤 64비트 값을 가지고 있습니다. 이 세션 길이에 대한 계산시에는 SHB 헤더 자체는 포함되지 않습니다. 그리고 이 필드는 조금 다른 용도로도 이용되는데요, 큰 패킷파일을 처리할때 빠른 이동을 위해 세션 정보를 스킵하는데 사용될 수 있습니다. 만약 세션 길이가 -1 (0xFFFFFFFFFFFFFFFF) 로 정의되어 있다면 이 세션에 대한 크기가 정의되어 있지 않고 해당 블록이 포함이 하고 있는 데이터의 세션은 Skip 하는데 사용되는데 이용됩니다. 마지막으로 옵션 필드는 이름 그대로 추가적인 정보가 덧 붙을 수 있는데, 다음과 같습니다.


이름코드번호설명
shb_hardware2이 세션이 만들어지는데 이용된 하드웨어 정보
shb_os3이 세션이 만들어지는데 이용된 운영체제 이름 정보
shb_userappl4이 세션이 만들어지는데 이용된 애플리케이션 이름 정보

5-2. IDB(Interface Description Block) - 필수


IDB 또한 SHB 와 마찬가지로 필수적으로 필요한 블럭입니다. 이 블럭은 패킷 캡쳐를 수행한 네트워크 인터페이스에 대한 정보를 담고 있습니다. 이 블럭은 다른 블럭정보를 표시하기 전에 사전에 정의되어 있어야 하므로 보통은 SHB 블럭 다음에 위치합니다.

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +---------------------------------------------------------------+
 0 |                    Block Type = 0x00000001                    |
   +---------------------------------------------------------------+
 4 |                      Block Total Length                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 8 |           LinkType            |           Reserved            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
12 |                            SnapLen                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16 /                                                               /
   /                      Options (variable)                       /
   /                                                               /
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      Block Total Length                       |
   +---------------------------------------------------------------+


IDB 의 포맷을 살펴보면 처음 블럭타입을 지정하는 정보가 나옵니다. 그리고 블럭 대한 전체 길이 정보와 인터페이스의 링크레이어 타입 정보가 이어집니다. 대부분의 경우라면 링크타입은 이더넷이 될 것입니다. Snaplen 은 패킷 덤프할 시에도 지정할 수 있는 값으로 각 패킷의 최대 바이트 값이 되고 다양한 옵션 정보가 추가될 수 있습니다.

옵션 이름코드번호설명
if_name2캡쳐 디바이스로 사용된 인터페이스 이름  
if_description3캡쳐 디바이스로 사용된 인터페이스 설명. 예를들면 "Broadcom NetXtreme"
if_IPv4addr4인터페이스의 네트워크 주소와 넷마스크 - IPv4
if_IPv6addr5인터페이스의 네트워크 주소와 프리픽스 길이 - IPv6
if_MACaddr6인터페이스 하드웨어 맥 주소 (48비트)
if_EUIaddr7인터페이스 하드웨어 EUI 주소 (64비트)
if_speed8인터페이스 속도 ( bps 단위)
if_tsresol9타임스탬프 표현 (만약 값이 6이면 1970/1/1 이후 마이크로세컨드 표시)
if_tzone10타임존 
if_filter11캡쳐필터로 사용한 필터 정보 (ex. "tcp port 80" )
if_os12운영체제 정보
if_fcslen13FCS(Frame Check Sequence) 길이 값
if_tsoffset14각 패킷에 더해지는 특정 오프셋 정수 값

5-3. EPB(Enhanced Packet Block)


EPB 가 네트워크 패킷 정보를 저장하는 기본 블럭이 됩니다. 패킷저장을 할때 EPB 또는 아래에서 설명드릴 SPB(Simple Packet Block) 가 사용될 수 있으므로 반드시 사용되어야 할 블럭이기 보단 옵션으로 선택할 수 있는 블럭입니다.

   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +---------------------------------------------------------------+
 0 |                    Block Type = 0x00000006                    |
   +---------------------------------------------------------------+
 4 |                      Block Total Length                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 8 |                         Interface ID                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
12 |                        Timestamp (High)                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16 |                        Timestamp (Low)                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
20 |                         Captured Len                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
24 |                          Packet Len                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
28 /                                                               /
   /                          Packet Data                          /
   /          /* variable length, aligned to 32 bits */            /
   /                                                               /
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   /                                                               /
   /                      Options (variable)                       /
   /                                                               /
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      Block Total Length                       |
   +---------------------------------------------------------------+

EPB 블럭의 필드를 살펴보면 블럭타입은 6 을 가지고 있습니다. (0x00000006) 그 다음 다른 블럭과 마찬가지로 해당 블럭의 전체 크기가 나옵니다. Interface ID 는 패킷이 어떤 인터페이스를 통해 들어왔는지에 대한 해당 인터페이스 정보가 들어갑니다. 즉 이 정보는 IDB(Interface Description Block)에 정의된 정보와 같게 됩니다. 이 부분이 SPB 와는 다른 정보로 32 비트 값을 사용하고 있습니다. 또 타임스탬프 값으로 2개를 사용하고 있습니다. high, low 로 나뉘어져 있는 32비트를 사용하여 타임스탬프를 표현하는데 있어 64비트를 사용합니다. 1970년1월1일 부터 64bit unsinged 로 표시하며 libpcap 파일 포맷의 타임스탬프 저장시 사용하던 초, 마이크로세컨드 형태로 나누어 저장되는 것이 아닌 한개의 64비트 형태로 값이 표현되는 것입니다. Captured Len 은 패킷 캡쳐된 크기 값입니다. 이 필드는 패킷 데이터 필드 크기를 맞추기 위해 수행하는 Align 데이터 값, 즉 패딩이라고 부르는 데이터가 포함되어 있습니다. Packet Len 은 네트워크 상에서 실제 전송된 패킷 크기 입니다. 사용자가 패킷 덤프시 Snaplen 값을 따로 정의하여 사용하면 Captured Len 과 크기가 달라질 수 있습니다. Snaplen 이 60 바이트로 정의했다면 실제 전송된 패킷은 150 바이트가 되더라도 캡쳐된 크기는 60 바이트가 되는 것입니다. 그리고 이 필드 후에 실제 패킷데이터가 오게 됩니다. 마지막으로 옵션이 붙을 수 있는데 간단하게만 설명하면 다음과 같습니다.

옵션 이름코드번호설명
epb_flags2링크 레이어 정보가 포함된 플래그 (비트 단위로 표현한 것으로 패킷의 인바운드 또는 아웃 바운드도 표현할 수 있다)
epb_hash3패킷 해쉬 정보 
epb_dropcount4패킷 손실된 개수 - 64비트

5-4. SPB(Simple Packet Block)


SPB 는 EPB 보다 가벼운 패킷 저장 구조입니다. SPB 는 PB(Packet Block)와 유사하면서 더 작은 구조로 최소한의 정보만을 담고 있습니다. EPB 보다 저장하는 것이 적기 때문에 빠른 속도로 패킷 저장이 필요하다면 이 블럭이 더 유리합니다. SPB 의 큰 차이점은 인터페이스 ID 필드를 포함하고 있지 않습니다. 그렇기 때문에 IDB 에서 정의된 첫번째 인터페이스에서 캡쳐가 되고 있는 것으로 가정할 수 있습니다. 이 뜻은 한 개 이상의 인터페이스 패킷정보를 가질수가 없다는 뜻이 되기도 합니다. 인터페이스 ID 필드가 없기 때문에 해당 패킷이 어떤 인터페이스를 통해 들어왔는지 알수 없기 때문입니다. 또, 타임스탬프(Timestamp) 필드도 존재하지 않습니다. 타임스탬프가 필요한 경우도 있지만, 패킷 자체만을 고속으로 봐야 하는 경우는 타임스탬프 자체도 영향을 줄 수 있는 요소이기 때문에 SPB 에서는 사용되지 않습니다. 참고로 PB 는 더 이상 사용되지 않는 블럭이므로 패킷 데이터 저장에는 EPB 또는 SPB 로 저장된다고 볼 수 있습니다.

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +---------------------------------------------------------------+
 0 |                    Block Type = 0x00000003                    |
   +---------------------------------------------------------------+
 4 |                      Block Total Length                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 8 |                          Packet Len                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
12 /                                                               /
   /                          Packet Data                          /
   /          /* variable length, aligned to 32 bits */            /
   /                                                               /
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      Block Total Length                       |
   +---------------------------------------------------------------+


블럭타입은 3 (0x00000003) 이며, 다른 블럭과 마찬가지로 해당 블럭의 전체 크기가 이어집니다. 패킷 데이터가 기록되기 전 패킷 길이 필드가 존재하고 이후 데이터가 저장됩니다. EPB 에 비해 저장되는 필드 정보가 적기 때문에 디스크 용량 사용면에서도 유리하게 됩니다.

참고 정보- 블럭 타입 코드 

블럭 타입 코드설명
0x00000000Reserved
0x00000001IDB(Interface Description Block)
0x00000002Packet Block
0x00000003Simple Packet Block
0x00000004Name Resolution Block
0x00000005Interface Statistics Block
0x00000006Enhanced Packet Block
0x0A0D0D0ASection Header Block


댓글 없음:

댓글 쓰기