يېڭىلاندى 1 month ago
ICMP는 인터넷이 자기 자신에 대해 이야기하는 방식입니다.
TCP는 데이터를 전달합니다. UDP는 스트림을 전달합니다. 하지만 문제가 발생했을 때—목적지가 존재하지 않거나, 패킷이 무한 루프를 돌거나, 메시지가 경로에 비해 너무 클 때—네트워크는 그 사실을 알릴 방법이 필요합니다. 바로 그것이 ICMP, 즉 인터넷 제어 메시지 프로토콜입니다.
ping이나 traceroute를 사용해본 적이 있다면, 이미 ICMP와 대화를 나눈 것입니다.
네트워크의 피드백 루프
ICMP는 IP와 함께 네트워크 계층에서 동작합니다. 애플리케이션 데이터를 전달하지 않습니다. 네트워크에 관한 메타데이터—오류 보고, 진단 응답, 라우팅 제안—를 전달합니다.
라우터가 패킷을 전달할 수 없을 때, 그 이유를 설명하는 ICMP 메시지를 보냅니다. 호스트가 다른 호스트의 상태를 확인하고 싶을 때, ICMP 에코 요청을 보내고 응답을 기다립니다. 패킷의 TTL이 소진되면, 해당 패킷을 폐기한 라우터가 발신자에게 오류 알림을 돌려보냅니다.
ICMP가 없다면, 연결 실패는 소리 없이 타임아웃될 것입니다. 관리자는 기본적인 도달 가능성을 테스트할 수 없을 것입니다. 라우터는 문제를 보고할 수 없을 것입니다. 네트워크는 자신의 장애에 대해 입을 닫아버릴 것입니다.
중요한 메시지 유형
ICMP는 수십 가지 메시지 유형을 정의합니다. 그 중 몇 가지가 대부분의 역할을 담당합니다:
에코 요청과 에코 응답 (타입 8과 0) 은 ping 명령어를 구동합니다. 요청을 보내면, 목적지는 동일한 데이터를 담은 응답을 돌려보냅니다. 이를 통해 양방향 연결을 확인하고 왕복 시간을 측정합니다.
목적지 도달 불가 (타입 3) 는 패킷이 전달되지 못했음을 의미합니다. 코드가 이유를 구체적으로 알려줍니다: 네트워크 도달 불가, 호스트 도달 불가, 포트 도달 불가, 단편화 필요하지만 금지됨. 닫힌 UDP 포트에 연결하면, 목적지는 ICMP 포트 도달 불가 메시지를 보냅니다—이것이 UDP가 아무도 수신하지 않음을 알게 되는 방식입니다.
시간 초과 (타입 11) 는 패킷의 TTL이 0에 도달했음을 의미합니다. 모든 라우터는 패킷을 전달하기 전에 TTL을 1씩 줄입니다. TTL이 0이 되면, 라우터는 패킷을 폐기하고 이 메시지를 보냅니다. 이 메커니즘은 패킷이 라우팅 루프에서 영원히 순환하는 것을 방지합니다. 또한 지금까지 설계된 가장 우아한 진단 도구 중 하나를 가능하게 합니다.
리디렉트 (타입 5) 는 라우터가 더 나은 경로를 제안할 수 있게 합니다. 같은 네트워크상의 다른 라우터로 패킷을 전달해야 하는 라우터는, 일단 올바르게 전달하면서 발신자에게 알립니다: 다음에는 그 라우터로 직접 보내세요.
Ping의 작동 방식
Ping은 단순한 대화입니다:
- 컴퓨터가 목적지로 ICMP 에코 요청을 보냅니다
- 목적지가 ICMP 에코 응답을 돌려보냅니다
- 컴퓨터가 왕복 시간을 측정합니다
각 요청에는 시퀀스 번호가 포함되어 있어 응답을 요청에 매칭하고 패킷 손실을 감지할 수 있습니다. Ping은 보통 초당 한 번 요청을 보내며, 패킷 손실, 지연 변동, 기본 연결 상태를 확인합니다.
성공적인 ping은 경로가 양방향으로 존재함을 증명합니다. 반면 실패한 ping이 증명하는 것은 생각보다 적습니다—ICMP는 경로 어디에서든 차단될 수 있기 때문입니다. 많은 네트워크가 보안상의 이유로 ping을 필터링합니다. 응답이 없는 호스트는 다운된 것일 수도 있고, 살아 있으면서 요청을 무시하는 것일 수도 있습니다.
Traceroute의 작동 방식
Traceroute는 처음 보기보다 훨씬 더 우아합니다.
TTL 필드는 안전 메커니즘으로 존재합니다. 패킷은 각 홉에서 TTL을 감소시키며, 0에 도달하면 폐기됩니다. 이는 패킷이 라우팅 루프에 갇혀 네트워크를 영원히 떠돌지 못하도록 막습니다.
Traceroute는 바로 이 안전 기능을 역이용합니다. 의도적으로 특정 지점에서 폐기되도록 설계된 패킷을 보내고, 되돌아온 오류 메시지를 읽어 경로를 파악하는 것입니다.
방법은 이렇습니다: TTL=1인 패킷을 보냅니다. 첫 번째 라우터가 TTL을 0으로 줄이고 패킷을 폐기한 뒤, ICMP 시간 초과 메시지를 돌려보냅니다. 이 메시지에서 첫 번째 라우터의 주소를 알 수 있습니다.
이번엔 TTL=2인 패킷을 보냅니다. 첫 번째 라우터는 통과하지만 두 번째에서 폐기됩니다. 또 다른 오류 메시지, 또 다른 주소. 이렇게 TTL을 하나씩 늘려갑니다. 각 패킷은 이전보다 한 홉 더 나아가고, 각 오류 메시지는 경로상의 라우터를 하나씩 더 드러냅니다.
마침내 TTL이 남은 상태로 목적지에 도달한 패킷은, traceroute가 보낸 내용에 따라 에코 응답이나 포트 도달 불가 메시지로 다르게 응답을 받습니다. 이것이 경로 탐색이 완료되었다는 신호입니다.
구현 방식에 따라 다른 프로브 유형을 사용합니다. Unix의 traceroute는 전통적으로 높은 포트 번호의 UDP를 사용합니다. Windows의 tracert는 ICMP 에코 요청을 사용합니다. 최신 버전은 TCP도 지원합니다. 프로브 유형보다 핵심 메커니즘이 더 중요합니다: 경로를 따라 각 라우터에서 TTL 만료가 시간 초과 메시지를 유발하는 방식입니다.
Traceroute는 지연 변동을 측정하기 위해 홉당 세 번의 프로브를 보냅니다. 라우터가 응답하지 않는 경우—ICMP 응답을 보내지 않도록 설정되어 있거나 방화벽이 차단하고 있는 경우—해당 홉은 별표(*)로 표시됩니다. 경로는 불완전하게 보이지만, 한 가지는 알 수 있습니다: 그 구간 어딘가에서 ICMP가 차단되고 있다는 것입니다.
네트워크가 ICMP를 차단하는 이유
ICMP의 강력한 진단 능력은 보안 우려를 낳습니다. Ping 스윕으로 어떤 호스트가 활성화되어 있는지 탐색할 수 있습니다. ICMP 플러드는 대상 시스템을 마비시킬 수 있습니다. 공격자들은 다른 프로토콜을 차단하면서 ICMP만 허용하는 네트워크를 통해 데이터를 터널링한 사례도 있습니다.
그래서 많은 방화벽이 ICMP를 제한합니다. 전부 차단하는 곳도 있고, 오류 메시지는 허용하되 에코만 차단하는 곳도 있으며, 플러드를 방지하기 위해 속도를 제한하는 곳도 있습니다.
하지만 ICMP를 완전히 차단하면 오히려 문제가 생깁니다. 경로 MTU 탐색(Path MTU Discovery)은 경로에서 허용되는 최대 패킷 크기를 파악하기 위해 ICMP "단편화 필요" 메시지에 의존합니다. 이 메시지가 없으면 큰 패킷이 소리 없이 사라집니다—연결은 성공적으로 수립되지만, 실제 데이터를 보내려 할 때 갑자기 멈춥니다. 목적지 도달 불가 메시지는 TCP가 느린 타임아웃 대신 빠르게 실패하도록 돕습니다. ICMP를 완전히 차단하는 것은 미미한 보안 이점을 위해 진단 능력 전체를 희생하는 셈입니다.
현명한 접근법은 이렇습니다: 목적지 도달 불가와 시간 초과는 허용하고(네트워크 정상 동작에 필수), 에코는 속도를 제한하고(유용하지만 남용 가능), 리디렉트는 차단합니다(거의 필요 없고 잠재적으로 악용 가능).
ICMPv6: 진단 그 이상
IPv6 버전의 ICMP는 ICMPv4가 하는 모든 것을 하면서 그 이상을 수행합니다. IPv6에서 ARP가 사라진 자리를 ICMPv6의 이웃 탐색(Neighbor Discovery)이 채웠습니다. 호스트는 ICMPv6를 사용하여 라우터를 찾고, 주소를 학습하고, 같은 로컬 네트워크에 누가 있는지 파악합니다.
이 때문에 ICMPv6는 선택이 아닌 필수입니다. 비활성화하면 기본 IPv6 동작 자체가 멈춥니다. 호스트가 게이트웨이를 찾을 수 없게 되고, 링크-로컬 주소도 확인할 수 없게 됩니다. 네트워크 전체가 작동을 멈출 것입니다.
ICMPv6 필터링은 신중하게 접근해야 합니다. 잘못된 메시지 유형을 차단하면 이웃 탐색이 중단됩니다. 이 프로토콜은 선택적으로 처리하기엔 너무 깊이 통합되어 있습니다.
네트워크의 목소리
ICMP는 진단 인프라입니다. Ping은 도달 가능성을 테스트하고, traceroute는 경로를 추적하며, 오류 메시지는 장애의 원인을 설명합니다. ICMP 없이는 네트워크가 소리 없이 실패하고, 문제를 추적하기도 어려워집니다.
ICMP를 이해하면 여러 의문들이 풀립니다: 왜 ping이 어떤 서버에는 되고 어떤 서버에는 안 되는지, 왜 traceroute에 구간이 빠지는지, 왜 모든 ICMP를 차단하면 문제를 해결하기보다 더 많은 문제를 일으키는지. 네트워크는 목소리를 가지고 있습니다. ICMP가 바로 그 목소리입니다.
ICMP에 관한 자주 묻는 질문
어떤 서버에는 ping이 되고 어떤 서버에는 안 되는 이유가 뭔가요?
많은 서버와 네트워크가 보안 조치로 ICMP 에코 요청을 차단합니다. ping이 실패했다고 해서 서버가 다운된 것은 아닙니다—서버가 정상적으로 트래픽을 처리하면서 ping만 무시하고 있을 수 있습니다. 실제 서비스(HTTP, SSH)로 직접 테스트해 진정한 가용성을 확인하세요.
traceroute 출력에 나오는 별표는 무슨 의미인가요?
별표는 해당 홉이 ICMP 시간 초과 메시지로 응답하지 않았다는 뜻입니다. 그 라우터가 ICMP 응답을 보내지 않도록 설정되어 있거나, 방화벽이 이를 차단하고 있는 것입니다. 패킷은 여전히 그 홉을 통과합니다—단지 어떤 라우터인지 알 수 없을 뿐입니다.
방화벽에서 ICMP를 완전히 차단해도 괜찮을까요?
아닙니다. ICMP를 완전히 차단하면 경로 MTU 탐색이 작동하지 않아, 작은 패킷에서는 연결이 정상이지만 더 큰 데이터를 전송할 때 갑자기 멈추는 불가사의한 장애가 발생합니다. 연결이 빠르게 실패하도록 돕는 목적지 도달 불가 메시지도 차단됩니다. 에코에는 속도 제한을 두되 오류 메시지는 허용하는 선택적 필터링이, 네트워크 기능을 해치지 않으면서 보안을 확보하는 올바른 방법입니다.
ping과 traceroute는 어떻게 다른가요?
Ping은 목적지에 도달할 수 있는지 확인하고 지연 시간을 측정합니다. Traceroute는 경로상의 모든 라우터를 추적합니다. Ping이 "거기 갈 수 있나요?"를 묻는다면, Traceroute는 "어떤 길로 가나요?"를 묻습니다. 둘 다 ICMP를 사용하지만, traceroute는 TTL 만료를 활용하여 ping으로는 절대 볼 수 없는 중간 경로의 라우터들을 하나씩 드러냅니다.
بۇ بەت پايدىلىق بولدىمۇ؟