본문 바로가기

TroubleShooting/Network

ftp 정리

728x90
ftp 프록시 기능을 설계할 일이 있어서, ftp 연결시 만들어지는 포트들에 대해서 정리를 해보았습니다.

ftp 는 2개의 세션을 가집니다.
1. 제어 세션(control sesssion)
- 클라이언트가 서버에 접속할때부터 종료될때까지 유지됩니다.
- command 를 서버에 보내거나 데이타 포트를 전달하는 채널입니다.

2. 데이터 세션(data session)
- 데이터(ex, dir 명령시 디렉토리 목록)를 주고받을때 사용되는 채널입니다.
- 데이터 전송후, 연결이 종료됩니다. 즉, 클라이언트에서 매번 명령입력시 새로운 채널이 생성됩니다.
- active 모드와 passive 모드에 따라 데이터 세션을 위한 포트 생성이 틀려집니다.

3. active 모드
- 클라이언트에서 데이터 세션을 위한 포트를 생성하고, 클라이언트가 서버로 포트번호를 전달하면 서버에서 클라이언트으로 접속을 하게됩니다.
- 제어 세션(C:XXX번 -> S:21번)
- 데이터 세션(C:YYY번 <- S:20번)

4. passive 모드
- 서버에서 데이터 세션을 위한 포트를 생성하고, 서버가 클라이언트로 포트번호를 전달하면 클라이언트에서 서버로 접속합니다.
- 제어 세션(C:XXX번 -> S:21번)
- 데이터 세션(C:YYY번 -> S:ZZZ번)

ex) client : 192.168.100.2, server : 192.168.100.1
+ active 모드
- 클라이언트에서 dir 명령을 실행하면, 서버에 "PORT 192.168.100.2,9,43" 와 "LIST" 를 제어 채널을 통해 전달합니다.
- 서버는 192.168.100.2,9,43 를 파싱하고 IP 부분 뒤의 9, 43 을 데이터 포트로 보고  클라이언트 2346(9*256+43)번 포트으로 데이타 연결을 합니다.

+ passive 모드
- 클라이언트에서 dir 명령을 실행하면, 서버에서 "227 Entering Passive Mode (192,168,100,1,6,249)" 가 제어 채널을 통해 전달됩니다.
- 클라이언트에서 서버로 1785번 포트로 데이터 연결을 합니다.

* ftp 클라이언트중에서 unix 계열 클라이언트는 ftp 프롬프트에서 passive 혹은 pasv 명령으로 passive 모드로 변경이 가능한데, 윈도우 ftp 클라이언트 프로그램은 passive 관련 명령이 없습니다. 그런 경우, "quote pasv" 으로 passive 모드로 변경할 수 있습니다.