[Network] ICMP

2024. 8. 20. 22:45·Computer Science/Network

 

들어가기 전에

다른 업체에 방화벽 허용 요청을 했는데, 방화벽이 허용된 걸 어떻게 알 수 있을까요?

 

위의 질문과 관련해서 ICMP에 대한 개념과 ICMP 메시지가 활용되는 방법들에 대해 정리했다. 보안 상의 이슈로 모든 네트워크 통신 문제를 ICMP를 사용해 확인할 수는 없지만 실무에서 많이 사용되기에 알아두면 좋겠다.

 

 

ICMP(Internet Control Message Protocol)

ICMP의 탄생을 이해하기 위해서는 IP의 특징을 먼저 알아야 한다.

 

IP로 데이터를 전송하면 도착한 결과를 확인할 수 있을까?

 

 

정답은 NO 다. IP에는 데이터가 제대로 도착했는지 확인할 수 있는 방법이 없기 때문이다. "데이터를 보내기 위해 최선을 다하겠지만 안 되도 어쩔 수 없지."라는 IP의 특징을 바로 Best effort라고 한다. 그래서 IP에 의한 통신이 제대로 이루어졌는지 확인하는 기능을 갖춘 프로토콜로서 ICMP가 만들어지게 된 것이다.

 

이렇듯 ICMP는 관리용 프로토콜로 만들어져서 호스트와 호스트, 호스트와 라우터, 라우터와 라우터 간의 네트워크 제어 정보를 교환하는 데 사용되고 있다. IP Packet이 전달되는 과정 중에 어떤 에러가 발생하거나 전달 흐름에서 효율적인 제어가 필요할 때  ICMP 메시지가 생성되어서 IP Packet의 Payload에 포함되어진다.

 

그렇다면 ICMP 메시지에는 어떤 정보가 담기는지 알아보자.

 

 

ICMP 메시지

ICMP 메시지의 구조를 알기 위해서는 Type을 먼저 알아야 한다.

 

Type은 메시지가 어떤 내용을 담고 있는지를 파악할 수 있는 정보이다. 카테고리를 예로 들자면, 대분류가 될 수 있겠다. 이 정보는 크게 두 가지로 나뉘어지는데 일반적인 문제 발생 내용이 담긴 Error reporting 메시지와 네트워크 상태 확인을 위해 사용되는 Query 메시지이며 각각 여러 개의 숫자로 구성된다. Type을 통해 대략적으로 어떤 문제로 인해 메시지가 생성되었는지를 파악하면 나머지 정보로 세세한 내역을 확인할 수 있다.

 

  • Error reporting : 일반적인 IP Packet을 처리하는 과정에서 문제 발생 시 생성되는 형태
  • Query : 네트워크 상태 확인을 위해 의도적으로 사용하는 메세지 (used by ping)  

 

각 메시지에 따른 ICMP 구조는 아래의 그림과 같다. Error reporting 메시지의 경우 총 5가지로 구성되어 있으나 현재는 사용하지 않아 항상 0으로 설정되어야 하는 Unused 필드가 포함되어 있다. Checksum은 ICMP 메시지의 무결성을 확인하기 위한 값이기에 궁극적으로 메시지가 전하고자 하는 바를 파악하기 위해서는 나머지 부분을 집중해서 보면 좋겠다. 에러를 발견한 라우터, 목적지 Host가 에러의 종류를 알리기 위해 Type과 Code를 명시하고 전달하지 못하게 된 데이터그램이 무엇인지 담아 IP packet에 캡슐화하여 출발지에 알리기 때문이다.

ICMP 메시지 구조 - Error reporting message

 

 

Query 메시지의 경우 총 6가지로 Type, Code, Checksum은 동일하나, 메시지를 구분하기 위한 식별자인 Identifier와 Identifier내에서 메시지 순서를 구분하기 위한 Sequence Number가 추가된다. Data는 Query 메시지에 담길 데이터가 포함된다.

ICMP 메시지 구조 - Query message

 

 

 

이제 메시지의 구조를 파악했으니 아래의 표로 각각의 Type이 어떤 문제와 연관이 있는지를 알아보자.

Type description
Error-reporting
message
3 Destination unreachable
4 Source quench
5 Redirections
9 or 10 Router Problem
11 Parameter problem
12 Time exceeded
Query
message
8 or 0 Echo request or reply
13 or 14 Timestamp request or reply

 

  • 3 : Destination에 관련된 문제를 나타낼 때 사용된다.
  • 4: Congestion이 발생하면 더 이상 메시지를 보내지 말라고 Source Host에게 리포트하기 위해 사용되기 위해 만들어졌지만, TCP에서 Congestion control이 되기 때문에 실제로 사용되지 않는다.
  • 8, 0 : 네트워크 간 통신이 가능한지 확인하기 위해서 사용된다.
  • 9, 10 : 라우팅 알고리즘이 경로를 계산하기 위해서는 네트워크의 Topology 정보, 상태 정보 등이 필요하기에 라우터끼리 네트워크 정보를 수집하기 위해 사용된다.
  • 11 : TTL 만료에 관한 내용이다.
  • 12 : Checksum은 IP 헤더의 오류 여부를 확인하는 필드이다. 어떤 라우터가 IP 데이터그램을 받았는데 Checksum을 확인해보니 오류가 있다면 이 타입을 명시하여 반환한다.

 

두 번째로 Code를 보면 Type을 설명하는 표와 비교했을 때 설명란이 더 자세한 것을 확인할 수 있다.

Type Code Description
0 0 Echo reply (ping)
3 0 Destination network unreachable
3 1 Destination host unreachable
3 2 Destination protocol unreachable
3 3 Destination port unreachable
3 6 Destination network unknown
3 7 Destination host unknown
4 0 Source quench
(Congestion control - Not used)
8 0 Echo request (ping)
9 0 Route advertisement
10 0 Router discovery
11 0 TTL expired
12 0 Bad IP header

 

위의 표 중 Destination과 관련된 Type과 Code를 예제로 짧막하게 작성해 보았다.

예시 1

Type Code
3 0

 

출발지 Host로부터 목적지 Host까지 IP 데이터그램이 전달되다가, 목적지 네트워크로 라우팅하려다 보니 목적지 네트워크가 어떤 이유로 전달할 수 없는 상태가 되었다. 이때 Type 3, Code 0 그리고 문제가 생긴 데이터그램의 정보를 담아 ICMP 메시지를 생성해 보낸다.

 

예시 2

Type Code
3 3

목적지 Host까지는 도착했는데 포트가 없는 경우에는 이때 Type 3, Code 3 그리고 문제가 생긴 데이터그램의 정보를 담아 ICMP 메시지를 생성해 보낸다. 

 

 

 

ICMP 활용

그래서 이렇게 생성된 ICMP 메시지들은 어떻게 활용되는 걸까? 

  • ping, traceroute 등 네트워크 관리를 위한 목적
  • ICMP Redirection
  • Path MTU(Maximum Transmission Unit) Discovery
  • Security Attack

 

 1️⃣ ping

ping 명령어로 ICMP Echo Request를 전송하고 Response 메시지를 받아 지정한 IP 주소와 통신할 수 있는지 확인할 수 있다. 초당 하나의 데이터그램이 전송되면 수신한 모든 응답에 대한 내용이 한 행씩 출력된다. 아래의 스크린샷은 google.co.kr에 ping 명령어를 사용한 것인데 Ping 통계를 통해 유실된 패킷의 수를 알 수 있고 왕복 시간 또한 확인할 수 있다. 

 

2️⃣ ICMP Redirection

특정 대상에 대한 라우팅이 이루어질 때 ICMP Redirection 기능을 통해 더 나은 경로를 확인할 수 있다. 아래의 그림을 통해 과정을 살펴보자. 

그림 상에서 R1과 R2는 동일한 이더넷 세그먼트에 연결되어 있고, Host H에서 Remote Branch Office Host로 패킷을 보내려 한다. Host H에서 Gateway(그림 상 Default GW)로 패킷을 보내는데 목적지로 전송되기 위해서는 결국 R2로 패킷이 전달되어야 하는 상황이다. R1은 패킷을 R2로 보내기 위해서는 수신 경로였던 인터페이스로 다시 내보내야 한다는 걸 알게 되는데 현재의 경로는 비효율적이기 때문에 목적지 Host에 데이터를 보낼 때 더 나은 경로로 전송될 수 있도록 Network 정보를 보내주기로 한다. 이때 Type 5로 메시지가 생성된다.

 

위의 ICMP 메시지를 받게 되면 Host H의 라우팅 테이블은 해당 경로에 대한 라우팅 정보를 업데이트할 수 있다. 예를 들면, "목적지 Host로 요청을 보내게 될 때는 171.16.1.200으로 보내라."라는 메시지를 전달 받게 되고 라우팅 테이블에 목적지 Host와 사용되어어야 할 네트워크 정보가 추가되는 것이다.

 

하지만 이 방식은 보안적으로 위험할수 있어서 기본적으로 ICMP Redirection 기능을 사용하지 않는다.

 

 

3️⃣ Path MTU(Maximum Transmission Unit) Discovery

데이터를 보낼 때 구간 별로 MTU 사이즈가 설정되어 있는데 이더넷의 경우 1500이며, 어떤 목적에 의해 MTU 사이즈가 작기도 한다. 만약 데이터의 크기가 사이즈보다 크다면 라우터는 데이터를 fragmentation(이하 분할)했다가 다시 조합해야 하는데 성능 혹은 보안 문제가 발생할 가능성이 있어 가급적이면 분할이 일어나지 않도록 조정해야 한다. 

 

 

조정하는 방법은 Flags에 DF(Don’t Fragment) bit를 1로 설정하는 것이다. 그러면 분할하지 않고 MTU 사이즈와 함께 Packet 사이즈를 줄이라는 ICMP 메시지를 보낸다. 하지만 이 방법 또한 보안 문제로 ICMP 메시지를 사용할 수 없을 때는 알 수 없게 된다. 그래서 Extended ping을 사용해서 패킷 사이즈를 최대로 조정하고 DF를 세팅한 후에 테스트해야 한다.

 

 

4️⃣ Security Attack

  • ping flooding : Ddos 형태로 많은 수의 요청을 시도해 응답 장치의 장애를 일으키거나, 가짜 트래픽으로 네트워크 연결을 과부하시키는 것이다. 결론적으로 정상적인 네트워크 활동이 중단된다.
    • 해결 방법 : 대상 라우터, 서버 장치의 ICMP 기능을 비활성화한다.
  • ICMP tunneling : ICMP Echo request 및 response 데이터에 악성 데이터를 숨겨 방화벽을 통과하게 한다. RFC 792에 따르면 ICMP 데이터그램에 크기 제한 없이 페이로드를 가질 수 있기 때문에 어떤 데이터가 담길지 알 수 없다.
    • 해결 방법 : ICMP 트래픽 차단, 고정 크기의 ICMP 패킷만 허용한다.
  • Redirection attack : 라우팅 테이블을 업데이트하게 하여 악용한다.
    • 해결 방법 : accept_redirects를 0으로 설정한다.

 

5️⃣ Traceroutes

ICMP 메시지를 이용해서 구현된 네트워크 애플리케이션 프로그램으로 패킷이 이동하는 단계 중에 소요되는 시간과 어느 구간에서 막힘이 있는지를 확인할 수 있다. 목적지 Host까지 가는데 거치게 되는 모든 라우터들의 리스트와 각 라우터까지의 속도를 세 차례 측정한 결과를 반환한다. 

 

그렇다면 어떤 과정을 통해 경로를 추적하는 걸까? 우선 출발지 Host에서 UDP 세그먼트를 전송할 때, TTL 값을 1부터 시작해 점점 증가시킨다. 그러면 이 세그먼트가 각 라우터를 지나면서 TTL이 하나씩 차감되고, 결국 TTL이 0이 될 때 해당 라우터에서 ICMP 메시지를 받아 라우터의 IP 주소를 파악할 수 있다. 예를 들어, 유효하지 않은 포트 번호로 목적지를 설정했다면 TTL이 충분히 커져 목적지 Host에 도달한 이후에 유효하지 않은 포트 번호로 인해 "Port Unreachable" ICMP 메시지를 수신하게 되며 경로 추적이 완료되는 것이다.

 

아래의 스크린샷을 보면 가운데 ms 단위로 패킷을 3번 보낸 결과를 반환하고 있다. 중간에 * 표시가 세 번 출력된 것은 어떤 이유로 라우터가 응답하지 않는 경우이다. 말그대로 통신이 안되는 구간일 수 있지만, 실제로 통신은 잘 되지만 ICMP 메시지를 차단한 경우일 수도 있다. 실제로 보안 문제로 인해 차단하는 경우가 많다고 한다.

Windows: tacert 명령어
Linux: traceroute 명령어

 

 

 

정리

  • ICMP는 호스트와 호스트, 호스트와 라우터, 라우터와 라우터 간의 네트워크 제어 정보를 교환하는 데 사용되는 관리용 프로토콜이다.
  • ICMP 메시지는 Type과 Code로 통신 상 어떤 문제가 발생했는지 혹은 통신이 정상적으로 이루어지는지 확인할 수 있다. 
  • ICMP와 관련하여 실무에서 많이 사용되는 명령어로 ping, traceroute 및 tracert가 있다.

 

참고

  • KOCW: 컴퓨터 네트워크 [이화여자대학교 | 이미정]
  • [운영관리]8. ICMP Protocol - 어디서 어떻게 운영되나.
  • ICMP Flooding DDos Attack
  • What is ICMP Tunneling and How to Protext Against it
  • RFC 792: Internet Control Message Protocol
저작자표시 (새창열림)

'Computer Science > Network' 카테고리의 다른 글

[Network] 네트워크 확인을 위한 명령어(1) - ping  (1) 2024.08.22
[Network] 쿠키  (1) 2023.02.18
'Computer Science/Network' 카테고리의 다른 글
  • [Network] 네트워크 확인을 위한 명령어(1) - ping
  • [Network] 쿠키
soro.k
soro.k
  • soro.k
    일일소록
    soro.k
  • 전체
    오늘
    어제
    • 분류 전체보기 (181)
      • Java (14)
      • Spring (24)
      • JavaScript (5)
      • DB (32)
      • Web (6)
      • Computer Science (47)
        • Operating System (9)
        • Network (3)
        • Data Structure (6)
        • Algorithm (28)
      • Git (1)
      • 노트 (4)
        • F-lab (20)
        • 회고 (14)
        • Review (12)
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
soro.k
[Network] ICMP
상단으로

티스토리툴바