세션 장비는 일반적인 2,3계층 네트워크 장비와 달리 세션을 이해하고 세션 테이블을 유지한다.
- 세션 테이블 정보를 이용해 패킷을 변경
- 애플리케이션 성능을 최적화하고 보안을 강화하기 위해 패킷을 포워드(Forward)하거나 드롭(Drop)
이런 기능을 충분히 활용하기 위해선 다음과 같은 사항들을 고려해야 한다.
- 애플리케이션과 세션 장비 간 세션 정보를 동일하게 유지
- 애플리케이션의 세션 시간과 서비스 방향성을 고려하고 비대칭 경로를 피해야 함
네트워크에서 세션 장비가 중간에 있을 때 생기는 대부분의 문제는 이런 부분을 고려하지 않아서 발생하는데, 이는 세션 장비에서 설정을 변경하거나 애플리케이션 로직을 변경해 해결할 수 있다.
이러한 고려사항들에 대해 자세히 알아보자.
1. 세션 테이블 유지, 세션 정보 동기화
종단 장비에서 통신 시작 → 중간 세션 장비가 해당 세션 상태를 테이블에 기록 → 통신이 없더라도 종단 장비 간 통신이 정상적으로 종료되지 않았다면 일정 시간 동안 세션 테이블을 유지
다음과 같은 여러 이유로 세션 장비는 무제한으로 세션 정보를 저장할 수 없고, 애플리케이션 특성에 맞는 적절한 세션 타임아웃 값을 유지한다.
- 세션 테이블이 메모리에 저장됨에 따라 일정 시간만 세션 정보를 저장해 메모리 사용률 적절히 유지
- 여러가지 애플리케이션 통신을 관리 → 일반적인 애플리케이션에 맞추어 적당한 세션 타임아웃값 유지
- 세션 공격*으로부터 시스템을 보호하기 위해 타임아웃값을 줄이기도 함
* 악의적인 공격자가 과도한 세션을 발생시켜 정상적인 세션 테이블 생성을 방해
일부 애플리케이션은 세션이 끊기지 않도록 타임아웃값을 길게 설정하기도 하는데 세션 장비의 타임아웃 값이 애플리케이션의 타임아웃 값보다 짧아지면서 통신에 문제가 발생한다.
- 중간 세션 장비의 세션 유지 시간이 지나 세션 테이블에 있는 세선 정보가 사라짐
- 양쪽 단말에서는 세션이 유지됨
- 다시 통신이 시작되어 데이터를 보낼 때 중간 세션 장비에서 막히는 문제 발생
그런데 위와 같은 상황 때문에 SYN이 아닌 ACK로 표시된 패킷이 들어오면 세션 장비에서는 비정상 통신으로 판단해 패킷을 차단한다. 만약 이런 패킷을 통과시키는 옵션을 설정해 강제로 통과시키더라도, 반대 방향으로 데이티가 들어오면 정책에 막힐 수 있다. 참고: 3 Way-Handshake
자세한 동작 순서를 그림과 함께 보면 다음과 같다.
- 3 Way-Handshake를 통해 정상적으로 세선 설정
- ① 방화벽에서 세선 설정 과정을 확인하고 세션 테이블 기록
- ②, ③ 세션 테이블을 참조해 방화벽에서 패킷 통과
- 일정시간 동안 통신 없음
- ④ 세션 타임으로 세션 테이블 만료
- 세션 만료 후 애플리케이션 통신 시작
- ⑤ 세션이 만료되어 방화벽에서 패킷 드롭
이런 문제를 해결하기 위한 방법들을 세션 장비 운영자 입장과 개발자 입장에서 알아보자.(이 중 하나만 적용되어도 서비스는 정상적으로 동작함)
1-1. 세션 장비 운영자 입장
가. 세션 만료 시간 증가
- 세션 장비 운영자가 애플리케이션에 맞게 세션 만료 시간을 늘리는 방법.
- 애플리케이션의 세션 유지 시간보다 방화벽 세션 유지 시간이 길어야 함
- 대부분의 세션 장비는 포트 번호나 IP 주소마다 별도의 세션 만료 시간을 설정할 수 있음
👉🏻 전체 세션 유지 시간이 길어져 시스템 메모리가 고갈되는 문제를 예방 - 하지만 애플리케이션측 개발자나 관리자가 애플리케이션 고유의 세션 유지 시간을 미리 알려주어야 세션 장비 운영자가 정확한 정보를 얻어 설정할 수 있다.
나. 세션 시간을 둔 채로 중간 패킷을 수용할 수 있도록 방화벽 설정(세션 장비 중 방화벽에 해당)
- 세션 테이블에 정보가 없는 ACK 패킷이 들어오면 방화벽은 패킷을 차단하지만, 이런 경우에도 세션을 만들어 통과시킬 수 있는 옵션이 있다.
- 하지만 보안이 취약해지는 기능이므로 여러가지 고려가 필요하고 가능하면 적용하지 않는 것이 좋음
다. 세션 장비에서 세션 타임아웃 시 양 단말에 세션 종료 통보
- 양 종단 장비의 세션 정보와 중간 세션 장비의 세션 정보가 일치하지 않아 문제가 발생할 때 사용
- 세션 타임아웃 시 세션 장비에서세션 정보를 삭제하는 대신 양 종단 장비에 세션 정보 만료(RST)를 통보
👉🏻 세션 상태 정보를 강제로 공유하기 위함
세션만료 시의 동작 과정
- 세션설정
- 일정시간 동안 통신 없음
- ① 세션 타임아웃값이 넘어 세션 만료
- ② 방화벽에서 양 중단 장비에 RST 패킷 전송
- A, B 장비 통신일 경우
- A 장비에는 출발지 B, 도착지 A인 RST 패킷 전송
- B 장비에는 출발지 A, 도착지 B인 RST 패킷 전송
- ③ RST 패킷을 받은 양 종단 장비는 해당 프로세스 종료
1-2. 개발자 입장
가. 애플리케이션에서 주기적인 패킷 발생 기능 추가
- 애플리케이션과 세션 장비의 세션 타임아웃 시간을 일치시키는 가장 좋은 방법
: 애플리케이션에서 패킷을 주기적으로 발생시키는 것 - 애플리케이션 개발 시 더미 패킷(Dummy Packet)을 보내는 기능을 추가
- 중간에 통신이 없더라도 일정 시간마다 양 단말 애플리케이션의 세션 상태 정보를 체크
- 패킷이 주기적으로 발생해 중간 방화벽에서 세션 타임아웃이 발생하기 전에 세션을 유지할 수 있다.
- 최근 대부분의 플랫폼에서는 이런 기능들을 내장하고 개발하도룩 안내
- 중간 세션 장비의 세션 만료 시간으로 인한 문제를 해결하는 가장 바람직한 방법
이런 세션 유지 기능은 다음과 같은 기능을 구현할 수 있다.
- 더미 패킷을 주기적으로 보내는 기능
- 트래픽이 일정 시간 동안 없을 때만 더미 패킷을 보내는 기능
- 더 복잡한 로직을 이용해 애플리케이선 상태를 체크하는 기능
패킷을 주기적으로 보내는 기능만 구현되더라도 방화벽 세션 만료로 인한 문제를 쉽게 해결할 수 있다.
2. 비대칭 경로 문제
- 네트워크의 안정성을 높이기 위해 네트워크 회선과 장비를 이중화
→ 패킷이 지나가는 경로가 2개 이상
→ 인바운드 패킷과 아웃바운드 패킷의 경로가 같거나 다를 수 있음 - 대칭 경로(Symmetric Path) : 같은 경로(인바운드 패킷과 아웃바운드 패킷이 같은 장비 통과)
- 비대칭 경로(Asymmetric Path) : 다른 경로(다른 장비 통과)
그러나 세션 장비가 세션 테이블을 만들어 관리하기 위해서는 패킷이 동일한 장비를 통과해 들어오고 나가야 한다.
네트워크 경로 이중화를 위해 세션 장비를 두 대 이상 설치한 경우, 패킷의 경로가 일정하게 유지되지 않으면 정상적인 서비스가 되지 않는다.
이 문제의 가장 좋은 해결 방법은 비대칭 경로가 생기지 않도록 네트워크와 경로를 디자인하는 것이지만, 어쩔 수 없는 경우 세션 장비에 비대칭 경로를 처리하는 기능을 이용할 수 있다.
그러나 이는 세션 장비의 성능이 저하되거나 보안이 약화될 수 있다.
이러한 문제를 해결하는 법은 아래 두 가지로 나눠 볼 수 있다.
1. 세션 테이블 동기화
- 세션 테이블을 동기화하면 두 개 경로상의 두 장비가 하나의 장비처럼 동작 → 비대칭 경로에서도 정상적으로 동작
- 장점: 패킷 경로를 변경하지 않고 동작
- 단점: 세션을 동기화하는 시간보다 패킷 응답이 빠르면 정상적으로 동작하지 않을 수 있다
- 데이터 센터에서 응답시간이 빠른 애플리케이션을 사용할 경우 세션 동기화 시간보다 응답시간이 더 빠를 수 있음
- 응답시간이 비교적 긴 인터넷 게이트웨이로 방화벽이 사용될 때 유용하게 사용
2. 세션 장비에서 다양한 방법으로 보정
- 인바운드 패킷이 통과하지 않았는데 아웃바운드 패킷이 장비로 들어온 경우
인바운드 패킷이 통과한 다른 세션 장비 쪽으로 패킷을 보내 경로를 보정 - 강제로 대칭 경로를 만듦
- 강제로 다른 방화벽으로 패킷을 보내야 함 → 방화벽 간 통신용 링크가 필요
- 경로 보정 기법
- MAC 리라이팅(Rewriting): MAC 주소 변경
- 터닐링(Tunneling): 기존 패킷에 MAC 주소를 한번 더 인캡슐레이션
3. 하나의 통신에 두 개 이상의 세션이 사용될 때의 고려사항
세션 관리 중 주의사항
- 대부분의 현대 프로토콜은 하나의 통신에 하나의 세션만 사용하나, 특별한 경우에는 두 개 이상의 세션을 생성할 수 있음.
- 중간에 위치한 세션 장비는 서로 다른 두 세션이 동일한 통신을 위해 활성화 중임을 인식해야 함.
- 한 세션이 끊기거나 삭제되면 단방향 통신만 가능하거나 통신이 중단될 수 있음.
프로토콜은 데이터 프로토콜과 컨트롤 프로토콜로 구분할 수 있다.
- 데이터 프로토콜
- 주된 목적: 데이터 전송
- 역할: 실제 데이터를 전송하고 수신함.
- 컨트롤 프로토콜
- 주된 목적: 세션 제어 및 관리
- 역할: 데이터가 원활하게 전송되도록 세션을 관리하고 제어함.
통합 vs 분리된 프로토콜
- 대부분의 현대 프로토콜은 컨트롤과 데이터 프로토콜을 하나의 헤더나 별도 메시지로 통합하여 사용.
- 특별한 목적이나 오래된 프로토콜은 두 개의 프로토콜이 분리된 경우가 있음.
FTP(File Transfer Protocol)
- 대표적인 분리된 프로토콜 중 하나.
- 컨트롤 프로토콜과 데이터 프로토콜이 완전히 분리되어 있음.
- 두 가지 모드를 통해 통신 방법이 다르게 구성됨.
- 프로토콜의 세분화와 통신 세션 관리는 신속한 문제 해결과 원활한 통신을 위해 주의가 필요하며, 이러한 이해는 네트워크 관리에서 핵심 역할을 수행한다.
FTP의 구동 방식에는 Active 모드와 Passive 모드가 있으며, 기본적인 구동 방식은 Active 모드.
Active 모드
- 컨트롤 프로토콜과 데이터 프로토콜이 분리, 방향 반대로 동작
- 컨트롤 프로토콜 : 명령어 전달 / 클라이언트 → 서버로 통신 시작 (일반적인 클라이언트-서버 동작 방식과 다름)
- 데이터 프로토콜 : 데이터 전달 / 서버 → 클라이언트 쪽으로 데이터 푸시
- 클라이언트가 FTP 서버에 접속. 클라이언트는 1023번 이상의 TCP 포트를 사용하고, 서버는 TCP 21번 포트를 사용.
- ① 클라이언트는 서버에게 데이터를 수신할 포트로 1025번 포트를 사용할 것을 알림.
- ② 서버는 클라이언트에게 1025번 포트를 사용하여 데이터를 송신할 것을 응답.
- ③ 서버에서 데이터를 보내고, 클라이언트에서 응답하여 데이터를 수신.
- Active 모드의 문제점 및 해결책
- Active 모드는 컨트롤 프로토콜과 데이터 프로토콜이 분리되어 있고, 방향이 반대로 동작하는 특징이 있음.
- 중간에 방화벽이나 세션 장비가 있는 경우, 방화벽의 반대 방향도 열어주어야 함.
- NAT 환경에서는 ALG(Application Layer Gateway)를 사용: FTP 명령어를 이해하고 데이터 세션을 인지해 방화벽과 NAT을 자동으로 동작
Passive 모드
- Active 모드의 단점을 보완하기 위해 만들어짐
- 클라이언트가 서버에 접속. 클라이언트는 1023번 이상의 TCP 포트를 사용하고, 서버는 TCP 21번 포트를 사용(Active 모드와 동일).
- ① 클라이언트가 Passive 모드를 사용하겠다고 알림.
- ② 서버는 클라이언트에게 2024번 포트를 사용해 데이터를 수신하겠다고 알림.
- ③ 클라이언트에서 서버에 데이터를 요청하며, 서버에서 알려준 2024번 포트에 요청.
- 데이터 전송.
- Passive 모드의 장점 및 주의사항
- 클라이언트 쪽에 방화벽이나 세션 장비가 있을 경우, 추가 작업 없이 동작 가능.
- 서버 쪽에 방화벽이 있으면 데이터 다운로드를 위한 추가 포트를 열어주어야 함.
- FTP 서버에서 Passive 모드에서 사용하는 데이터 포트의 범위 설정 가능.
참고
⌜IT 엔지니어를 위한 네트워크 입문⌟ 길벗, 2023
[6장] 로드 밸런서/방화벽:4계층 장비(세션 장비) - 6.4 4계층 장비를 통과할 때의 유의점(세션 관리) | (p.201~211)
* 책을 참고해 필요한 내용을 정리한 것이므로, 책의 내용과 다를 수 있습니다.
GitHub 댓글