본문 바로가기
네트워크

RAW 소켓을 하면서...[ ping 프로그램 ( icmp 프로토콜) ]

by 상레알 2010. 3. 29.

이책 저책을 보고보고...

[TCP/IP 소켓 프로그래밍 : 한빛]

RAW 소켓 : 스위스 만능 칼

 RAW를 사전에서 찾아보면 ‘생’, ‘날’ 이라는 뜻이 있다. 풀어서 쓰자면 가공하지 않은 정도로 보면 될 것이다. 따라서 말 그대로 RAW 소켓은 ‘가공하지 않은 소켓’이다. 일반적인 소켓 함수는 네트워크를 통해서 데이터를 주고 받을 때 헤더 정보를 붙이거나 헤더 정보를 떼어내는 등의 가공을 한다. 일반적으로 주고받는 데이터가 중요하지, 헤더 정보는 별로 중요하지 않기 때문이다.
최종적으로 응용계층에 전달되는 데이터는 사용자 데이터라는 이다. 헤더를 떼고 붙이고 하는 부분은 운영체제의 프로토콜 스택 내에서 자동으로 일어난다. 따라서 프로그래머는 헤더를 직접 절할 기회가 없게 된다.
그렇지만 경우에 따라서는 이러한 헤더를 직접 제어해야 될 필요가 있다. 가령 예를 들어, 기존에 있지 않은 새로운 프로토콜을 만든다든지 또는 헤더의 정보를 이용하는 보안 프로그램을 작성하는 경우가 대표적인 예다. 그리고 간혹 불순한 목적으로 해커들이 발신지 IP가 자신의 것이 아닌 가짜 패킷을 만들기 위해 이러한 RAW소켓을 사용하기도 한다. 따라서 RAW 소켓은 이러한 헤더 정보들에 대한 가공을 하지 않고, 프로그래머가 직접 제어할 수 있게 한다.

RAW 소켓을 사용하면 이렇게 IP 헤더와 TCP 헤더를 직접 제어할 수 있다. 네트워크 계층 헤더와 전송 계층 헤더 중 어떤 종류가 와도 상관 없다. RAW 소켓에서는 IPgp더와 TCP 헤더 모두 사용자 데이터로 취급하기 때문이다. 따라서 RAW소켓으로 TCP 데이터를 전송하고 싶다면 IP 헤더와 TCP 헤더를 보내고자 하는 데이터 앞부분에 직접 만들어 주어야 한다.


RAW 소켓을 어디에 사용하면 좋을까?


 RAW 소켓은 응용 계층과 전송 계층, 네트워크 계층에서 모두 접근할 수 있다.
RAW 소켓이 네트워크 계층까지 접근할 수 있으므로 RAW 소켓은 다음과 같은 세 가지 특징을 가지게 된다.


1. 이전에 설명한 네트워크 계층(예:IP) 헤더와 전송계층 (예:TCP, UDP) 헤더를 직접 제어할 수
있다.


2. 네트워크 계층으로 전송되는 모든 패킷을 전부 볼 수 있다.


3. 2번의 이유로 아무나 생성해서 사용하면 보안상 위험하기 때문에 root 사용자만 생성할 수 있다.


지금 현재도 우리의 컴퓨터에는 수많은 패킷이 들어오고 있다. 그 중에서는 실제 자신의 컴퓨터로 오는 패킷도 있고 바로 옆에 있는 컴퓨터로 가는 패킷도 있다 일반적으로 운영체제는 패킷의 목적지 IP주소가 자신의 IP 주소인 패킷은 받아들이고 다른 IP 주소의 패킷이라면 버리게 된다.
따라서 RAW 소켓을 사용하지 않는 일반적인 애플리케이션들은 IP 주소가 다르거나 자신의 포트 주소가 아닌 패킷은 받아 볼 수 없다. 왜냐하면 운영체제의 프로토콜 스택에서 그러한 패킷은 이미 걸러져 버리고 해당 애플리케이션이 사용하는 IP주소와 포트 주소에게 가는 패킷만 절달되기 때문이다. 그러나 RAW 소켓을 사용하면 IP 주소나 포트 주소가 다르더라도 물리 계층인 이더넷 디바이스 드라이브에서 오는 모든 패킷을 전부 받아볼 수 있다.

RAW 소켓의 이러한 특징으로 인해 RAW 소켓은 특수한 프로그램을 작성하는 데 매우 유용하게 사용될 수 있다. 자, 그럼 RAW 소켓을 어떤 프로그램을 작성할 수 있는지 알아보자


Ping 프로그램  (ICMP 프로토콜 또는 IGMP 프로토콜)


RAW 소켓으로 작성할 수 있는 대표적인 프로그램이 바로 Ping 프로그램이다. ping 프로그램을 모르는사람은 거의 없을 것이다. ping 프로그램은 특정 호스트에 패킷이 정상적으로 도달 하는지 확인하기 위한 프로그램이다.

ping 프로그램은 내부적으로 ICMP 패킷(좀더 정확히 분류하면 ICMP echo 요청 패킷이다)을 보내는데, ICMP 패킷을 받은 운영체제는 다시 ICMP 패킷을 보내 자신이 살아있다는 것을  확인 시켜 준다. 이때 사용되는 ICMP 패킷은 ICMP 프로토콜로 정의되어 있으므로 일반적인 소켓으로는 구현할 수 없다.

 ICMP 패킷은 위 그림처럼 IP 헤더가 오고 바로 다음에 ICMP 메시지가 오게 된다. 일반적인 소켓을 사용하면 TCP 또는 UDP 패킷의 구조와 같이 전송 계층의 헤더가 붙은 패킷을 만들게 된다. 하지만 ICMP 패킷은 IP 헤더 다음에 전송 계층 헤더가 오는 것이 아니라 ICMP 메시지가 따라오기 때문에 일반적인 소켓으로 ICMP 패킷을 만들 수 엇ㅂ다 따라서 이러한 ICMP 패킷을 만들기 위해서 RAW 소켓을 사용해야 한다. RAW 소켓을 사용해서 IP 헤더와 ICMP 메시지를 직접 만들어서 전송해주면 정상적인 ICMP 패킷을 만들어 낼수 있다.

 [raw 예제 1] myping.c.txt