본문 바로가기

네트워크

파일 전송 프로토콜 - FTP(File Transfer Protocol)

반응형

ி 개요

 
TCP/IP 환경에서 서버와 클라이언트 사이의 파일 전달을 위한 프로토콜이다.
FTP 서버에 파일을 올리면 사용자들이 접속해서 다운로드할 수 있다.
많은 사람이 웹 브라우저를 FTP로 이용하기도 한다.



ி 특징

 
FTP는 로그인 기능이 있다.
FTP는 로그인 정보가 평문으로 노출돼서 인증에 취약하다.
그에 따라 패킷을 암호화하여 통신하는 sftp(ssh ftp)가 나왔다.
하지만 모든 패킷을 암호화하므로 ftp보다 속도가 떨어진다.

두 가지의 모드가 존재한다.
전송 모드(Active Mode), 수동 모드(Passive Mode)
( 사용 여부는 서버가 아닌 클라이언트가 결정하며 둘의 차이점은 전송 방향에 대한 부분이다. )
ftp 클라이언트 프로그램은 모드 기본값이 Active, 웹 브라우저 ftp passive이다.

일반 서비스와 달리 포트를 2개 사용한다.
접속을 위한 포트인 제어 포트(21번)
데이터 전송을 위한 포트인 데이터 포트(모드에 따라 바뀜)
데이터 포트 ( Active - 20번, Passive - FTP 서버가 결정)



Active 모드

 
클라이언트 자신이 랜덤으로 생성한 데이터 포트 서버에게 전달하고
서버는 수신한 데이터 포트로 접속한다.
즉, 클라이언트 입장에서는 서버가 능동적으로 내 데이터 채널에 직접 접속해주는 모드이다.

통신 과정


(제어 채널 생성)
클라이언트는 사용하지 않는 랜덤한 포트(1024-65535)를 통해서 서버의 제어 포트(21)에 접속한다.

(데이터 포트 생성)
랜덤으로 정해진 포트 번호에 1을 더한 포트 번호를 서버에 전송하며,
클라이언트는 해당 포트를 Listening한다.

(데이터 채널 접속)
서버의 데이터 포트(20)가 클라이언트의 데이터 포트로 접속한다.
클라이언트가 데이터를 요청하면 서버는 연결된 데이터 포트를 통해서 파일을 전송한다.

➽ 예시
클라이언트가 서버에 접속할 때 5000번 포트를 이용하여
접속 요청을 보낼 때 추가로 +1 더한 5001번 포트의 정보를 같이 서버에 보낸다

서버의 제어 포트(21)에서 해당 클라이언트의 요청을 수락하고
같은 종류의 포트와 연결한다.
즉, 제어 포트(21) 클라이언트의 제어 포트(5000),
데이터 포트(20) 클라이언트의 데이터 포트(5001)와 연결한다..


문제는 서버가 클라이언트로 접속할 때
클라이언트에서 시스템 침입으로 간주하여 방화벽에 의해 차단될 수가 있다.
정상 서비스를 하려면 클라이언트 방화벽에서 20,21번 포트를 연다.



Passive 모드

 
서버에서 클라이언트로 접속해야 하는 모순을 해결하기 위한 모드이다.
Active는 서버가 클라이언트 포트에 직접 접속했지만
Passive는 두 개의 포트가 모두 클라이언트에서 서버에 접속한다.

Passive에서는 서버가 데이터 포트를 결정하고 클라이언트에게 알려주는 방법을 사용하는데,
문제는 Passive 모드의 지원 여부 서버에 많은 포트가 있어야 하는 점이다.
해당 포트에 클라이언트가 접속할 수 있게 일정 범위의 포트를 열어 주어야 하는데,
대량 접속 시 네트워크 자원이 부족해질 수 있어서 FTP 서버가 사용할 포트 범위를 직접 지정하는 것이 좋다.


통신 과정


(데이터 포트 질의)
클라이언트가 서버의 제어 포트(21)에 접속하고 PASV 명령을 호출한다.

(데이터 포트 생성)
서버가 데이터 포트를 결정하고 클라이언트에게 해당 포트를 알려준다.

(데이터 채널 접속)
클라이언트는 전달받은 서버의 포트 번호로 접속하여
클라이언트가 서버에서 데이터를 가져온다.

➽ 예시
Active와 마찬가지로 서로 포트를 교환한다.
서버의 제어 포트(21)에서 해당 클라이언트의 요청을 수락하고
제어 포트(21) 클라이언트의 제어 포트(5000)
서버 측의 데이터 포트(1024~65535) 클라이언트의 데이터 포트(5001)와 연결한다.




위 내용을 표로 정리하면 다음과 같다.

포트 Active Passive 
클라이언트 제어 포트 랜덤
클라이언트 데이터 포트 클라이언트 제어 포트 + 1
서버 제어포트 21
서버 데이터 포트 20 랜덤

 

 


통신 기록 캡처


다음 사진은 특정 FTP 서버에 로그인하여 PASV(Passive) 모드를 통해 파일을 다운받은 기록이다.

 

[FTP 로그인]

 

[Wireshark 캡처]

 

 

➽ 패킷 해석
1        FTP 접속 문구
2~5    로그인
16-17  Passive 모드 설정
18      파일 복사
19      데이터 연결 - 파일 상태 양호
20      데이터 연결 닫힘 - 파일 전송 완료
21-22  로그아웃

 

17번 패킷 Entering Passive Mode 인자에는
ip 주소와 연결될 포트번호가 들어간다.
예를 들어 Entering Passive Mode (10.10.10.15,8,126) 이면
ip - 10.10.10.15, port - (8 * 256 + 126) = 2174가 된다.




ி FTP 명령어

 
cd - remote 시스템의 디렉토리를 변경한다.(cd 디렉토리명)
ascii - 전송 모드를 ascii 모드로 설정한다.
binary - 전송 모드를 binary 모드로 설정한다.
bye - ftp 접속을 종료 후 빠져나간다.
cdup - remote 시스템에서 한 단계 상위 디렉토리로 이동한다.
chmod - remote 시스템의 파일 퍼미션을 변경한다.(chmod 755 index.html)
CWD - 디렉토리를 변경한다.
delete - remote 시스템의 파일을 삭제한다.(delete index.old)
dir - remote 시스템의 디렉토리 내용을 디스플레이한다.
DIRS - 디렉토리 목록과 관련된 모든 명령
disconnect - ftp 접속을 종료한다.
exit - ftp 접속을 종료하고 빠져나간다.
get - 지정된 파일하나를 가져온다.(get index.html)
hash - 파일전송 도중에 "#"표시를 하여 전송중임을 나타낸다.
help - ftp 명령어 도움말을 볼 수 있다.
lcd - local 시스템의 디렉토리를 변경한다.
ls - remote 시스템의 디렉토리 내용을 디스플레이한다.
LOGIN - 서버에 연결하거나 로그인을 제한할 경우
mdelete - 여러 개의 파일을 한꺼번에 지울 때 사용한다. ( mdelete *.old)
mget - 여러 개의 파일을 한꺼번에 가져오려할 때 사용한다. ( mget *.gz)
MKD - 새로운 디렉토리를 만들 경우
mput - 한꺼번에 여러 개의 파일을 remote 시스템에 올린다. (mput *.html)
open - ftp접속을 시도한다. (open 168.126.72.51또는 open ftp.kornet.net)
prompt - 파일전송시에 확인과정을 거친다. on/off 토글
put - 하나의 파일을 remote 시스템에 올린다. (put index.html)
pwd - remote 시스템의 현재 작업 디렉토리를 표시한다.
quit - ftp 접속을 종료하고 빠져나간다.
READ - 파일 읽기와 관련된 모든 FTP 명령
rstatus - remote 시스템의 상황 (version, 어디서, 접속ID등)을 표시한다.
rename - remote 시스템의 파일명을 바꾼다. (remote 현재파일명 바꿀파일명)
RETR - 서버에서 클라이언트로 파일을 전송할 경우
rmdir - remote 시스템의 디렉토리를 삭제한다. (rmdir 디렉토리명)
RMD - 디렉토리를 삭제할 경우
RNFR,RNTO - 디렉토리의 이름을 바꿀 경우
size - remote 시스템에 있는 파일의 크기를 byte단위로 표시한다. (size index.html)
status - 현재 연결된 ftp 세션 모드에 대한 설정을 보여준다.
STOR - 클라이언트에서 서버로 파일을 전송할 경우
type - 전송 모드를 설정한다.
WRITE - 파일 또는 디렉토리 쓰기, 생성, 삭제와 관련된 FTP 명령
bell - 명령어 완료 시 벨소리를 나게 한다.
literal argument [...] - 임의의 ftp 명령어를 보낸다.



➽ 참고 자료

 

반응형