RAW 소켓 디바이스 드라이버 관련 질문
글쓴이: declspec / 작성시간: 토, 2011/01/08 - 10:01오후
안녕하세요 좋은조언 얻을수있을까 싶어 질문합니다
다름이 아니라 윈도우즈이든 UNIX 시스템이든 RAW 소켓을 만들어서 패킷을 수신할때
네트워크 인터페이스카드가 수신하는 프레임을
TCP/UDP 단을 거치지 않고 IP 헤더까지 통째로 얻어올 수 있잔아요?
그런데 소켓을 생성할때 네트워크 인터페이스에 대해서 지정을 하는건
못봤는데(있는데 모르는 것일수도 있음)
만약 네트워크 인터페이스가 2개 이상있는 컴퓨터에서
RAW 소켓을 만들면 어떻게 될까요?
예를들어 이더넷카드와 무선랜카드 2개가 있는 컴퓨터에서
RAW 소켓을 만들고
이 네트워크 인터페이스들을 모두 promiscuous 모드로 만들면
RAW 소켓에 들어오는 데이터는 두 인터페이스 모두에 들어온
데이터가 전부 잡힐까요?
또한, RAW 소켓을 이용해서 패킷을 생성해서
보낸다고 할때 인터페이스가 여러개인경우 어느 인터페이스로 보낼지는
어떻게 지정할까요?
Forums:
리눅스의 경우만 대충 설명해보면 인터페이스가 여러개
리눅스의 경우만 대충 설명해보면
인터페이스가 여러개 있으면 여러개 있는대로 들어옵니다. 특정인터페이스에 붙이려면 SO_BINDTODEVICE같은 socket option이 있고요, bind()로 특정 IP주소에만 붙일수도 있을것이며, 특정프로토콜만 잡으려면 소켓생성할때 프로토콜을 지정하면 되겠죠. 보낼때는 SO_BINDTODEVICE같은 특별한 옵션을 사용하지 않았으면 라우팅테이블정보에 따라 어느 인터페이스로 나갈지 결정되겠죠.
PF_RAW가 아니라 PF_PACKET소켓을 사용하면 더 하위에서 작업할수 있습니다. PF_PACKET소켓에 사용하는 sockaddr_ll 주소타입에 보면 sll_ifindex같은 필드가 있으서 어느 인터페이스에서 왔는지 알아내거나 어느 인터페이스로 보낼지 지정할수 있습니다.
댓글 달기