-
FTP 프로토콜 Passive Mode와 Active ModeNetwork/Network 2019. 9. 17. 22:22
이번에 포스팅할 내용은 FTP에 관련된 내용이다.
FTP는 File Transfer Protocol로 파일 전송에 사용되는 프로토콜이다.
FTP 서버와 FTP 클라이언트와 서버간의 통신으로 파일을 업로드 또는 다운로드 한다.
( FTP 서버는 vsFTPd, FTP 클라이언트는 FileZilla를 사용했다 )
이러한 FTP에는 두 가지 통신 방식이 존재하는데
그것이 바로 Passive Mode(수동적)와 Active Mode(능동적)이다.
Passive Mode의 경우 Data Channel 요청을 클라이언트 -> 서버로 진행하며
Active Mode의 경우 Data Channel 요청을 서버 -> 클라이언트로 진행한다.
그럼 Passive Mode의 통신방식부터 알아보자.
통신과정은 다음과 같다.
1. FTP 클라이언트에서 FTP 서버의 21 포트로 접근 인증을 요청한다.
-> 이 때 Passive Mode를 사용할 것이라는 것도 알린다.
2. FTP 서버는 FTP 클라이언트에게 "OK"라는 응답을 보내면서
데이터 채널 포트번호 59175를 클라이언트에게 알려준다.
3. FTP 클라이언트에서 생성한 52757번 포트에서 서버의 59175포트로 데이터 채널 연결을 요청한다.
4. FTP 서버는 FTP 클라이언트에게 "OK"라는 응답을 보내고 채널 연결을 진행한다.
위의 과정을 실제 패킷을 통해 분석해 보았다.
위의 과정 전에도 여러 과정이 있다는 것을 알 수 있었다.
나는 FTP서버에서 vsFTPd를 사용했기 때문에 응답으로 vsFTPd의 버전을 알려줬고
USER ID와 Passwd를 제대로 입력하라는 응답도 있었다..;; ㅎㅎ
또한 TLS와 SSL에 대한 내용도 존재했다. 현재 구축해놓은 FTP 서버에서
SSL관련 설정하지 않았기 때문에 SFTP로는 진행되지 않는다.
다음으로 USER와 PASSWD를 toxx와 123123으로 Request했고
제대로 로그인이 되었다는 230 Login successful Response를 볼 수 있다.
또한 PWD명령어를 요청해서 현재 있는 위치 디렉토리경로에 대한 응답을 받을 수 있었다.
TCP Stream으로 보면 한 눈에 쉽게 볼 수 있다.
다음으로 진행되는 제일 위 그림의 Passive Mode의 통신 과정에 대한 패킷을 보도록 하자.
그림에서 처럼 PASV 즉, Passive Mode를 사용한다는 Request를
FTP 클라이언트가 FTP 서버로 보내는 패킷을 제일 먼저 확인 할 수 있었다.
다음으로는 FTP 서버에서 FTP 클라이언트에게 응답을 주는 패킷인데
IP 다음에 231, 39라는 값이 들어있었다. 여기서 231, 39는
227 Entering Passive Mode의 arg로 231 * 256 + 39 = 59175 (계산법)
즉, FTP 서버가 FTP 클라이언트에게 데이터 채널 포트를 알려주는 것이다.
* 참고로 데이터 포트는 조금씩 변경될 수 있으므로 방화벽 설정 시, 데이터 포트 범위를 조금 여유를 두는 것이 좋다고 한다 *
다음으로는 FTP 클라이언트에서 test.txt 파일에 대한 요청을 진행했고
FTP 서버의 데이터 채널 포트와 FTP 클라이언트의 데이터 채널 포트가
서로 3Way handshake를 통해 통신하는 것을 볼 수 있다.
연결 성립 이후, FTP 서버는 FTP 클라이언트에서 요청한 test.txt에 대한 정보를
Passive Mode로 넘겨주었다. text.txt에 적힌 내용에 대한 길이(크기)와
"vsftpd test file\n"이라는 text.txt의 내용을 볼 수 있었다.
전송 이후에는 4Way handshake를 통해 데이터 채널 간의 통신을 해지하고
FTP 서버에서 FTP 클라이언트에게 226 Transfer complete라는
전송이 성공했다는 응답 메시지를 보내는 것으로 완료되었다.
역시 TCP Stream으로 보면 한 눈에 쉽게 볼 수 있다.
/etc/vsftpd.conf 파일 설정 Passive Mode
listen=NO
listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
pasv_enable=YES
pasv_min_port=50090
pasv_max_port=50100
user_sub_token=$USER
local_root=/home/$USER/ftp
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
이번에는 Active Mode의 통신방식에 대해 알아보자
1. FTP 클라이언트에서 FTP 서버의 21번 포트에 접근 인증을 요청한다.
-> FTP 클라이언트 자신의 Data 전송 포트 번호 57775를 서버에게 전송한다.
2. FTP 서버에서는 FTP 클라이언트에게 "OK" 응답을 보낸다.
3. FTP 서버에서 생성한 20번 포트에서 FTP 클라이언트의 57775 포트로 데이터 채널 연결을 요청한다.
( Active Mode에서 Data Port는 Command Port + 1 이다 )
4. FTP 클라이언트는 FTP 서버에게 "OK" 응답을 보내고 데이터 채널 연결이 완료된다.
* Active Mode 참고 *
-> FTP 클라이언트 포트 번호는 1024 이상 중 사용 가능한 임의의 포트가 사용된다.
-> FTP 클라이언트 데이터 채널 포트 번호는 위에서 나온 Command 포트 + 1 이다.
FTP 인증/명령 포트번호와 데이터 채널 포트 번호는 서버의 설정에서 수정이 가능하다.
(TCP 20 / TCP 21 대신 서비스 제공자 마음대로 설정이 가능하다)
역시 위의 과정을 실제 패킷에서 확인해 보았다.
( 아래의 그림과 TCP Stream을 함께 참고해서 보자 )
역시 Passive Mode처럼 그림에서의 과정보다 더 많은 과정이 있었다.
FTP서버에서 vsFTPd 버전을 알려주고 있었고 TLS와 SSL에 관련된
내용도 있었다. 이전의 Passive Mode처럼 USER와 PASSWD로 Request했고
제대로 로그인 되었다는 응답을 알 수 있었다. FTP 클라이언트에서 PWD 명령을 요청했고
응답으로 FTP 서버로 부터 현재 있는 위치 디렉토리 경로에 대한 응답을 받을 수 있었다.
( TCP Stream으로 본 모습이다 )
FTP 클라이언트에서 225 * 256 + 175 = 57775 포트 즉, 데이터 채널 포트를 요청했다.
FTP 서버는 FTP 클라이언트의 데이터 채널 57775와 서버의 데이터 채널 20 간의
PORT 명령이 성공적으로 이루어졌다는 메세지를 응답해주었다. 또한
"Consider using PASV"라는 메시지로 Passive 모드를 사용하는 것을 고려하라고 했다.
FTP 클라이언트는 test.txt파일을 FTP 서버에 요청했고 57775와 20포트의 통신이
3Way handshake로 연결되었다. 그 뒤 FTP 서버의 응답으로 test.txt 파일의
내용을 전송해주고 통신이 해제되면서 마무리 되었다.(Passive Mode와 같음)
/etc/vsftpd.conf 파일 설정 Active Mode
listen=NO
listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
pasv_enable=NO
user_sub_token=$USER
local_root=/home/$USER/ftp
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
결론적으로 FTP의 두 가지 모드 Passive Mode와 Active Mode의 차이는
클라이언트가 서버에게 접근 요청 시, 서버 응답으로 서버의 데이터 포트를 알려줘서
클라이언트가 서버의 데이터 채널에 접근 요청을 하는가
or
클라이언트가 접근 요청을 할 때 자신의 데이터 포트를 알려줘서
서버가 클라이언트의 데이터 채널에 접근 요청을 하는가
간단히 비유해서 말하자면
* Passive Mode *
클라이언트가 "나 패시브 모드 하고 싶어" 하면
서버가 "그래 내 데이터 채널 포트는 xxxx 이거니까 니가 접근 요청해"
* Active Mode *
TMI인 클라이언트가 "내 데이터 채널 포트는 xxxx 이거야 서버 니가 접근 요청해"
역시 직접 패킷을 잡아보고 분석하면서 이해하는 것이 가장 좋은 것 같다.
복잡한 내용도 아닌데 환경 셋팅에서 쓸데없는 삽질한 탓에 시간을 좀 썼지만 또 하나 배웠다ㅎㅎ
참고 :
https://sata.kr/entry/5BFTP5D20FTPEC9D9820Active20ModeEC998020Passive20Mode20ECB0A8EC9DB4ECA090
https://webdir.tistory.com/206
https://dejavuqa.tistory.com/252
반응형'Network > Network' 카테고리의 다른 글
Computer Bus (0) 2020.02.03 CAN 통신 ( Controller Area Network ) (2) 2020.02.03 Domain과 SSL 인증서 발급받고 적용하기 (0) 2019.08.24 ifconfig 인터페이스 up 시 에러가 발생했을 때 (0) 2019.01.17 와이어샤크 원하는 패킷만 저장하기 (0) 2019.01.17 댓글