FTP 프토로콜의 Active Mode와 Passive 모드

얼마 전 1회 정보보안기사 필기시험을 치렀다. 시험 준비를 하면서 평소의 내 좌우명(?) 처럼 좋은 남편, 좋은 아빠, 좋은 회사원을 추구하면서 개인적으로 시험공부까지 하려니 하루를 32시간으로 늘리거나 잠안자고도 멀쩡할 수 있는 초능력을 갖고 싶은 마음이 굴뚝 같았다. (물론 이 세가지를 모두 만족할 만큼 하고 있지는 못하다.. -.-)

그런데.. 정보보안기사 시험에 FTP 프로토콜에 대한 문제가 출제되었고 별다른 생각없이 평소 알고 있는 지식을 이용해 가볍게 문제를 맞췄다. 이 문제는 “FTP프로토콜에서 Passive 모드는 서버가 클라이언트에게 알려준 임의의 포트번호로 클라이언트가 접속하는 방식” 이라는 것과 “패시브 모드는 FTP 클라이언트가 서버에게 pasv 커맨드를 보내 설정한다”는 것을 알면 쉽게 풀 수 있는 문제였다.

그런데 시험을 본 뒤 의외로 많은 논란이 일고 있어 깜짝 놀라게 되었다. 

이슈는 “FTP의 패시브모드 사용을 누가 정하느냐?” 였다. 문제상에 분명 “프로토콜 에서” 라고 명시하고 있는데 FTP서버의 설정에서 패시브 모드의 사용 여부를 정하니 답이 “서버” 라고 많은 사람들이 이해하고 있다는데 놀랄 수 밖에 없었다.

이런 논란은 프로토콜이라고 문제에서 제한하고 있는 것을 못보았거나 Protocol과 Client/Server의 개념에 대한 정확한 이해 부족 그리고 Application의 Configuration에 따른 Daemon의 동작방식”에 대해 정확하게 개념을 잡지 못하고 있기 때문에 발생하는 것이 아닐까 생각된다.

FTP의 Active Mode와 passive 모드에 대해 간단하게 정리한다.

 

 

FTP는 기본적으로 서버가 TCP/21 포트에서 Listen하고 있는 상태에서 FTP 클라이언트 프로그램이 서버의 TCP/21 포트에 접속한다. 이 때 맺어진 세션을 Control Session 이라고 한다(혹은 Command Session이라고도 함). 그리고 이 세션에서는 실제 파일의 전송이 이루어지지 않는다. 이 세션은 클라이언트와 서버간에 명령과 명령에 대한 응답이 오가는 역할만을 수행한다.

일단 FTP클라이언트가 FTP서버와 Control Session을 맺고 클라이언트가 dir, get, put 등의 명령을 수행하면 실제 데이터를 전송할 Data Session을 생성하게 되는데 이때 부터 Active Mode냐 Passive Mode냐에 따라 통신 구조가 달라지게 된다.

기본적으로 FTP클라이언트가 FTP서버에 접속하면 Active 모드로 동작하게 된다. 만약 패시브모드로 접속하고 싶다면 FTP서버에 로그인한 뒤 명령행에 pasv 명령을 실행하여야 한다. 알FTP등 클라이언트 도구에서 passive 옵션을 체크한 뒤 접속하면 로그인 뒤 pasv 명령을 클라이언트 프로그램에서 자동으로 실행시켜 주는 것이다.

<!–[if !supportLists]–>–       <!–[endif]–>Active Mode

클라이언트가 서버의 21번(Control Session)에 접속한 뒤 클라이언트가 1024번 이상의 포트를 열고 Listen한 뒤 해당 포트 번호를 서버에게 알려준다. 서버는 전달받은 포트로 20번 포트에서 클라이언트로 접속을 시도하여 데이터 세션을 생성한다.

따라서 서버가 공인망에 있고 클라이언트가 사설망 혹은 방화벽 안쪽에 있을 경우 접속이 불가한 문제가 있다. 

<!–[if !supportLists]–>–       <!–[endif]–>Passive Mode

클라이언트가 서버의 21번(Control Session)에 접속한 뒤 클라이언트가 서버에게 pasv 명령을 전달하면 서버는 해당 클라이언트의 데이터세션 생성을 위해 1024 이상의 임의의 포트를 열고 Listen한 뒤 해당 포트번호를 클라이언트에게 알려준다. 클라이언트는 전달받은 서버의 포트번호로 접속하여 데이터세션을 생성한다.

 

따라서 서버 측에서 클라이언트가 접속할 수 있도록 21번 포트 외에 일정 범위의 포트를 Open해 주어야 한다.

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중