티스토리 뷰
오늘은 네트워크의 보안분야에서 사용되는 소켓들 중 하나인 RAW 소켓에 대하여 알아보려고 합니다.
저도 처음 들어본 내용이라 신기한게 많았는데, 글을 포스팅하면서 정리해보고자 합니다!
1. RAW Socket(RAW 소켓)
RAW 소켓을 해석해보면 가공되지 않은 소켓이라는 뜻인데, RAW Socket을 잘 표현하고 있다는 생각이 드네요.
어느 특정한 프로토콜 용의 전송 계층 포맷팅 없이 인터넷 프로토콜
패킷을 직접적으로 주고 받게 해주는 소켓
RAW 소켓에 대해서 참 어렵게 정의되어 있지만 막상 공부해보면 쉽게 이해할 수 있을 것입니다. 우리가 일반적으로 사용하는 소켓은 네트워크를 통해 데이터를 주고 받을 때 헤더정보의 추가 및 분리와 같은 작업을 운영체제의 프로토콜 스택 내에서
자동으로 처리해주는데, 이는 TCP/IP 4계층의 Transport Layer 이하를 아래와 같이 추상화하였기 때문입니다.
그렇기 때문에 개발자는 헤더를 접할 기회가 없습니다. 하지만 우리가 새로운 프로토콜을 사용하거나, 헤더의 정보를
이용하여 보안 프로그램과 같은 것을 구현하는 경우에는 헤더를 직접 제어해주어야 합니다.
이러한 상황에서 RAW소켓은 헤더 정보들에 대해 프로그래머가 직접 제어할 수 있게 해줍니다.
즉, RAW소켓을 사용하면 IP헤더와 TCP헤더를 직접 제어할 수 있는데, 이를 모두 사용자 데이터로 취급하므로 네트워크 계층에 어떤 종류의 헤더가 와도 상관이 없게됩니다. 그렇기에 RAW 소켓으로 TCP데이터를 전송하고 싶은 경우에 IP헤더와 TCP헤더를 보내고자 하는 데이터의 앞부분에 직접 만둘어주어야 합니다.
[ RAW Socket 특징 ]
응용 계층과 전송 계층, 네트워크 계층에서 모두 접근이 가능하다.
네트워크 계층 헤더와 전송 계층 헤더를 직접 제어가능하다.
네트워크 계층으로 전송되는 모든 패킷을 전부 모니터링 및 감지 가능하다.
IP Segment에서 암호화된 악성코드가 있는 경우, IP계층에서 이를 필터링 못해 문제가 발생할 수 있다.
RAW소켓은 사용자데이터 취급을 받기 때문에 여러 계층으로 접근이 가능합니다. 또한 일반적으로 운영체제의 프로토콜 스택에서 패킷의 목적지 IP주소가 자신의 IP주소인 패킷은 받아들이고 다른 IP주소의 패킷은 버립니다. 그래서 RAW 소켓을 사용하지 않는 일반적인 어플리케이션들은 IP주소가 자신과 다르거나 자신의 포트 주소가 아닌 패킷은 확인이 불가능하지만, RAW소켓을 사용하게 되면 IP주소나 포트주소가 다르더라도 물리계층인 인터넷 디바이스 드라이버에서 오는 모든 패킷을 전부 받아 확인이 가능합니다. RAW소켓을 사용하는 대표적인 예로는 패킷들을 감지하는 WireShark(와이어샤크)가 있습니다. 모든 패킷을 모니터링하는 경우 말고, 또 RAW 소켓을 이용할 수 있는 또다른 분야는 프로토콜 스택을 구현하고 테스트하는 경우인데, 운영체제를 만들 때 오류가 나면 손 쓸 사이도없이 시스템이 멈추거나 재부팅되며, 테스트 할 때 마다 새로 올려야 합니다. 하지만 RAW소켓을 사용하면 애플리케이션 차원에서 프로토콜 스택을 구현하고 테스트가 가능하며, 소스코드에 문제가 발생해도 최소한 시스템이 멎거나 재부팅을 하지는 않아도 됩니다.
[ RAW 소켓 vs 일반 소켓 ]
- 일반적인 소켓의 흐름도
- RAW 소켓의 흐름도
2. RAW 소켓 코드
우리가 만들어야하는 소켓구조체는 다음을 따라서 생성하면 됩니다.
SOCKET socket(
_ln_ int af ->소켓이 사용할 프로토콜 체계
_ln_ int type ->소켓의 타입
_ln_ int protocol -> 프로토콜 체계 중 실제로 사용할 프로토콜
)
소켓이 사용할 프로토콜 체계에는 크게 2가지가 있는데,
하나는 PF_INET 프로토콜 체계(프로토콜 패밀리)이고, 두번째는 AF_INET 주소 체계(주소 패밀리)입니다.
두번째 인자로는 어떤 종류의 소켓을 만들 것인지를 넣어주어야 하는데, 우리는 RAW_SOCKET을 넣어주면 됩니다.
세번째 인자는 실제로 사용할 프로토콜을 적어야 합니다. ICMP는 IPPROTO_ICMP, TCP는 IPPROTO_TCP를 넣어주면 됩니다.
그래서 우리가 이를 이용하여 다음과 같이 RAW Socket을 만들 수 있습니다.(*Root계정으로만 사용이 가능합니다.)
sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
Q) Root계정으로만 RAW 소켓을 만들 수 있는 이유?
RAW 소켓을 구현하기 위해서는 TCP/IP 스택을 제어해야 합니다. 그런데 TCP/IP 스택을 제공하는 곳이 커널이므로
커널에 접근이 가능한 root계정으로만 RAW소켓의 생성이 가능한 것입니다.
Q) 스니핑(Sniffing) 기법이란?
위에서 적어놓은 3번째 특징은 RAW소켓을 사용하는 경우 네트워크 계층으로 오는 모든 패킷을 모니터링 및 감지가능하다는 것인데, 이를 스니핑기법이라고 하며, 스니핑기법으로 구현된 대표적인 프로그램이 와이어샤크(Wireshark)입니다.
'네트워크' 카테고리의 다른 글
[Web] HTTP와 HTTPS의 개념 및 차이점 (34) | 2020.10.17 |
---|---|
[Web] Forward와 Redirect 차이 (30) | 2019.09.10 |
[네트워크 프로그래밍] Http 프로그래밍과 Socket 프로그래밍 차이 (36) | 2019.02.17 |
[Web] GET과 POST의 비교 및 차이 (37) | 2017.11.09 |
[TCP/UDP] TCP와 UDP의 특징과 차이 (140) | 2017.11.05 |