Fragmentation과 Segmentation의 차이

Munang·2022년 2월 13일
4

Network

목록 보기
2/3

네트워크 보안을 공부하다가 Fragmentation Flooding이라는 개념을 알았다. 이 개념은 임의로 많은 데이터를 추가해 하나의 패킷이 여러개로 분할되어 전송됨으로써 목적지가 되는 Target서버의 대역폭을 고갈시키는 DDos공격 중의 하나이다.

이러한 공격의 대응 방안은 내부 네트워크에서는 Fragmentation된 패킷이 없기 때문에 아예 Fragmentation된 데이터를 차단하는 방안을 제시한다. 그러면서 Segmentation의 개념을 동시에 설명하는데, 데이터는 Segmentation되기 때문에 Fragmentation된 데이터가 없다고 한다.

나는 일단 두 가지 분할 방식의 차이점을 정확하게 모르기 때문에 왜 이러한 결론이 나오게 되는지 이해하지 못했다. 또한 대부분의 블로그에도 정확한 내용이 기재되어있지 않았다.

따라서 오늘 포스팅에서는 2가지 방식의 차이점을 완벽하게 이해한다.

1. Fragmentation

일단 Fragmentation이 어디서 일어나는지 알아야 한다. Fragmentation은 3계층에서 일어난다. 이 문장을 보고 의아했다면, 계층 구조에 대해서 파악해야 한다. 단순히 패킷이 쪼개진다 혹은 조각화 된다 라고만 알고있다면, 당신은 이 게시글 대부분의 내용을 이해하기는 어려울 것이다.

(1) Fragmentation 과정

Fragmentation이 일어나는 과정은 다음과 같다.

1. 송신 과정

  • 송신자는 수신자에게 4000크기의 IP데이터가 포함된 패킷을 전송한다.
  • 만약, 여기서 게이트웨이의 MTU값이 4000 보다 작다면 게이트웨이는 송신자에게 ICMP패킷을 이용해 Fragmentation이 필요하다는 ICMP 패킷을 송신하게 된다.
  • 그렇게 되면 송신자는 수신자의 MTU값에 맞춰서 데이터를 Fragment하게 되고, IP데이터 그램 기준으로 1500씩 잘려진 데이터에 헤더를 추가하여 각각 다른 데이터로 보내준다.
  • 만약 입력 패킷의 크기가 4000byte 이고 이 패킷이 나가려는 링크의 MTU는 최대 1500byte 이다.
  • 4000byte의 패킷을 쪼개야 한다. 여기서 주의해야 하는게 단순히 1500byte씩 쪼개기만 하는게 아니라 쪼개는 패킷도 IP데이터그램 포맷에 맞춰야 한다.
  • 따라서, 헤더크기인 20byte 를 고려해야 한다. 우선 4000byte의 입력패킷은 20byte의 헤더와 3980byte의 페이로드로 이루어져 있다.
  • 결론적으로 페이로드인 3980byte를 1480byte씩 쪼개고 각 조각마다 20byte의 헤더를 붙여 보내게 된다.


그림 출처

2. 의문점

  • 교재의 대부분에는 PMTUD라는 메커니즘이 있다. 즉, 장비들간의 MTU값을 미리 파악해 MTU값을 초과하지 않는 방법으로 전송하게끔 하여 단편화를 피할 수 있도록 하는 것이다.
  • 그렇다면 애초에 미리 다 파악하면 되는게 아닐까 했는데, 그렇게 하지 않는 이유는 다음과 같다고 추론한다.
    • 처음부터 모든 장비의 MTU값을 파악하기 위해 보내는 트래픽의 부하
    • MTU값이 대부분 1500으로 고정되어 있다.
    • 혹시나 이 값을 초과하는 MTU에 대해서만 ICMP과정을 통해 확인하면 된다.
    • MTU값을 너무 크게 설정하면, 대역폭 고갈 등의 보안적인 위험이 있기 때문에 대부분이 MTU값이 작은 문제에서 Fragmentation 과정이 일어난다.

(2) Fagmentation이 일어나는 장비, 계층, 프로토콜

Fragmentation은 데이터 통신 과정에서 언제 일어날까? 이 해답을 정리하는 데에는 이 페이지의 글이 많은 도움이 되었다.

1. 장비 관점

  • 장비 관점에서 Fragmentation은 대부분 게이트웨이 즉, 라우터에서 일어난다.
  • 출발 라우터에서 도착 라우터로 메세지를 라우팅 할때 데이터그램은 최대 패킷 크기가 데이터그램 크기보다 작은 네트워크를 통과해야 하고, 그렇기 때문에 이 과정에서 IP프로토콜이 Fragmentation이라는 기능을 제공한다.
  • Encapsulation된 패킷이 수신자의 게이트 웨이를 통과할때 IP 헤더값의 데이터그램 크기를 확인 및 MTU값을 검증하는 과정에서 일어나고, 이때 해당 장비에서 ICMP패킷을 보내 MTU값에 데이터그램 크기를 맞춘 후 재전송 한다.
  • 또한 단편화는 라우터에서 일어나지만, 재조립은 도착지 호스트에서 일어나게 된다.

2. TCP/IP 계층 관점
내가 처음에 잘못 알았던 부분이다. Fragmentation은 IP프로토콜에서 발생한다. 많은 문서가 트랜스포트 계층에서 단편화가 발생한다고 알고있으나, 트랜스포트 계층은 단편화 기능을 제공하지않는다. IP계층에서 단편화가 일어난다는 것을 알고있어야 한다.

3. 프로토콜 관점 - TCP
TCP 통신에서는 Fragmentation 기법을 사용하지 않는다. 하지만 Fragmentation이 일어날 수도 있다.

  • TCP 통신에서는 일반적으로 Fragmentation 보다는 Segmentation이 일어난다. Fragmentation은 라우터와 같은 중간 장비의 한계 때문에 피할 수 없다.

  • 하지만, 피할 수 없는 Fragmentation이 갖는 치명적인 단점이 있다.

    1) 신뢰성 기반의 통신 방식이기 때문에 통신 과정에서 단편화된 패킷 중 하나가 유실되었을 때 중간에 어느 단편화된 패킷이 유실되었는지의 확인이 어렵다.
    2) 또한, 유실된 패킷을 포함해 재전송하는 데에 많은 리소스와 시간이 소요된다.

  • 그래서 TCP 통신은 Fragmentation이 발생하지 않게하기 위해 Segmentation 기능을 도입했다.

  • MTU를 초과하지 않는 크기로 세그먼트를 미리 분할 후 전송하게 되는데, 이를 세그멘테이션이라고 한다. (세그멘테이션에 관련한 개념은 하단에서 자세히 설명하겠다.)

  • 따라서, TCP를 이용한 통신에서는 일반적으로 단편화가 발생하지 않는다. 하지만, 공격자가 임의로 TCP의 크기를 크게 만들어 보낸다면 단편화가 발생하게 되고 이는 일반적인 패턴이 아님으로 차단해도 무방하다. 그리고, 이러한 케이스에서 예외적으로 단편화가 발생하는 것이다.

4. 프로토콜 관점 - TCP 이외
TCP를 제외한 나머지 프로토콜에서는 패킷이 MTU 이상의 크기로 전송될 때 단편화가 발생한다. 공격자는 주로 대역폭 공격을 발생할 때 의도적으로 큰 패킷을 생성하기 위해 위조가 용이한 UDP, ICMP를 MTU이상의 큰 크기로 전송한다.

2. Segmentation

앞선 1장에서 언급된 내용과 같이 세그멘테이션은 TCP에서 발생할 수 있는 단편화를 회피하고자 MTU를 초과하지 않는 크기로 세그먼트를 분할하는 방법이다.

(1) Segmentation 과정

세그멘테이션 과정을 이해하기 위해서는 2가지 개념이 필요한데, MSS와 PMTUD이다. 이 2가지의 개념을 설명하면서 세그멘테이션의 과정을 순서대로 설명하겠다.

1. MSS
클라이언트와 서버간에 TCP 통신 시 최대로 전송할 수 있는 TCP 세그먼트의 크기를 의미한다. 3웨이 핸드쉐이크 과정에서 SYN, SYN-ACK 패킷의 option헤더에 이 값을 명시하게 된다. 일반적으로 크기는 전송되는 데이터의 크기 임으로 MTU에서 헤더크기인 40바이트를 뺀 값이다.

대부분의 네트워크는 이더넷 환경임으로 MTU값이 1500 이고, IP헤더와 TCP 헤더를 제외하게 되면 MSS값도 1460이다.

2. TCP통신 시 미리 MSS를 정하는 과정

  • 클라이언트는 자신의 MSS과 라우터의 MTU값을 비교하고, 그 중 낮은 값으로 MSS를 설정하여 SYN을 전송한다.
  • 서버는 클라이언트로부터 수신한 MSS를 자신의 아웃바운드 인터페이스의 MTU사이즈-40바이트와 크기를 비교한다.
  • 자신의 아웃바운드 인터페이스의 MTU사이즈와 수신된 MSS값을 비교 후 작은 값으로 설정하여 SYN-ACK을 전송한다.
  • 클라이언트는 서버로부터 수신한 MSS와 자신의 아웃바운드 인터페이스의 MTU사이즈를 비교한다.
  • 클라이언트는 상호 간의 MSS를 비교 후 작은 값으로 설정한다.

3. PMTUD(Path MTU Discovery)
이미 MSS를 정하는 과정을 통해서 MTU를 초과하지 않는 값으로 전송했으나, 패킷이 전송되는 경로에서 자신보다 작은 MTU값을 사용하는 라우터가 존재하면, 이때 단편화가 발생할 수 있어 이 과정을 피하려고 PMTUD를 사용한다.

이는 라우팅 경로상의 MTU를 의미하고, 네트어크 장비들이 상호 간의 MTU를 미리 파악하여 MTU를 초과하지 않는 크기로 데이터를 전송하게 해 단편화를 피하도록 하는 기능이다. 대부분의 라우터 및 단말기기에는 이 기능이 활성화 되어있다.

위와 같이 출발지 장비가 패킷을 알맞게 분해하기 위해서는 PMTUD 과정을 반드시 거쳐야 합니다.

4. PMTUD(Path MTU Discovery) 과정

1) 호스트가 먼저 패킷을 전송하게 된다.
2) 작은 MTU값인 장비를 만나게 되면, 장비는 ICMP패킷을 이용해 수정을 요청하는 MTU값과 함께 다시 최초 전송자에게 요청한다.
3) 최초 전송자는 수정 요청된 MTU값에 맞게 데이터 크기를 조정하고 재전송하여 초과하지 않도록 한다.
4) 만약 라우팅 경로가 바뀐다면, 작은 패킷을 전송하는 것은 낭비가 됨으로 PMTU의 값을 주기적으로 1씩 증가시켜 전송하고 증가한 값이 또 다시 초과하게 되면 그때 1~3의 과정을 반복한다.

하지만, 이러한 경로 변경은 흔하지 않고 이러한 방식으로 PMTUD의 과정이 일어난다는걸 인지하고 있으면 된다.

(2) Segmentation 이 일어나는 장비, 계층, 프로토콜

Segmentation은 데이터 통신 과정에서 언제 일어날까?

1. 장비 관점

  • 장비 관점에서 Segmentation은 라우터, 원천지 호스트 둘 다에서 일어난다. 앞서 확인했던 MSS, PMTUD과정에서 호스트, 장비간의 Segment를 조정하는 과정을 확인했고 이러한 과정 자체가 세그멘테이션이기 때문에 두 장비에서 모두 일어난다.
  • 재조립은 동일하게 대상 호스트에서 재조립된다.

2. TCP/IP 계층 관점
Segmentation은 4계층인 전송계층에서 일어난다.

3. 프로토콜 관점 - TCP
TCP 통신에서만 Segmentation이 일어난다. 이는 단편화로 인한 부하와 패킷 유실에 대한 손실이 매우 크기 때문에 TCP에서만 도입한 방식이다.

2개의 댓글

comment-user-thumbnail
2024년 5월 26일

큰 도움이 됐습니다. 감사합니다

1개의 답글