Ubuntu 24.04에 ftp 서버 설치하기( vsftpd 사용 )

SFTP/SCP가 사실상 표준이 된 지 오래지만, 레거시 임베디드 장비나 구형 소프트웨어 중에는 여전히 FTP만 지원하는 경우가 있고, 외부 노출 없이 내부망에서 간단히 파일을 주고받는 용도로도 FTP는 아직 쓰인다. Ubuntu에서 FTP 서버를 구성할 때 가장 널리 쓰이는 데몬이 vsftpd(very secure FTP daemon)다. 이 글에서는 Ubuntu 24.04에 vsftpd를 설치하고, 사용자 계정을 홈 디렉터리에 chroot로 가둔 뒤 실제로 로그인·업로드·다운로드까지 검증하는 과정을 정리한다.

vsftpd 설치

$ sudo apt install vsftpd
vsftpd is already the newest version (3.0.5-0ubuntu3.1).
0 upgraded, 0 newly installed, 0 to remove and 36 not upgraded.

테스트 환경에는 이미 설치돼 있어 위처럼 나오지만, 처음 설치하는 시스템에서는 패키지 다운로드·의존성 설치 로그가 추가로 출력된다.

FTP 전용 계정 준비

기존 로그인 계정을 그대로 쓰기보다, 셸이 없는 FTP 전용 계정을 만들어 쓰는 게 안전하다. /usr/sbin/nologin은 SSH/로컬 로그인은 막지만 /etc/shells에 등록돼 있어 vsftpd의 PAM 인증(pam_shells.so)은 통과한다.

sudo useradd -m -s /usr/sbin/nologin ftpuser
sudo passwd ftpuser
$ id ftpuser
uid=1001(ftpuser) gid=1001(ftpuser) groups=1001(ftpuser)

설정 파일 구성

/etc/vsftpd.conf를 아래와 같이 구성한다. 익명 로그인은 끄고, 로그인한 사용자는 자신의 홈 디렉터리 밖으로 나가지 못하도록 chroot로 가둔다.

listen=YES
listen_ipv6=NO
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
allow_writeable_chroot=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40100
옵션설명
anonymous_enableNO익명 로그인 차단
chroot_local_userYES로그인한 사용자를 자신의 홈 디렉터리로 제한
allow_writeable_chrootYESchroot 대상 디렉터리에 쓰기 권한이 있어도 vsftpd가 거부하지 않도록 허용
pasv_min_port / pasv_max_port40000-40100패시브 모드 데이터 포트 범위 고정 (방화벽 규칙에 사용)

서비스 적용

sudo systemctl restart vsftpd
sudo systemctl enable vsftpd
$ systemctl is-active vsftpd
active
$ systemctl is-enabled vsftpd
enabled

접속 테스트

먼저 익명 로그인이 실제로 막혀 있는지 확인한다.

$ curl -v --user 'anonymous:anonymous@' ftp://127.0.0.1/
< 220 (vsFTPd 3.0.5)
> USER anonymous
< 331 Please specify the password.
> PASS anonymous@
< 530 Login incorrect.
curl: (67) Access denied: 530

이제 ftpuser 계정으로 로그인해서 디렉터리 목록을 조회한다.

$ curl -v --user 'ftpuser:<PASSWORD>' ftp://127.0.0.1/
< 220 (vsFTPd 3.0.5)
> USER ftpuser
< 331 Please specify the password.
> PASS <PASSWORD>
< 230 Login successful.
> PWD
< 257 "/" is the current directory
> EPSV
< 229 Entering Extended Passive Mode (|||40076|)
> TYPE A
< 200 Switching to ASCII mode.
> LIST
< 150 Here comes the directory listing.
< 226 Directory send OK.

파일을 업로드하고 서버 쪽 실제 경로에서 확인한다.

$ curl --user 'ftpuser:<PASSWORD>' -T hello.txt ftp://127.0.0.1/hello.txt

$ sudo ls -la /home/ftpuser/
total 24
drwxr-x--- 2 ftpuser ftpuser 4096 Jul 27 01:15 .
drwxr-xr-x 4 root    root    4096 Jul 27 00:51 ..
-rw-r--r-- 1 ftpuser ftpuser  220 Mar 31  2024 .bash_logout
-rw-r--r-- 1 ftpuser ftpuser 3771 Mar 31  2024 .bashrc
-rw-r--r-- 1 ftpuser ftpuser   32 Jul 27 01:15 hello.txt
-rw-r--r-- 1 ftpuser ftpuser  807 Mar 31  2024 .profile

업로드한 파일을 다시 받아 내용이 일치하는지 확인하면 왕복 테스트가 끝난다.

$ curl --user 'ftpuser:<PASSWORD>' ftp://127.0.0.1/hello.txt
Mon Jul 27 01:15:13 AM KST 2026

방화벽(패시브 포트) 설정

외부에서 접속해야 한다면 ufw에 제어 포트(21)와 패시브 데이터 포트 범위(40000-40100)를 모두 열어야 한다. 패시브 포트 범위를 빼먹으면 로그인은 되는데 LIST/업로드/다운로드에서만 멈추는 흔한 증상이 나타난다.

sudo ufw allow 21/tcp
sudo ufw allow 40000:40100/tcp

주의사항

  • FTP는 인증 정보와 데이터 모두 평문으로 전송된다. 신뢰할 수 없는 네트워크를 거친다면 SFTP를 쓰거나, vsftpd의 ssl_enable=YES로 FTPS를 구성해야 한다.
  • chroot_local_user=YES 상태에서 chroot 대상 디렉터리(사용자 홈)의 소유자가 해당 사용자 자신이면 vsftpd가 보안상 로그인을 거부한다. allow_writeable_chroot=YES로 우회할 수 있지만, 가능하면 홈 디렉터리를 root 소유의 쓰기 불가 디렉터리로 두고 그 밑에 쓰기 가능한 서브디렉터리를 따로 두는 구성이 더 안전하다.
  • NAT/클라우드 환경에서는 pasv_address에 공인 IP를 명시하지 않으면 패시브 모드 접속이 실패할 수 있다.

마무리

vsftpd 설치부터 chroot 계정 구성, 실제 업로드/다운로드 왕복 테스트까지 확인했다. 평문 프로토콜이라는 한계는 분명하므로, 외부망을 거치는 운영 환경이라면 FTPS나 SFTP로 전환하는 쪽을 우선 검토하는 게 좋다.

참고

답글 남기기