2008-09-16 2 views

답변

3

목표를 핑 (ping)하고 점차 TTL을 높이고 "TTL 초과"응답의 출처를 관찰합니다.

+0

소리가 나는 것처럼 보이지만 조금 복잡합니다. – UnkwnTech

+2

실제로 traceroute가하는 일입니다. – Ferruccio

+1

C에서 원시 소켓을 사용하지 않고 TTL을 늘리는 방법은 무엇입니까? – brian

1

일부 응용 프로그램에서는 원시 소켓을 사용하는 대신 더 높은 번호의 tcp 또는 udp 포트 번호를 사용합니다. tcp 포트를 알려진 웹 서버의 포트 80에 연결하면 해당 서버로 traceroute 할 수 있습니다. 단점은 대상 장치에서 열어 놓은 포트를 확인하는 것이 필요하다는 것입니다.

+0

나는 root를 필요로하지 않고 이것을 한 단일 도구를 찾으려고 노력했다. 나는 할 수 없었다. google.com과 같이 traceroute 할 수있는 루트가 필요없는 예가 있습니까? –

0

ICMP 패킷을 보내고 받기 위해 원시 소켓을 사용할 필요가 없습니다. 적어도 Windows에서는 그렇지 않습니다.

+0

사용자 정의 TTL이있는 패킷은 어떻게됩니까? – brian

+0

99.99 % 잘못되었습니다. ICMP 메시지를 위조하고 보내려면 원시 소켓이 필요하지만 기본적으로 비활성화 된 일부 Linux 시스템에서는 100 % 잘못하지 않는 ICMP 에코 요청 메시지에 대한 예외가 있습니다. –

+0

@ jean-loup - 저는 수년 전에 ICMP를 내부적으로 구현하여 서버를 감시하는 네트워크 모니터링 시스템에 대한 저의 의견을 기반으로했습니다. 원시 소켓을 사용하지 않았습니다. 이것은 거의 10 년 전이었을 것입니다. 그래서 상황이 바뀔 수도 있습니다. 또한 모든 Windows 버전이 실제로 원시 소켓을 지원하지는 않습니다.나는 마이크로 소프트가 실제로 그것을 가능하게했을 때 기억이 나지 않지만, 보안 상 걱정 때문에 XP SP2에서 해제했다. 그때 이후로 나는 그들이 무엇을했는지 모른다. – Ferruccio

-1

현대 리눅스 배포판을 사용하고 있다면 traceroute (또는 traceroute가 setuid가 나오기 전에 나온 tracepath)와 tcptraceroute를 볼 수 있습니다. 이들 중 누구도 RAW 소켓을 필요로하지 않습니다. Fedora 9에서 확인했는데, setuid가 아니며 일반 사용자의 기본 옵션으로 작업합니다.

tcptraceroute가 사용하는 코드는 esp 일 수 있습니다. 예를 들어, 주소에 대한 ICMP 패킷이 반드시 포트 80에 대한 TCP 연결과 동일한 위치에서 끝나는 것은 아닙니다.


int opt_on = 1; 
int opt_off = 0; 

fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) 
setsockopt(fd, SOL_IP, IP_MTU_DISCOVER, &opt_off, sizeof int) 
setsockopt(fd, SOL_SOCKET, SO_TIMESTAMP, &opt_on, sizeof int) 
setsockopt(fd, SOL_IP, IP_RECVTTL, &opt_on, sizeof int) 

... 다음는 cmsg 결과에서 데이터를 읽어 :

(일반 사용자로) 경로 추적의 strace를 지내요은 같은 일을 보여줍니다.

+0

traceroute.c의 소스 코드는 패킷의 TTL을 다시 쓰기 위해 사용자가 루트가 될 것으로 기대합니다. 배포판을 보면 traceroute이 setuid 루트 일 가능성이 큽니다. – brian

0

traceroute은 ICMP 프로토콜을 사용합니다. UDP와 TCP와 마찬가지로 이것은 일반 소켓 API를 통해 액세스 할 수 있습니다. 1024 이하의 UDP 및 TCP 포트 번호 만 루트가 아닌 사용으로부터 보호됩니다. ICMP는 모든 사용자가 자유롭게 사용할 수 있습니다.

ping 및 traceroute 작동 방식을 실제로보고 싶다면 CodeProject에서 예제 C 코드 구현을 다운로드 할 수 있습니다.

요약하면 간단히 ICMP 소켓을 열고 traceroute는 대상에 도달 할 때까지 setsockopt를 사용하여 TTL을 증가시킵니다.

관련 문제