2011-03-23 2 views
3

파이썬을 사용하여 TCP 스트림 소켓에서 완전한 (원시) IP 프레임을 읽어야합니다. 본질적으로 마치 수정되지 않은 프레임이 모든 헤더 정보를 포함하여 물리적 라인에서 나온 것처럼 보입니다.파이썬의 TCP 소켓에서 완전한 IP 프레임을 읽는 방법?

파이썬에서 원시 소켓을 조사했지만 몇 가지 문제가있었습니다. 나는 내 자신의 패킷을 형성 할 필요가 없으며 단순히 그대로 읽고 전달해야한다.

그래서 기존 TCP 소켓 (파이썬에서)에서 전체 IP 프레임 (헤더 포함)을 읽을 수 있습니까?

표준 라이브러리 만 사용하는 것이 좋습니다. 또한 나는 리눅스 호스트에있다.

감사합니다.

+6

(모든 언어에 상관없이) "TCP 소켓에서 전체 IP 프레임을 읽을 수 없습니다." TCP 소켓은 원시 패킷에 대한 액세스를 제공하지 않습니다. 패킷 스니핑 인터페이스를 사용해야 할 것입니다. –

+0

그렇다면 TCP 서버를 만든 경우 TCP 포트에 연결된 원시 소켓을 만들 수 있습니까? 어느 쪽이든, 나는 제안 된 것처럼 패킷 스니핑 인터페이스를 사용할 것이라고 생각한다. –

+0

원시 소켓에는 "포트"의미가 없습니다! TCP 서버에서 소켓은 네트워크의 * 위 *에 생성됩니다. 수신하는 모든 데이터는 이미 OS에 의해 하위 계층에서 제거됩니다. 그 (것)들을 얻는 유일한 방법은 본래 소포를 킁킁 거리고 유형/항구 및 다른 상위 수준 의미론을 너 자신 (또는 어떤 도서관을 통해) 결정하기위한 것이다. – Santa

답변

3

표준 라이브러리에 포함되지 않은 Scapy을 사용하고 초고속 기능이 필요하지 않은 경우 sniff 기능을 사용할 수 있습니다. 콜백이 필요합니다. 당신은 count=0으로, 다른 스레드 또는 프로세스의 냄새를 실행하고 영원히 실행하려면 큐에 수신 된 패킷을 고수 할 수

pkts_rxd = [] 
def process_and_send(pkt): 
    pkts_rxd.append(pkt) 
    sendp(pkt, 'eth1') 
sniff(prn=process_and_send, iface='eth0', count=100) 

:처럼 뭔가. str (pkt)을 큐에 넣었는지 확인하십시오. multiprocessing.Queue에 scapy 패킷을 넣을 때 이상한 일이 일어나는 것을 보았습니다.

데비안과 우분투는 모두 적절한 저장소에서 Scapy를 사용합니다. 나는 rpm 배포판에 관해 모른다. 소스에서 설치하는 것은 꽤 쉽습니다 : ./setup.py install.

+0

제안 및 사례에 감사드립니다! 코드에서 이것을 시도해보십시오 ... –

+0

OK, 이것은 확실히가는 길이었습니다. 팁 고마워! –

관련 문제