winpcap를 이용해서 VC++ 프로그래밍 중입니다.
글쓴이: sepiros / 작성시간: 화, 2004/11/23 - 7:45오후
현재 패킷을 모니터링 하는 중인데..
특정 포트 번호를 사용하면..
서버에서... 그 해당 ip로 패킷을 내려보낼려고 합니다.
특정 싸이트에 접속을 하게 한다든지.. 차단을 시키다든지..
어느분께서..winpcap는 패킷을 모니터링(복사 후 보는거) 라서.. 차단이 어렵다고 하는데..
되신 send packet 해서 rst를 내려 보내면.. tcp에서 자동으로 차단이 된다고 하네요.
지금 제가 궁금한건.. send packet 하는 부분이.. 어렵네요..
메뉴얼 보면서. 여기까지 왓는데..
리눅스가 아니지만. 여기가. 네트워크 쪽은... 강하다고 들었습니다..
그럼. 고수, 중수, 하수. 모든 상관하지 않고.. 귀담아 듣겠습니다.
감사합니다.
Forums:
답변...
http://www.packetfactory.net/projects/libnet/
이 이사이트 참고 하세요.
그리고 패킷 생성하는건..윈도에서 가능할지 모르겠습니다.
찾아보면 라이브러리가 있긴 있을텐데..
libnet쪽 프로젝트가 윈도우쪽에 옮겨졌는지..잘을 모르겠어서리..
윈도쪽으로 사용해보질 안아서리..
한번 찾아 보시고 안되면..
리눅스쪽에서 해셔야 할겁니다..
그리고 만약 한다면..pcap+libnet 형태가 될텐데..
하시려는 프로젝트로 볼때..두개의 조합보다는
공부하시거나..좋은 결과물을 원하신다면..
다른 방향을 알아보시는게..좋을듯 한데..
http://wiki.kldp.org/wiki.php/DocbookSgml/Netfilter-hacking-TRANS
이쪽을 한번 보시고 고민 해보시는것도 좋은 방법 같습니다.
Re: winpcap를 이용해서 VC++ 프로그래밍 중입니다.
winpcap때문이 아니라, 토폴로지(topology)문제 입니다.
해당 프로그램을 장착한 시스템이 게이트웨이(gateway)에 있는가? 아닌가?의
차이입니다.
참고로, 만일, 랜카드 2개를 장착한 PC를 게이트웨이로 하여 양단간의 트래픽을 캡쳐한 후 이를 분석 및 필터링하여 반대편으로 전송하게 프로그램을 작성한다면, 차단이 어려운것은 아닙니다.
또한, Winpcap에도 SendPacket()이라는 패킷을 전송하는 루틴이 있습니다.
리눅스(netfilter), *BSD(pf)라고 할지라도 게이트웨이가 아니고서는 차단할 방법이 마땅히 없는것입니다.
이또한 토폴로지 문제에 걸립니다.
1) Winpcap이 스위치의 미러링포트를 받아서 쓰는 경우(수동적인 수신;passive monitoring)에는 일단 100% 패킷을 잡는다는 것은 불가능합니다. 또한, 트래픽양이 많은 시간대 또는 상황이 발생할때,
100% 차단이 보장되지 않습니다. 소위, 재수없으면
잘 안되는...... 그래도 대충 차단은 합니다. (제품성은 있으나, 상품성은 떨어지는....)
2) 만일 게이트웨이로 동작한다면 차단이 100%보장됩니다만, 이때는 성능 및 안정성 문제가
가장 큰 장애요인입니다. 마치 검열이 심한 특정조직의 우편물이 오래걸릴 수 있는
것과 마찬가지지요. 또한, 안정성은, 해당 프로그램이 잘못될 경우 망(network)이 마비된다는......
libnet또는 libnetNT와 tcp reset등을 키워드로 검색해보면 대충 자료를 얻으실 수 있을 것입니다.
tcp 헤더 및 그 용도와 의미를 명확히 이해를 해야 합니다.
허접하지만;;
어느분께서..winpcap는 패킷을 모니터링(복사 후 보는거) 라서.. 차단이 어렵다고 하는데..
이부분을 구현하시기 위해서는 드라이버를 개발하지 않고 winpcap을 사용하실 경우
PC에 랜카드를 2개 장착하신 후 하시는게 가장 확실한 방법입니다.
in/out을 각각의 랜카드가 따로 작동하게끔 해주는 방식입니다.
sendpacket 사용방법은
pcap_sendpacket이라는 함수를 이용하면 그다지 어렵지 않습니다.
리눅스와 윈도우의 차이점은 그다지 없습니다.
pcap_sendpacket함수의 인자값으로는 첫번째 인자는 장치디스크립터가 오고 두번째 인자는 unsigned char* 값이 와야합니다.
즉 패킷의 시작주소가 됩니다.
마지막 세번째 인자는 패킷의 길이가 됩니다.
패킷조립방식은 각각의 프레임을 RAW하게 코딩하셔서 패킷조립후 함수를 이용하여 out장치디스크립터로 전송하시면됩니다.
질문하신분과 같은경우 in으로 들어온패킷을 잡아서 사용자가 원하는 룰에 맞는지 검사하고 룰에 걸릴 경우
out장치로 쏘지 않으면 됩니다. 그럴경우 패킷은 자동드랍됩니다.
물론 밑에 하단에 있는 PC의 경우 in장치와 연결이 되있고 밖으로 나가는 외부 회선은 out과 연결되있어야됩니다.
충분한 답변이 되셨을런지 모르겠네여
댓글 달기