Date : 2024. 07. 29
목차
1. 개요
File Transfer Protocol 은 TCP/IP 프로토콜로 파일을 전송하기 위한 프로토콜이다.
ftp는 일반적으로 21번, 20번 포트를 동시에 사용하며, 21번 포트를 통해 명령을 전달하고, 다른 포트에서는 데이터를 전송하는 형태의 통신을 수행한다.
이 가이드에서는 다음과 같이 FTP 서버를 구축하는 방법을 안내한다.
1. 임의의 VM에 FTP 서버 구축
2. FTP 계정 생성 : 각 사용자들은 /home 경로 내의 자기 자신의 사용자 경로만 ftp 접근 허용
3. FTP 계정 외 익명의 계정 사용자의 접근 제한
4. root 사용자가 아닌 FTP 계정 사용자들은 SSH 접속이 불가능
5. FTP는 Active 모드에서 동작
6. iptables로 방화벽 설정 : 허용된 특정 IP에서만 FileZilla로 FTP 접속 가능
여기서 설명을 덛붙이자면 FTP에는 액티브(Active) 모드와 패시브(Passive) 모드가 있다.
액티브 모드
클라이언트에서 FTP 21번 포트로 접속을 시도하고, 사용할 두 번째 포트(20번)를 서버에 알려준다.
그러면 서버는 ACK로 응답하고 서버의 20번 포트는 클라이언트가 알려준 두 번째 포트로 접속을 시도하고, 마지막으로 클라이언트가 ACK로 응답한다.
패시브 모드
로그인은 능동모드와 동일한 절차를 거쳐 로그인한다. 서버의 21번 포트로 접속을 하게 되고 서버는 승인한다.
데이터 전송시에는 능동모드와 달리 서버 쪽에서 알려준 임의포트와 연결하여 데이터를 송수신하게 된다.
즉, 액티브 모드냐 패시브 모드냐는 20번 혹은 ftp 구성 파일에서 설정한 포트를 통해 클라이언트에 접속하냐 서버측에서 알려준 데이터 포트를 통해 클라이언트에서 접속하냐로 결정된다.
패시브 모드는 액티브 모드보다 나중에 등장했다.
등장한 이유는 서버가 클라이언트에 접속을 시도하는 비정상적인 능동모드에 대한 문제점을 해결하기 위해서 수동모드가 등장했다.
구축 환경
Flexcloud VM
Ubuntu-22.04.03-LTS-x86_64
vsftpd 패키지 사용
2. vsftpd를 통한 FTP 서버 구축
vsftpd는 많은 리눅스 배포판에서 제공되는 기본 FTP 서버 패키지이다.
개요에서 설명하였듯 vsftpd 패키지로 FTP를 구축하고 FileZilla로 파일을 업로드 한다.
vsftpd 패키지 설치
$ apt update
$ apt install vsftpd -y
FTP 사용자 생성
사용자 생성
# 사용자 jhs 추가
# adduser jhs
Adding user ` jhs...
Adding new group ` jhs (1004) ...
Adding new user ` jhs (1004) with group ` jhs...
Creating home directory `/home/ jhs...
Copying files from `/etc/skel' ...
New password: ß 패스워드 입력
Retype new password: ß 패스워드 확인 입력
passwd: password updated successfully
Changing the user information for jhs
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] y 입력 후 엔터
root@localhost:~#
나머지 yjj, smh 사용자도 같은 방식으로 추가해 준다
각 사용자의 /home 하위 디렉토리에 대해 사용자들에게 소유권 부여
$ chown -R yjj:yjj /home/yjj
$ chown -R jhs:jhs /home/jhs
$ chown -R smh:smh /home/smh
vsftpd.conf 에서의 허용 규칙 설정
/etc/ 디렉토리에는 일반적인 서비스들의 config 파일들이 포함된다.
/etc/vsftpd.conf 파일을 편집하여 vsftpd의 서비스 규칙을 설정할 수 있다.
본 가이드에서는 설정파일을 다음과 같이 설정한다.
– ftp는 active 모드로 동작
– 생성한 사용자들이 FTP만 사용 가능하도록 설정
– FTP 사용자 외 나머지 익명의 사용자들에 대한 접근 제한
$ vi /etc/vsftpd.conf
# 기본 설정
listen=YES
listen_ipv6=NO
# 익명 접속 차단
anonymous_enable=NO
# 로컬 사용자 접속 허용
local_enable=YES
# 쓰기 권한(파일 업로드) 허용
write_enable=YES
# chroot 설정으로 사용자들을 자신의 홈 디렉토리로 제한
chroot_local_user=YES
#쓰기 권한 허용
allow_writeable_chroot=YES
# PAM 설정 파일 지정
pam_service_name=vsftpd
# 활성 모드 데이터(파일) 포트(20번)
connect_from_port_20=YES
# UTF-8 지원
utf8_filesystem=YES
vsftpd를 리스타트해서 변경사항을 적용한다.
$ systemctl restart vsftpd
3. FTP 서버 파일 전송 테스트
플렉스 클라우드의 FTP 서버 공인 IP는 210.122.10.52다.
생성한 사용자 jhs, yjj, smh 중 jhs 계정으로 접속을 테스트한다.

호스트(H)에 서버 IP 주소를 입력하고 사용자 계정과 비밀번호를 입력한다. 포트는 21번 포트를 사용한다.
빠른 연결(O)을 클릭한다.

FTP 디렉토리에 들어왔다. 개요에서 설명한 대로 FTP 사용자는 자신에게 허가된 디렉토리 /home/jhs에만 FTP로 접속할 수 있고, 다른 디렉토리로도 접근할 수 없다.

로컬 데스크톱 바탕화면에 test용 텍스트 파일 2개를 생성하고 서버에 업로드 한다.

ROOT 사용자로 CLI 창에 접속하여 파일이 /home/jhs 디렉토리에 업로드가 잘 되었는지도 확인했다.
FTP를 구축하기 위해서는 방화벽에서 20, 21번 포트가 열려있어야 한다. 또 전송되는 파일을 암호화하는 SFTP 프로토콜도 있는데, 이건 SSH와 같이 22번 포트를 열어주면 된다.
Reference