Raw 소켓
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
Raw 소켓은 전송 계층 프로토콜에 의해 캡슐화되지 않은, 헤더를 포함한 원시 패킷을 주고받을 수 있는 소켓의 한 종류이다. 표준 소켓과 달리, Raw 소켓은 사용자가 패킷의 헤더를 직접 제어하고 조작할 수 있게 한다. 보안 관련 애플리케이션, 새로운 전송 계층 프로토콜 구현, 네트워크 장비에서의 라우팅 프로토콜 등에 사용된다. 대부분의 소켓 API에서 지원되지만, 윈도우에서는 보안상의 이유로 사용에 제한이 있다.
더 읽어볼만한 페이지
Raw 소켓 | |
---|---|
네트워크 | |
프로토콜 계층 | 전송 계층 또는 인터넷 계층 |
주소 체계 | IP 주소 및 프로토콜 번호 |
기능 | 네트워크 패킷 직접 송수신 커널 프로토콜 스택 우회 |
사용 예시 | 패킷 스니퍼 네트워크 스캐너 사용자 정의 프로토콜 구현 |
상세 정보 | |
설명 | 로우 소켓(raw socket)은 인터넷 프로토콜 스위트의 전송 계층 또는 인터넷 계층에서 작동하는 네트워크 소켓의 한 유형이다. |
특징 | 응용 프로그램이 커널의 프로토콜 스택을 우회하여 네트워크 패킷을 직접 송수신할 수 있도록 한다. 사용자 정의 프로토콜 구현이나 네트워크 트래픽 분석 등에 유용하다. |
사용 시 고려 사항 | 로우 소켓을 사용하려면 일반적으로 관리자 권한이 필요하다. 프로토콜 스택을 직접 다루기 때문에 오류 발생 가능성이 높고, 보안상의 위험이 있을 수 있다. |
추가 정보 | |
기타 관련 기술 | libcap (권한 관리 라이브러리) BPF (Berkeley Packet Filter) |
2. Raw 소켓과 일반 소켓
표준 소켓에서는 전송할 페이로드가 선택한 전송 계층 프로토콜(예: TCP, UDP)에 의해 자동으로 캡슐화된다. 이 때문에 소켓 사용자는 페이로드와 함께 전송되는 프로토콜 헤더의 존재를 알지 못한다.
표준 소켓과 달리 Raw 소켓은 전송 계층의 헤더까지 직접 다룰 수 있으며, 다음과 같은 목적으로 활용된다.
반대로, Raw 소켓은 일반적으로 헤더를 포함한 원시 패킷을 수신한다. 패킷을 전송할 때 헤더를 자동으로 추가할지 여부는 필수가 아니며, 소켓 옵션으로 설정할 수 있다.
Raw 소켓은 nmap과 같은 보안 관련 애플리케이션이나 사용자 공간에서 새로운 전송 계층 프로토콜을 구현하는 데 사용될 수 있다.[8] 또한, 네트워크 장비에서 IGMP, OSPF와 같은 라우팅 프로토콜이나 ICMP 요청 및 응답 처리에 활용된다.[9]
3. 용도
일반적인 소켓 프로그래밍에서는 페이로드 데이터만 다루고 운영체제가 헤더를 자동으로 처리하지만, Raw 소켓을 사용하면 애플리케이션 수준에서 IP 헤더를 포함한 패킷 전체를 읽거나 쓸 수 있다. Raw 소켓으로 패킷을 읽을 때는 보통 헤더 정보가 포함되며, 패킷을 보낼 때 헤더를 자동으로 추가할지는 선택 사항이다.
4. 구현
대부분의 소켓 API, 특히 BSD 소켓을 기본으로 하는 것들은 raw 소켓을 지원한다.
4. 1. 윈도우에서의 제한
마이크로소프트는 2001년 윈도우 XP를 출시하면서 Winsock 인터페이스를 통해 raw 소켓을 지원하기 시작했다. 그러나 3년 후, 마이크로소프트는 보안상의 이유를 들어 Winsock에서의 raw 소켓 지원을 제한했다.[10] 이 제한 조치는 별도의 공지 없이 취소 불가능한 핫픽스를 통해 이루어졌으며, 기존에 raw 소켓을 사용하던 애플리케이션에 대한 지원이나 해결책은 제공되지 않았다.[3] raw 소켓 지원 제한에 대한 기술적인 내용은 나중에 공개되었다.[4][5]윈도우 XP 서비스 팩 2(SP2) 이후 버전의 윈도우 운영체제에서는 raw 소켓 사용에 몇 가지 제한 사항이 적용된다. 하지만 윈도우 서버 2003과 같은 서버용 운영체제에는 이러한 제한이 적용되지 않는다.[6] 일반적으로 Winsock 기반 애플리케이션에서 raw 소켓을 사용하는 것은 권장되지 않는다.[7]
5. 샘플 소스
아래 '''간이 Ping''' 섹션에서는 첫 번째 인수로 지정된 IP 주소의 호스트로 ICMP 에코 요청 패킷을 보내고, 응답이 돌아올 때까지 기다리는 간단한 ping 프로그램의 C 언어 예시 코드를 제공한다. 이 예시는 Raw 소켓 생성부터 패킷 송수신까지의 기본적인 과정을 보여준다.
5. 1. 간이 Ping
다음은 Raw 소켓을 이용하여 특정 IP 주소의 호스트로 ICMP 에코 요청 패킷을 보내고, 응답이 돌아올 때까지 기다리는 간단한 ping 프로그램의 예시이다. C 언어로 작성되었다.#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/* 체크섬 계산 함수 */
u_int16_t checksum(unsigned short *buf, int size)
{
unsigned long sum = 0;
while (size > 1) {
sum += *buf;
buf++;
size -= 2;
}
if (size == 1) {
sum += *(unsigned char *)buf;
}
sum = (sum & 0xffff) + (sum >> 16);
sum = (sum & 0xffff) + (sum >> 16);
return ~sum;
}
/* 지정된 프로토콜의 raw 소켓 생성 함수 */
int make_raw_socket(int protocol)
{
int s = socket(AF_INET, SOCK_RAW, protocol);
if (s < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
return s;
}
/* ICMP 헤더 설정 함수 */
void setup_icmphdr(u_int8_t type, u_int8_t code, u_int16_t id, u_int16_t seq, struct icmphdr *icmphdr)
{
memset(icmphdr, 0, sizeof(struct icmphdr));
icmphdr->type = type;
icmphdr->code = code;
icmphdr->checksum = 0;
icmphdr->un.echo.id = id; // ID 설정
icmphdr->un.echo.sequence = seq; // 시퀀스 번호 설정
// 체크섬 계산 및 설정
icmphdr->checksum = checksum((unsigned short *)icmphdr, sizeof(struct icmphdr));
}
int main(int argc, char **argv)
{
int n, soc;
char buf[1500]; // 수신 버퍼
struct sockaddr_in addr;
struct in_addr insaddr;
struct icmphdr icmphdr; // 보낼 ICMP 헤더
struct iphdr *recv_iphdr; // 수신한 IP 헤더 포인터
struct icmphdr *recv_icmphdr; // 수신한 ICMP 헤더 포인터
// 프로그램 실행 시 IP 주소 인자 확인
if (argc < 2) {
printf("사용법 : %s IP_주소\n", argv[0]);
return 1;
}
// 대상 주소 설정
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(argv[1]);
// ICMP 프로토콜용 Raw 소켓 생성
soc = make_raw_socket(IPPROTO_ICMP);
// ICMP 에코 요청 헤더 설정 (Type 8, Code 0)
setup_icmphdr(ICMP_ECHO, 0, 0, 0, &icmphdr);
/* ICMP 패킷 전송 */
n = sendto(soc, (char *)&icmphdr, sizeof(icmphdr), 0, (struct sockaddr *)&addr, sizeof(addr));
if (n < 1) {
perror("sendto");
return 1;
}
/* ICMP 패킷 수신 */
n = recv(soc, buf, sizeof(buf), 0);
if (n < 1) {
perror("recv");
return 1;
}
// 수신된 패킷에서 IP 헤더 부분을 포인터로 지정
recv_iphdr = (struct iphdr *)buf;
// IP 헤더 길이를 이용하여 ICMP 헤더 시작 위치 계산 및 포인터 지정
recv_icmphdr = (struct icmphdr *)(buf + (recv_iphdr->ihl << 2));
insaddr.s_addr = recv_iphdr->saddr; // 수신된 패킷의 출발지 IP 주소 저장
/*
- 1. 요청 시 지정한 IP 주소(argv[1])와 수신된 패킷의 출발지 IP 주소(inet_ntoa(insaddr))가 일치하는지 확인
- 2. 수신된 ICMP 패킷의 타입이 에코 응답(ICMP_ECHOREPLY, Type 0)인지 확인
- /
if (!strcmp(argv[1], inet_ntoa(insaddr)) && recv_icmphdr->type == ICMP_ECHOREPLY) {
printf("icmp echo reply from %s\n", argv[1]); // 성공 메시지 출력
}
close(soc); // 소켓 닫기
return 0;
}
실행 예아래는 `wikipedia.org`의 IP 주소 중 하나인 `208.80.152.201`을 대상으로 위 코드를 컴파일하여 실행한 결과이다.
```text
[ping@icmp] # ./ping 208.80.152.201
icmp echo reply from 208.80.152.201
```
이 출력은 지정된 IP 주소로부터 성공적으로 ICMP 에코 응답 패킷을 수신했음을 의미한다.
참조
[1]
문서
Linux man page raw(7)
http://linux.die.net[...]
[2]
문서
Raw IP Networking FAQ
http://www.faqs.org/[...]
[3]
문서
Microsoft Tightens the Noose on Raw Sockets
http://seclists.org/[...]
[4]
웹사이트
Windows XP Service Pack 1 が実行されているコンピュータにセキュリティ更新プログラム MS05-019 を適用すると、TCP パケットまたは UDP パケットを RAW IP ソケット経由で送信するネットワーク プログラムが機能しなくなることがある
https://support.micr[...]
2016-10-18
[5]
Internet Archive
Networking programs that send TCP packets or UDP packets over raw IP sockets may stop working after you apply security update MS05-019 to a computer that is running Windows XP with Service Pack 1
https://web.archive.[...]
[6]
Microsoft Docs
TCP/IP Raw Sockets - Win32 apps
https://docs.microso[...]
[7]
Microsoft Docs
Raw Sockets - Win32 apps
https://docs.microso[...]
[8]
웹인용
raw(7): IPv4 raw sockets - Linux man page
http://linux.die.net[...]
[9]
웹인용
Raw IP Networking FAQ
http://www.faqs.org/[...]
[10]
간행물
Ian Griffiths for IanG on Tap
2004-08-12
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com