소켓프로그래밍#13 : raw 소켓

kkado·2022년 6월 6일
1

네트워크프로그래밍

목록 보기
16/16


And his name is ...

RAW 소켓이란?

raw, '가공되지 않은', '날 것의' 라는 뜻이다.

우리가 일반적으로 사용하는 소켓은 네트워크를 통해 데이터를 주고 받을 때 운영체제에 의해 헤더 정보의 추가 및 분리와 같은 가공 작업을 거친다. 따라서 사용자는 헤더를 직접적으로 접할 기회가 없다.

하지만 우리가 새로운 프로토콜을 사용하거나, 헤더의 정보를 이용해 보안 프로그램을 만들 때에, 또는 불순한 목적으로 가짜 패킷을 만드는 경우 등에는 헤더를 직접 제어해야 한다.

RAW 소켓은 사용자로 하여금 TCP/IP 헤더 정보들을 직접 제어할 수 있게 해준다.

raw 소켓은 IP 헤더나 TCP 헤더를 모두 사용자 데이터로 취급하기 때문에 IP 헤더와 TCP 헤더를 보내고자 하는 데이터 앞부분에 직접 만들어 주어야 한다.

raw 소켓은 root 계정으로만 만들 수 있다. raw 소켓을 구현하기 위해서 TCP/IP 스택을 제어해야 하는데 TCP/IP 스택을 제공하는 곳이 커널이기 때문에, 커널에 접근이 가능한 root 계정으로만 raw 소켓의 생성이 가능한 것이다.


IP 패킷을 구조적으로 표현한 그림이다. 위의 영역들에 직접 값을 채워 넣을 수 있다.

  1. Version : 버전을 나타내는 필드. IPv4면 4, IPvv6 패킷이면 6
  2. HLen : IP 헤더 길이를 word 단위(4바이트)로 나누어 나타낸다. 즉 헤더의 길이가 20바이트라면 HLen 필드 값은 5이다.
  3. Type of Service : 서비스 종류. 패킷의 중요도와 우선순위 등을 표기하고 있다.
  4. Total_length : 전체 길이. 헤더와 데이터 길이를 포함한 전체 길이를 바이트 단위로 나타낸다.
  5. Time to live : 수명. 줄여서 TTL이라고도 한다. 라우터나 호스트를 하나씩 지날 때마다 1씩 감소하고 0이 되면 해당 패킷을 받은 라우터는 그 패킷을 버리고 발신자에게 ICMP 패킷을 보낸다.
  6. protocol : IP 패킷이 담고 있는 데이터가 어떤 프로토콜인지 나타낸다.
  7. Header checksum : IP 패킷 헤더가 정상적인지 감시한다. 체크섬 확인 절차를 거쳤을 때 0이 나오면 정상 패킷, 0이 아니라면 비정상 패킷으로 간주하고 패킷을 버린다.

ICMP와 ping 프로그램

ICMP(Internet Control Message Protocol)
ICMP는 TCP/IP에서 IP 패킷을 처리할 때 발생되는 문제를 알려주는 프로토콜이다.

IP에는 오로지 패킷을 목적지에 보내기 위한 내용들로 구성되어 있다. 따라서 정상적으로 목적지에 도착하는 경우 아무 문제가 없다. 하지만 전달해야 할 호스트가 꺼져 있거나, 포트가 열려 있지 않거나 등의 비정상적인 경우 이 패킷의 출발지 호스트에 이러한 사실을 알려 주어야 한다.

다만 앞서 말했듯 IP에는 그러한 에러에 대한 처리 방법이 명시되어 있지 않다.

이러한 IP의 부족한 점을 메꾸기 위해 ICMP 프로토콜이 사용된다.

ICMP는 해당 호스트가 없거나 해당 포트에 대기중인 서버 프로그램이 없는 등등 다양한 에러 상황이 발생할 경우 출발지 호스트로 이러한 에러에 대한 정보를 보내준다.

출발지 호스트는 ICMP가 보내주는 코드나 에러 메시지를 보고 어떤 문제가 생겼는지 확인이 가능하다.

  • type : ICMP 메시지의 유형
  • code : type의 세부 내용. type와 code를 조합하여 ICMP 메시지의 목적과 용도를 나타낸다.
  • Checksum : ICMP 메시지 오류를 검사하기 위한 값
  • rest of the header : type와 code에 따라 추가되는 헤더
  • data section : 데이터가 위치하는 영역

통신 유무 확인 시 자주 쓰이는 ping 프로그램 같은 경우에도 ICMP 프로토콜을 이용한 방법이다.

해당 ICMP 패킷을 보낸 IP는 어디인지, 패킷의 사이즈는 얼마인지 등등의 정보를 확인할 수 있다.

ping 프로그램을 직접 만들어 볼 수도 있다.

raw 소켓을 열고 recvfrom을 통해 ICMP 메시지를 받고 display 함수를 호출한다.

display 함수에는 struct iphdr ip가 존재하고, struct icmphdr icmp가 존재한다.
받은 패킷의 가장 앞에는 IP 헤더가 있으므로 buf를 바로 지정해주고 ICMP 헤더의 경우 IP 헤더의 크기만큼 뒤에 붙어 있으므로 ip->ihl*4, 즉 IP 헤더의 크기만큼 건너뛰어서 지정해준다.

그 후에 여러 가지 정보들을 출력 가능하다.

profile
울면안돼 쫄면안돼 냉면됩니다

0개의 댓글