FTP란 무엇일까
FTP는 File Transfer Protocol의 약자로 말그대로 파일을 전송하는 통신 규약입니다. FTP 서버에 파일들을 업로드, 다운로드할 수 있도록 해주는 프로토콜이며, 이는 FTP 서버와 FTP 클라이언트 간에 통신에서 이루어집니다.
FTP는 Active 모드와 Passive 모드라는 2개의 모드가 존재하며 각각의 모드에서는 2개 또는 2개 이상의 포트가 연결을 맺고 데이터를 전송하는데 사용됩니다. 사용되는 포트는 연결을 제어하는 Command 포트가 있으며 데이터를 전송하는 DATA 포트가 있습니다.
FTP는 TCP 기반으로 만들어져 있으며 기본으로 동작 모드로 Active 모드를 사용하며 20번 또는 1024번 이후의 데이터(Data) 포트는 데이터를 전송하는데 사용하게 되고, 21번 포트는 접속시에 사용되는 명령(Command )포트입니다.
Active 모드
FTP Active 모드의 동작 방식을 그림으로 보면 아래와 같습니다. 참고로 아래 사용된 명령(Command) 포트와 데이터(Data) 포트는 서버의 설정에서 임의로 수정하여 사용할 수 있습니다.

- 1) 클라이언트는 서버의 21번 포트로 접속한 후에 자신이 사용할 두 번째 포트를 서버에 미리 알려줍니다.
- 2) 서버는 클라이언트의 요청에 응답합니다. (acks)
- 3) 서버의 20번 데이터 포트는 클라이언트가 알려준 두 번째 포트로의 접속을 시도합니다.
- 4) 클라이언트가 서버의 요청에 응답합니다. (acks)
위 과정에서 액티브 모드는 “클라이언트가 서버에 접속을 하는 것이 아닌 서버가 클라이언트에 접속을 하는 것”을 확인할 수 있습니다. 만일 FTP 클라이언트에 방화벽이 설치되어 있는 등 외부에서의 접속을 허용하지 않는 상황이라면 FTP 접속이 정상적으로 이루어지지 않을 것입니다. 접소기 되더라도 데이터 목록을 받아오지 못하게 되는 경우도 있고요.
Passive 모드
위에서 살펴본 Active 모드의 단점을 해결하기 위한 Passive 모드를 살펴봅시다. 역시나 아래 그림에서 사용된 커맨드 포트와 데이터 포트는 서버 설정에서 변경할 수 있습니다. 특히 Passive 모드에서는 데이터 포트 번호를 특별하게 지정하지 않는 경우 1024 ~ 65535번 중에서 사용 가능한 임의 포트를 사용하게 됩니다. 포트 번호를 지정할 때는 10001 ~ 10005번과 같이 범위를 지정할 수도 있습니다.

- 1) 클라이언트가 커맨드 포트로 접속을 시도합니다. (Passive 모드 연결)
- 2) 서버에서는 사용할 두 번째 포트를 클라이언트에게 알려줍니다.
- 3) 클라이언트는 다른 포트를 열어 서버가 알려준 포트로 접속을 시도합니다.
- 4) 서버가 클라이언트의 요청에 응답합니다. (acks)
Passive 모드에서는 앞선 Active 모드에서 사용했던 20번 포트를 사용하지 않고 1024번 이후의 임의의 포트를 데이터 채널 포트로 사용하게 됩니다.
연결 방식에 따른 주의사항
Active Mode의 경우는 클라이언트 측의 방화벽에 20번 포트가 차단되어 있다면, 데이터 채널 연결이 불가능해집니다. 연결은 되더라도 데이터 조회부터 실패되는 경우가 발생할 수 있습니다. 따라서 서버측은 20번 포트는 아웃바운드(OUTBOUND, 내 서버에서 외부서버로 보내는 요청) 허용, 클라이언트는 인바운드(INBOUND, 외부에서 내 서버로 들어오는 요청) 허용이 방화벽 설정에 필요합니다.
Passive Mode의 경우는 서버 측의 데이터 채널 포트가 막혀있는 경우 데이터 채널 연결이 불가능하게 됩니다. 그리고 앞서 소개한 것처럼 데이터 채널 포트의 범위를 지정할 수 있는데, 별도로 지정하지 않는 경우는 1024 ~ 65535번의 포트를 사용하게 됩니다. 따라서 INBOUND 모두 허용이 필요하게 되는데, 서버 측에서 데이터 채널 포트 범위를 지정하여 특정 범위의 포트만 허용해주면 모든 포트 허용의 문제를 어느 정도 해결할 수 있습니다.
-------------------------------------------------------------------------------------------------------------------------------
ftp는 다른 서비스와는 달리 Active 모드와 Passive 모드 두가지가 존재한다.
일반적으로 우리가 알고있는 21번 포트는 접속 및 명령어 전송에 사용되고, 20번 포트는 데이터 전송에 사용된다.
그렇다면 이 두가지 모드의 차이점에 대해 간략하게 정리하면(어디까지나 간략하게)
< Active mode >
1. 클라이언트에서 서버의 21번 포트로 접속을 시도한다. 동시에 ftp서버가 passive connection 을 사용하는지 확인
( 이때 클라이언트는 임의의 N번 포트를 사용한다. 즉 Client N port -> Server 21 port )
2. 클라이언트가 서버로 접속을 시도하는 동시에 데이터 전송에 사용할 또다른 포트를 서버쪽에 알려준다.
( Client의 N port는 접속용, 데이터용도로 사용할 N2 port를 결정하여 서버쪽에 알려줌 )
3. 서버에서 데이터 전송용으로 사용되는 20번 포트에서 클라이언트가 알려준 N2 port로 접속을 시도한다.
( Server 20 port -> Client N2 port )
Active mode의 가장 큰 특징은, 일반적인 Client-Server 모델과는 달리, 서버쪽에서 클라이언트의 포트로 접속을 한다는 것.
< Passive mode >
1. 클라이언트에서 서버의 21번 포트로 접속을 시도한다. 동시에 ftp서버가 passive connection 을 사용하는지 확인
( 여기까지는 똑같다. 클라이언트는 임의의 N번 포트를 사용한다. 즉 Client N port -> Server 21 port )
2. 서버쪽에서는 클라이언트의 요청에 응답을 해줌과 동시에, 서버쪽에서 사용할 또다른 포트를 클라이언트에 알려준다.
( 이때 또다른 포트를 S2 port라 하면, Server S2 port -> Client N port )
3. 클라이언트는 데이터 전송에 사용할 또다른 포트를 사용하여, 서버가 알려준 포트에 접속을 시도한다.
( Client N2 port -> Server S2 port )
Passive mode의 가장 큰 특징은 클라이언트에서 서버쪽으로 접속을 시도한다는 것.
일반적인 ftp client 프로그램은 Active mode로 동작하게 되어 있으며,
웹 브라우저의 경우에는 Passive mode가 기본 모드로 설정이 되어있다.
Active mode로 접속시 접속은 되지만 파일리스트등이 제대로 보이지 않는 경우가 있는데
대부분의 문제점은 client와 server 사이에 존재하는 방화벽이 원인이 되는 경우가 많다.
특히 client 쪽에 방화벽이 있거나 server쪽 방화벽에서 outbound 패킷에 대해 필터링을 하는 경우,
서버에서는 클라이언트가 알려준 포트로 접속을 해야 하는데, 방화벽에서 차단을 하기 때문에 데이터 전송이 안되는 것이다.
그래서 해결책으로 passive mode로의 연결이 있으며, 서버쪽에서는 passive mode에 사용할 포트를 미리 지정한 후
해당 포트에 대해 inbound 방화벽을 미리 오픈해 놓으면 된다.