* FTP ( File Transfer Protocol )
 - vsftpd(vsftpd는 FTP서버 프로그램 중 하나이다.)
 - FTP command

* root 사용자 로그인 설정
 - 루트 사용자는 원격 로그인을 허용하지 않는 것이 좋다.
 - 일반 사용자로 사용하는것을 권장한다.

* FTP 사용자
1) 리눅스 사용자
 - 리눅스의 사용자와 FTP의 사용자는 동일하다.
 - FTP 서비스를 사용하려면 리눅스 시스템에 사용자 계정이 있어야한다.
 - 홈 디렉터리 : 사용자의 홈 디렉터리

2) 익명 사용자
 - anonymous
 - 패스워드 없이 FTP 서버에 접속이 가능하다.
 -   -A 옵션을 주고 접속한다. (커맨드창에서 접속)
 - 홈 디렉터리 : /var/ftp


* FTP가 데이터를 송/수신 하는 방법
1) Active Mode( 능동모드 )
 - port 21
  - 로그인 인증
  - FTP command전달
 - port 20 ( ftp-data port)
  - 파일 송/수신
  
 ---> PORT 192,168,3,149,246,88
 (해석) IP 192.168.3.149;  256*246 + 88 번 포트
 * 클라이언트는 PORT 명령어를 통하여 서버에게 데이터를 전달할 ip와 port번호를 전달
 * 윈도우에서는 능동모드만 가능하다.
 
 * RETR (이 파일을 전달해줘라!)
2) Passive Mode( 수동모드 )
 - port 21
  - 로그인 인증
  - FTP command 전달
 - port 1024번 이후 포트
  -> 데이터 전달
 ---> PASV
 - PASV 요청을 하면 서버에서 접속할 IP와 포트번호를 알려준다.

이 내용을 한번 직접 확인해보겠다.

먼저 vsftpd로 FTP서버를 실행해준다.




(서버 오픈)



오픈된 것으로 21번 포트가 열려있는 것을 확인 할 수 있다.

윈도우에서 직접 로그인을 해보겠다.
ftp (ftp서버 IP)
로 접속 할 수 있다.




(ftp 서버 접속)



이렇게 접속하면
리눅스 계정으로 접속 한 것이다.

익명 접속도 해보겠다.
익명 접속은 명령어 -A로 접속한다.



(익명 접속)



또, 인터넷브라우저로 접속 할 수 있다.




(브라우저 접속)



* 브라우저 접속은
익명 접속이다.

익명 접속은 /var/ftp/pub 폴더가 홈 디렉터리이다.



(홈 디렉터리 확인)



접속 하는 과정을
와이어샤크로 패킷을 캡쳐해 보았다.



(FTP 패킷)



FTP는 TCP 위에서 동작하므로
TCP의 3 hand shaking 과정을 그대로 가지고 있다.
(확인 가능하다.)

FTP접속할 때 -d 명령어로 디버깅하면서
어떤 명령어가 전달되는지 확인해보겠다.



(FTP 옵션)



(디버깅 접속)



접속 과정을 보니 USER 뒤에 한칸 띄우고 아이디를 입력해서 전송한다.
그리고 암호는 PASS 뒤에 한칸 띄우고 비밀번호를 입력해서 전송한다.

이 과정을 파이썬으로 만들어보겠다.
똑같은 과정으로 로그인 까지 해보는 프로그램을 만들것이다.




(로그인 코드)



(로그인 화면)



잘 접속된 것을 확인 할 수 있다.

이 과정을 진짜 FTP 클라이언트처럼 만들어보겠다.
입력을 받고 로그인 하는 것이다.



(FTP 클라이언트 코드)




(실행 화면)



실행 화면도 잘 이루어졌다.

이번엔 FTP에서 파일을 전송하는 과정을 살펴볼 것이다.

샘플로 아래의 파일을 전송해보겠다.




(sample)



(put 명령어)



파일 전송은
put 명령어를 통해서 이루어진다.

전송 후 서버에서 확인해보겠다.



(확인)



확인해보니
sample파일이 올라가 있는것이 보인다.

이번엔 서버에 있는 파일을 다운로드 받으면서
포트 개방상태를 확인해 보겠다.



(파일 다운로드)



다운로드는 get 명령어를 이용한다.
여기서 실제로 전달되는 명령어인
PORT 192,168,3,149,246,88 을 잘 봐야한다.
아이피 주소 192.168.3.149이고 뒤에 256*246 + 88 번의 포트번호로 전송하라는 명령이다.



(서버의 20번 포트가 열렸다.)



(포트번호 확인)



포트 번호도 계산한 것과 같이 63064번의 포트로 전달되었다.

이것은 능동모드로 20번 포트를 통해 데이터가 전달되는 것을 확인할 수 있다.

이번엔 수동모드를 프로그램으로 만들어서 확인해보겠다.
윈도우에서는 능동모드만 지원하기 때문이다.

수동모드를 확인하기 위해서는
데이터를 받을 프로그램을 따로 작성해야한다.

먼저, 수동모드를 만들어보기전에
능동모드를 구현하고 수동모드로 만들어보겠다.



(데이터 받는 코드)




(실행화면)



(포트 상태)



포트로는 9999를 선택해서 열어주었다. 이쪽으로 데이터가 들어올 것이다.
능동모드에서는 사용할 포트번호를 정해서 보내기 때문에
미리 열어둔 것이다.



(능동모드 코드)





(실행화면)



실행하면
데이터 받는 코드의 실행 화면에서 데이터가 출력되는 것을 확인 할 수 있다.

이번에는 수동모드를 만들어보겠다.

수동모드는 간단하게 PASV 명령만 보내면 알아서 사용할 포트번호를 정해서 보내준다.



(수동 모드)



그렇기 때문에
데이터를 받을 프로그램에 포트번호를 미리 적을 수 없다.
전송하고 부여받은 포트번호를 확인해서
입력해준다.



(포트번호 입력)




(결과 화면)




결과화면은
수동모드에서도 똑같이 데이터를 받을 수 있었다.



+ Recent posts