UDP 메시지를 보내고 원시 소켓을 통해 ICMP 응답을받는 파이썬 traceroute을 구현하려고합니다. ICMP 패킷이 모든 비용을 들이지 않고 캡처하는 것을 피하는 문제가 발생했습니다. ICMP 응답은 wireshark에서 정확히 예상대로 나타나지만 소켓은 읽는 데이터를 수신하지 않습니다. 또 다른 복잡성은 sendto()가 Windows 7의 전선에서 패킷을 가져 오지 않기 때문에 Ubuntu를 실행하는 VirtualBox에서 코드를 실행하고 있다는 것입니다. Windows에서 wireshark를 실행하여 패킷을 캡처합니다. 이상한 것은 wireshark가 가상 머신에서 python 스크립트를 실행할 때 ICMP 메시지를 캡처한다는 것입니다. 그러나 Windows에서 스크립트를 실행하려고하면 ICMP 메시지가 wireshark에 표시되지 않습니다. (UDP 패킷은 마술처럼 창문에서 작동하기 시작했습니다.)파이썬 원시 소켓은 ICMP 메시지를받을 수 없습니다. show up in Wireshark
온라인 예제를 통해 소켓을 설정하는 모든 종류의 다른 버전을 가지고 놀았지만 bind()를 사용하고 사용하지 않고 놀았지만 구성은 읽는 소켓을 생성하는 것처럼 보입니다. ICMP 메시지를 읽는 것을 기다리는 시간 만 있습니다.
또한 udp 송신 소켓을 읽으려고하면 udp 패킷을 성공적으로 읽습니다. IPPROTO_ICMP를 설정하자마자 읽기 시간이 초과됩니다.
receive_response 방법 :
def receive_response(rec_socket, packetid, tsend, timeout):
remain = timeout
print packetid
while remain > 0:
ready = select.select([rec_socket], [], [], remain)
if ready[0] == []:
return
print 'got something'
소켓 설정 : 수신
rec_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, ICMP_CODE)
rec_socket.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1)
rec_socket.bind(("",0)) #played with using this statement and skipping it
호출은 단순히 : 그것은 문제처럼 보인다
reached = receive_response(rec_socket, packetid, time.time(), timeout)
Wireshark는 전문적인 도구이기 때문에 간혹 단순한 작업을 위해 사물을 복잡하게 만들 수도 있습니다. 당신은 친절하게 SmartSniff (http://www.nirsoft.net/utils/smsniff.html)를 시도하고 WinpCap의 유무에 관계없이 다시 시도해 주시겠습니까? 이것은 Windows 용입니다 ... –
smartsniff를 사용하면 기본적으로 동일한 동작이 발생합니다. host/windows에서 icmp 패킷을 보지 않고 vm 결과에서 icmp 패킷을 보는 스니퍼로 실행하지만 winpcap을 icmp 패킷으로 설정하면 어느 상황에서도 보이지 않는다. – mao47
프로그램을 실행할 때 관리자 권한이 있어야합니다. – User