네트워크 보안을 공부하다가 Fragmentation Flooding이라는 개념을 알았다. 이 개념은 임의로 많은 데이터를 추가해 하나의 패킷이 여러개로 분할되어 전송됨으로써 목적지가 되는 Target서버의 대역폭을 고갈시키는 DDos공격 중의 하나이다.
이러한 공격의 대응 방안은 내부 네트워크에서는 Fragmentation된 패킷이 없기 때문에 아예 Fragmentation된 데이터를 차단하는 방안을 제시한다. 그러면서 Segmentation의 개념을 동시에 설명하는데, 데이터는 Segmentation되기 때문에 Fragmentation된 데이터가 없다고 한다.
나는 일단 두 가지 분할 방식의 차이점을 정확하게 모르기 때문에 왜 이러한 결론이 나오게 되는지 이해하지 못했다. 또한 대부분의 블로그에도 정확한 내용이 기재되어있지 않았다.
따라서 오늘 포스팅에서는 2가지 방식의 차이점을 완벽하게 이해한다.
일단 Fragmentation이 어디서 일어나는지 알아야 한다. Fragmentation은 3계층에서 일어난다. 이 문장을 보고 의아했다면, 계층 구조에 대해서 파악해야 한다. 단순히 패킷이 쪼개진다 혹은 조각화 된다 라고만 알고있다면, 당신은 이 게시글 대부분의 내용을 이해하기는 어려울 것이다.
Fragmentation이 일어나는 과정은 다음과 같다.
1. 송신 과정
2. 의문점
Fragmentation은 데이터 통신 과정에서 언제 일어날까? 이 해답을 정리하는 데에는 이 페이지의 글이 많은 도움이 되었다.
1. 장비 관점
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이상의 큰 크기로 전송한다.
앞선 1장에서 언급된 내용과 같이 세그멘테이션은 TCP에서 발생할 수 있는 단편화를 회피하고자 MTU를 초과하지 않는 크기로 세그먼트를 분할하는 방법이다.
세그멘테이션 과정을 이해하기 위해서는 2가지 개념이 필요한데, MSS와 PMTUD이다. 이 2가지의 개념을 설명하면서 세그멘테이션의 과정을 순서대로 설명하겠다.
1. MSS
클라이언트와 서버간에 TCP 통신 시 최대로 전송할 수 있는 TCP 세그먼트의 크기를 의미한다. 3웨이 핸드쉐이크 과정에서 SYN, SYN-ACK 패킷의 option헤더에 이 값을 명시하게 된다. 일반적으로 크기는 전송되는 데이터의 크기 임으로 MTU에서 헤더크기인 40바이트를 뺀 값이다.
대부분의 네트워크는 이더넷 환경임으로 MTU값이 1500 이고, IP헤더와 TCP 헤더를 제외하게 되면 MSS값도 1460이다.
2. TCP통신 시 미리 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의 과정이 일어난다는걸 인지하고 있으면 된다.
Segmentation은 데이터 통신 과정에서 언제 일어날까?
1. 장비 관점
2. TCP/IP 계층 관점
Segmentation은 4계층인 전송계층에서 일어난다.
3. 프로토콜 관점 - TCP
TCP 통신에서만 Segmentation이 일어난다. 이는 단편화로 인한 부하와 패킷 유실에 대한 손실이 매우 크기 때문에 TCP에서만 도입한 방식이다.
큰 도움이 됐습니다. 감사합니다