[Network] 로드밸런서/방화벽 알아보기

영근·2024년 11월 15일
0

Network

목록 보기
9/9
post-thumbnail

<IT엔지니어를 위한 네트워크 입문> 책을 함께 읽는 스터디를 진행하며 올리는 포스팅입니다.
스터디 repository

Intro

지난 포스팅에서 3계층 장비인 라우터에 대해 알아보았습니다.
기존 '네트워크 장비'는 스위치, 라우터 등 2계층이나 3계층에서 동작하는 장비를 지칭하는 말이었습니다.
하지만 IP 부족으로 NAT 기술이 등장하면서 4계층 이상에서 동작하는 네트워크 장비가 등장하기 시작했습니다.

4계층 장비는 2, 3계층에서 고려하지 않았던 통신의 방향성, 순서 등 통신 전반에 대한 관리가 필요합니다.
그러한 정보를 세션 테이블에 담아 관리하며, 그 안에서 관리하는 세션 정보를 기반으로 동작합니다.

이번 포스팅에서는 4계층 네트워크 장비인 로드밸런서와 방화벽에 대해 알아보겠습니다.


로드 밸런서

로드밸런서란, 서버나 장비의 부하를 분산하기 위해 사용하는 장비를 말합니다.

로드밸런서가 서비스에 사용되는 대표 IP 주소를 서비스 IP로 갖고, 그 밑의 시스템들의 실제 IP로 변경해서 요청을 보내는 형태로 동작합니다.

로드밸런서는 동작하는 계층에 따라 L4, L7로 나눌 수 있습니다.

  • L4 로드 밸런싱
    • TCP, UDP 정보(특히 포트 넘버)를 기반으로 로드 밸런싱을 수행합니다.
    • L7 지원 여부와 상관없이 4계층에 대한 정보로만 분산 처리 하는 경우를 L4 로드 밸런싱이라 합니다.
  • L7 로드 밸런싱
    • HTTP, FTP 등 애플리케이션 프로토콜 정보를 기반으로 로드 밸런싱을 수행합니다.
    • HTTP 헤더나 URI 등 정보를 기반으로 프로토콜을 이해한 후, 부하를 분산하는 프록시 역할을 수행합니다.
    • 이러한 장비를 ADC(Application Delivery Controller)라고 부릅니다.

L4 스위치

L4 스위치는 4계층에서 동작하면서 로드 밸런서 기능이 있는 스위치로, 부하 분산, 성능 최적화, 리다이렉션 기능을 제공합니다.

동작을 위해서는 가상 서버, 가상 IP, 리얼 서버, 리얼 IP를 설정해야 합니다.

  • 가상 서버 : 사용자가 바라보는 실제 서비스
  • 가상 IP : 사용자가 접근해야 하는 서비스 IP 주소
  • 리얼 서버 : 실제 서비스를 수행하는 서버
  • 리얼 IP : 실제 서버의 IP

L4 스위치는 가상 IP를 리얼 IP로 변경해주는 역할을 합니다. 이 과정에서 부하를 어떤 방식으로 분산할 지 결정합니다.

추가적으로 TCP, UDP 정보를 기반으로 부하를 분산하거나, TCP 레벨의 간단한 DoS 공격 방어, TCP 세션 재사용으로 서버 부하를 감소시키는 등의 기능을 수행할 수 있습니다.

ADC

ADC는 애플리케이션 계층에서 동작하는 로드 밸런서입니다. L4 스위치와 달리 애플리케이션 프로토콜의 헤더와 내용을 이해하고 동작하는데, 프록시의 형태로 동작합니다.

대부분의 ADC는 4계층에서 애플리케이션 계층까지 로드 밸런싱 기능을 제공하고, 페일 오버(장애극복 기능), 리다이렉션 기능도 함께 수행합니다.

그 외에도 성능 최적화를 위한 이미지나 정적 콘텐츠 캐싱, 콘텐츠 압축(Compression), 콘텐츠 변환 및 재작성, 인코딩 변환, 애플리케이션 프로토콜 최적화 기능도 제공합니다.

보안 강화 기능을 추가로 제공해 WAF(Web Applicaion Firewall) 기능이나 HTML, XML 검증과 변환을 수행할 수 있습니다.

또한 SSL 프로토콜 사용으로 인한 SSL 암복호화 부하를 줄이기 위해, ADC는 SSL의 엔드 포인트로 동작하기도 합니다.

클라이언트에서 ADC까지의 구간을 SSL로 처리하고, ADC와 웹 서버 사이를 일반 HTTP를 이용해 통신합니다. 이런 기능을 사용할 때는 대부분 ADC에 전용 SSL 가속 카드를 내장합니다.


방화벽

네트워크 중간에서 통과하는 트래픽을 사전에 주어진 정책 조건에 맞추어 허용하거나 차단하는 장비를 방화벽이라 합니다.

방화벽은 세션 정보를 장비 내부에 저장하는데, 패킷이 외부로 나갈 때 세션 정보를 저장합니다. 그리고 패킷이 들어오거나 나갈 때 저장했던 세션 정보를 참조해 들어오는 패킷이 외부에서 시작되었는지, 내부 사용자가 외부로 요청한 응답인지 가려냅니다.


세션 관리

4계층 세션 장비는 세션 테이블 정보를 이용해 패킷을 포워드하거나 드롭합니다.

이를 위해서는 애플리케이션과 세션 장비 간 세션 정보를 동일하게 유지해야 하며, 애플리케이션의 세션 시간과 서비스 방향성을 고려하고, 비대칭 경로를 피해야 합니다.

세션 정보 동기화

통신을 시작하면 세션 장비는 해당 세션 상태를 테이블에 기록합니다.
세션 테이블은 메모리에 저장되므로 일정 시간만 세션 정보를 저장하여 메모리 사용률을 적절히 유지합니다.

이 때, 세션 장비의 세션 타임아웃값이 애플리케이션의 세션 타임아웃값보다 짧으면 문제가 발생합니다.
세션 장비의 세션 테이블에 세션 정보가 없는 상황에서 SYN이 아닌 ACK로 표시된 패킷이 들어오면, 비정상 통신으로 판단해 패킷을 차단하기 때문입니다.

해결 방법은 아래와 같습니다.

  • 세션 만료 시간 증가
  • 방화벽 설정 변경 : 세션 테이블에 정보가 없는 ACK 패킷이 들어오면 세션을 새로 만들어 통과시키는 옵션
  • 세션 장비에서 세션 타임이웃 시 양 단말에 세션 종료 통보
    • 세션 타임아웃 시 약 종단 장비에 세션 정보 만료(RST)를 통보합니다.(TCP의 RST 플래그를 1로 세팅)
    • 양 종단 장비에서는 해당 세션을 끊습니다.
  • 애플리케이션에서 상태 체크(Health Check) 패킷을 주기적으로 발생시키기

비대칭 경로 문제

인바운드 패킷과 아웃바운드 패킷이 다른 장비를 통과하는 것을 비대칭 경로라고 부릅니다.

네트워크 경로 이중화를 위해 세션 장비를 두 대 이상 설치한 경우, 비대칭 경로인 경우 정상적인 서비스가 되지 않고 패킷이 드롭됩니다.

해결 방법은 아래와 같습니다.

1. 세션 테이블 동기화하기

세션 테이블을 동기화하면 두 장비가 하나의 장비처럼 동작하므로 비대칭 경로에서도 정상적으로 동작합니다.
패킷 경로를 변경하지 않고 동작한다는 장점이 있으나, 세션 동기화 시간보다 패킷 응답이 빠르면 정상적으로 동작하지 않을 수 있습니다.

2. 세션 장비에서 보정하기

인바운드 패킷이 통과하지 않았는데 아웃바운드 패킷이 장비로 들어온 경우, 인바운드 패킷이 통과한 다른 세션 장비 쪽으로 패킷을 보내 경로를 보정합니다.

이를 위해서는 다른 방화벽으로 패킷을 보내기 위한 방화벽 간 통신 링크가 필요합니다. 또한 MAC 주소를 변경하는 MAC 리라이팅이나 기존 패킷에 MAC 주소를 한 번 더 인캡슐레이션하는 터널링(Tunneling) 기법으로 보정합니다.

하나의 통신에 두 개 이상의 세션이 사용될 때

서로 다른 세션이 하나의 통신을 위해 사용되는 것을 세션 장비도 파악해야 하는 상황이 있는데, 대표적으로 FTP(File Transfer Protocol)의 경우가 있습니다.

프로토콜은 아래의 두 가지로 구분할 수 있습니다.

  • 데이터 프로토콜 : 데이터를 실어 나름
  • 컨트롤 프로토콜 : 데이터가 잘 전송되도록 세션 제어

FTP는 컨트롤 프로토콜과 데이터 프로토콜이 완전이 분리되어 있고, 통신 방법이 다른 두 가지 모드를 가지고 있습니다.

Active 모드

명령어를 전달하는 컨트롤 프로토콜과 데이터 프로토콜이 분리되어 있고, 방향이 반대입니다.

  • 클라이언트 -> 서버 : 클라이언트가 6121 포트 사용하겠다고 서버에 알림
  • 서버 -> 클라이언트 : 서버가 응답
  • 서버 -> 클라이언트 : 서버가 6121 포트로 데이터를 보냄
  • 클라이언트 -> 서버 : 클라이언트가 응답 후 데이터 수신

이 때 중간에 방화벽이나 세션 장비가 있으면 방화벽의 반대 방향도 열어주어야 합니다.
특히 NAT 환경에서는 FTP 프로토콜을 이해할 수 있는 별도 기능을 동작시켜야 하는데, 이 기능을 ALG(Application Layer Gateway)라 합니다.

이렇게 컨트롤 프로토콜과 데이터 프로토콜의 방향이 반대라는 단점을 보완하기 위해 Passive 모드가 등장했습니다.

Passive 모드

  • 클라이언트 -> 서버 : 클라이언트가 서버에 Passive 모드를 사용하겠다고 알립니다.
  • 서버 -> 클라이언트 : 서버는 클라이언트에 1025 포트를 사용하겠다고 알립니다.
  • 클라이언트 -> 서버 : 서버가 알려준 1025 포트에 데이터를 요청합니다.
  • 서버 -> 클라이언트 : 서버가 클라이언트로 데이터를 전송합니다.

Passive 모드에서는 클라이언트 쪽에 세션 장비가 있을 경우에도 특별한 작업 없이 동작한다는 장점이 있습니다.
하지만 서버 쪽에 방화벽이 있으면 데이터 다운로드를 위한 추가 포트를 열어주어야 합니다.


이미지 및 레퍼런스

profile
Undefined JS developer

0개의 댓글