UDP에 대하여

김용현·2024년 7월 8일

CS

목록 보기
5/12

UDP란?

User Datagram Protocol의 약자로 주로 음성 통신이나 DNS 등, 즉시성을 요구하는 애플리케이션에 사용된다.

커넥션리스 타입 프로토콜로 100% 전송을 보장하지 않아, 신뢰성은 다소 떨어질 수 있지만, 통신 속도 측면에서 강점을 가질 수 있는 프로토콜이다.

패킷 포맷

UDP의 패킷 포맷은 상당히 간단하다.
RFC768로 표준화된 프로토콜로 IP 헤더의 프로토콜 번호는 17로 정의되어 있다.
구성하는 헤더 필드는 4개 뿐이며, 헤더의 길이도 8바이트이다. 하나씩 알아보자.

송신지/수신지 포트 번호

포트 번호는 애플리케이션 식별에 사용되는 2바이트 값이다. 클라이언트에서 커넥션을 만들 때 OS에서 정해진 범위 내 무작위 할당 값을 송신지 포트 번호로, 애플리케이션 별 정의된 값을 수신지 포트 번호로 설정하여 서버에 보낸다.

UDP 데이터그램 길이

데이터그램 길이는 UDP 헤더와 UDP 페이로드를 합친 데이터 그램 전체 길이를 나타내는 2바이트 필드이다.

체크섬

받아들인 UDP 데이터그램의 손상 여부 정합성 체크에 사용되는 2바이트 필드이다. 검증 방식은 IP 헤더 체크섬과 마찬가지로 1의 보수 연산을 사용한다.

포트 번호

트랜스포트 계층에서 가장 중요한 필드는 송신지 포트 번호 수신지 포트 번호 이다. IP헤더만 있으면 전 세계 어떤 수신지에도 IP 패킷을 도달시킬 수 있다. 그러나 도착하여 어떤 애플리케이션에 패킷을 전달해야할 지 정해야 하고, 이를 정하는 것이 포트 번호이다.

포트 번호 분류

포트 번호는 2바이트 숫자이며 0~ 65535번까지 있다.

  • System Port(well-known ports) -> 0 ~ 1023
  • User Port -> 1024 ~ 49151
  • Dynamic and/or Private Port -> 49152 ~ 53325

다음과 같이 3가지로 나뉘게 된다.

System Ports와 User Ports는 주로 서버 애플리케이션을 식별하는 포트로, 수신지 포트 번호에 사용된다.
Dynamic and/or Private Ports는 주로 클라이언트 애플리케이션을 식별하는 포트 번호로 송신지 포트 번호에 사용된다.

System port
일반적으로 잘 알려진 포트 번호들이다. 일반적인 서버 애플리케이션에 묶여 있으며,
대표적으로

  • TCP 80 번 -> http 포트 번호,
  • TCP 443 -> https 포트 번호, UDP 443 -> HTTPS(QUIC)
  • TCP 22 -> ssh 포트 번호
  • TCP 20 -> FTP

등등 보통 쓰이는 포트 번호들을 말한다.

User Port
제조사가 개발한 독자 서버 애플리케이션에 묶여 있다. 예를 들어,

  • TCP 3306 -> MySql 디비 포트 번호
  • TCP 8080 -> Apache Tomcat 포트 번호
  • TCP 1433 -> 마이크로소프트 SQL 서버 포트 번호

등이 있다.

Dynamic and/or Private Ports
위 두 포트 번호 범위들은 IANA에 의해 관리된다. 그러나 이 포트 번호 범위는 따로 관리되지 않으며, 클라이언트 애플리케이션이 커넥션을 만들 때 송신지 포트 번호로 무작위로 할당한다.

UDP 동작 과정

그림을 보면 알 수 있듯이 굉장히 간단하다. TCP처럼 커넥션을 맺지도 않고, 흐름제어도 하지 않고, 오류 체크도 거의 안 하고, 제대로 전송이 됐는지도 확인하지 않는다.

따라서 발생하는 오버헤드가 굉장히 적어 속도가 빠르다.

방화벽 동작(UDP)

트랜스 포트 계층에서 동작하는 기기로 방화벽이 있다. 하는 역할을 간단 설명하면 미리 설정한 규칙에 따라 '이 통신은 허가, 이 통신은 거부' 등과 같이 인허가된 통신만 받아들이는 방어벽 역할을 한다.

이러한 방화벽이 가진 통신 제어 기능을 스테이트풀 인스펙션(Sateful inspection) 이라 부른다. 스테이트풀 인스펙션을 통해 필터링 규칙, 커넥션 규칙 등을 설정할 수 있다.

필터링 규칙

허가할 통신과 거부할 통신의 형태를 정의하는 것을 뜻한다. 정책, ACL(Access Control List) 등 기기 벤더에 따라 다양하게 부르지만, 기본적으로 모두 같은 역할을 한다고 보면 된다.

필터링 규칙은 송신지 IP주소, 수신지 IP 주소, 프로토콜, 송신지 포트 번호, 수신지 포트 번호, 통신 제어 등의 설정 항목으로 이루어져 있다.

커넥션 테이블

스테이트풀 인스펙션은 앞에서 설명한 필터링 규칙을 커넥션 정보를 기반으로 동적으로 바꾸어 씀으로써 보안 강도를 높인다. 또한 방화벽은 자신을 경유하는 커넥션 정보를 커넥션 테이블이라 부르는 메모리 상의 테이블로 관리한다.

스테이트풀 인스펙션의 동작 과정

방화벽이 동작하는 방식 중 하나로, 이전 상태를 기억하고 추적하여 방화벽 기능을 동작시키는 유형이다. 처음 들어오는 패킷의 경우 보안 정책을 통과하면 세션 리스트에 해당 패킷의 세션 정보를 저장하고 추후에 세션 리스트를 통해 보안 정책이 없어도 동일한 패킷의 경우 들어오고 나갈 수 있다.

동작 과정

  1. 방화벽은 클라이언트 측에 있는 Outside 인터페이스에서 UDP 데이터 그램을 받아들여 필터링 규칙과 조합한다.

  2. 액션이 '허가'인 엔트리의 경우 커넥션 테이블에 커넥션 엔트리를 추가한다. 또한, 그와 동시에 그 커넥션 엔트리에 대응하는 반환 통신을 허가하는 필터링 규칙(송신지와, 수신지만 바꾼 것)을 동작에 추가한다.

    액션이 '거부'라면 커넥션 테이블에 추가하지 않고, 클라이언트에 Destination Unreachable ICMP 패킷을 보낸다.

    액션이 drop인 경우 커넥션 테이블에 엔트리를 추가하고 아무것도 하지 않는다. 단순히 데이터그램을 파괴한다.

  3. 액션 허가 이후 서버로부터 반환 통신이 발생한다. 다시 나갈 때도 방화벽을 통해 나가므로 기존에 추가해둔 필터링 엔트리(2에서 만듦)를 사용해 허가 제어를 실행하고 클라이언트에 전송된다. 이 때 커넥션 엔트리의 아이들 타임을 0초로 초기화한다.

  4. 방화벽은 통신이 끝나면 커넥션 엔트리의 아이들 타임을 증가시킨다. 아이들 타임 아웃이 경과하면 커넥션 엔트리와 연관된 필터링 엔트리를 삭제한다.

profile
평생 여행 다니는게 꿈 💭 👊 😁 🏋️‍♀️ 🦦 🔥

0개의 댓글