CentOS FTP 서버 구축은 vsftpd 패키지 하나로 끝낼 수 있다. FTP(File Transfer Protocol)는 TCP/IP 네트워크에서 장치 간에 파일을 주고받는 표준 프로토콜로, 서버를 한 번 세워 두면 여러 클라이언트가 파일을 업로드·다운로드할 수 있다. 이 글에서는 CentOS 8에서 vsftpd로 FTP 서버를 구축하는 전 과정을 패키지 설치 → vsftpd.conf 설정 → 계정 권한 → 패시브 모드 → 방화벽·SELinux → 서비스 시작 → 접속 테스트 순서로 정리한다.
목차
FTP 서버란?
FTP 서버는 Windows·macOS·Linux 등 서로 다른 장치 사이에서 파일을 전송하는 소프트웨어이자, FTP 요청을 수신하는 컴퓨터다. 클라이언트는 FTP 서버에서 파일을 내려받을(다운로드) 수도, 서버로 올릴(업로드) 수도 있다. CentOS·RHEL 계열에서 가장 널리 쓰는 FTP 서버 데몬이 바로 vsftpd(Very Secure FTP Daemon)로, 이름처럼 보안과 안정성에 초점을 둔 경량 서버다.
FTP는 명령을 주고받는 21번 포트(제어 채널)와 실제 데이터를 전송하는 데이터 채널을 따로 사용한다. 데이터 채널을 여는 방식에 따라 액티브 모드와 패시브 모드로 나뉘는데, 방화벽·NAT 환경에서는 보통 패시브 모드가 필요하다. 이 부분은 아래에서 따로 다룬다.
FTP 패키지(vsftpd) 설치
먼저 vsftpd가 이미 설치돼 있는지 확인한다. 설치 전이라면 아무것도 출력되지 않는다.
ps -ax | grep vsftpd
yum list installed | grep vsftpd
이어서 다음 명령으로 패키지를 설치한다. root 사용자라면 sudo는 생략해도 된다.
yum -y install vsftpd
설치가 끝나면 아래처럼 Complete! 메시지가 출력되고, 버전을 확인할 수 있다.
# 설치 확인
rpm -qa | grep vsftpd
vsftpd -v
# 출력 예시
vsftpd-3.0.3-35.el8.x86_64
vsftpd: version 3.0.3
vsftpd.conf 핵심 설정
기본 동작 지시어
설정 파일은 /etc/vsftpd/vsftpd.conf다. 수정 전 원본을 백업해 두면 문제가 생겼을 때 되돌리기 쉽다. 먼저 FTP 서버의 동작을 결정하는 핵심 지시어를 이해하고 가자.
# 원본 백업
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
vi /etc/vsftpd/vsftpd.conf
| 지시어 | 권장값 | 의미 |
|---|---|---|
| anonymous_enable | NO | 익명(anonymous) 접속 차단 — 보안상 필수 |
| local_enable | YES | 로컬 리눅스 계정으로 로그인 허용 |
| write_enable | YES | 업로드·삭제 등 쓰기 명령 허용 |
| chroot_local_user | YES | 사용자를 홈 디렉터리에 가둬 상위 경로 접근 차단 |
| listen | YES | IPv4 독립 실행(standalone) 모드 |
| listen_ipv6 | NO | IPv6 리스너 비활성(IPv4만 사용 시) |
접속 제한(chroot) 설정
이 예시에서는 특정 사용자만 상위 디렉터리로 빠져나올 수 있게 허용 리스트(chroot_list)를 쓴다. vsftpd.conf에서 아래 줄을 수정한다. 줄 번호는 vi에서 :set nu로 표시할 수 있다.
anonymous_enable=NO # (기본 YES → NO)
chroot_list_enable=YES # 주석(#) 해제
chroot_list_file=/etc/vsftpd/chroot_list # 주석(#) 해제
listen=YES # (기본 NO → YES)
listen_ipv6=NO # (기본 YES → NO)
chroot_list_enable와 chroot_list_file 주석을 해제하면 지정한 파일에 적힌 계정만 chroot 제한에서 예외가 된다. 이제 그 파일을 만들어 허용할 계정을 적는다. 실습에서는 root를 사용했다.
vi /etc/vsftpd/chroot_list
# 파일 내용 (한 줄에 계정 하나)
root
root 계정 접속 허용
기본적으로 root는 FTP 접속 거부 목록에 들어 있다. root로 접속하려면 아래 두 파일에서 root 줄을 지우거나 주석 처리한다.
vi /etc/vsftpd/ftpusers # 목록에서 root 줄 삭제
vi /etc/vsftpd/user_list # 목록에서 root 줄 삭제
![[리눅스] FTP 서버 CentOS 8 에서 구축 user_list에서 root 계정 제거](https://nuschool.cc/wp-content/uploads/2024/10/image-39.png)
▲ user_list에서 root 줄 제거
다만 운영 환경에서는 root 직접 접속은 권장하지 않는다. 보안을 위해 FTP 전용 일반 계정을 만들어 사용하는 편이 안전하다. 아래처럼 전용 계정을 만들고 그 계정으로 접속하면 된다.
# FTP 전용 계정 생성 예시
useradd ftpuser
passwd ftpuser
패시브 모드(Passive Mode) 설정
FileZilla·WinSCP 같은 클라이언트나 방화벽·공유기(NAT) 뒤의 서버에서는 대개 패시브 모드가 필요하다. 액티브 모드는 서버가 클라이언트로 데이터 연결을 여는데, 클라이언트 쪽 방화벽이 이를 막기 때문이다. 패시브 모드는 반대로 서버가 일정 범위의 포트를 열어 두고 클라이언트가 그 포트로 접속하게 한다.
vsftpd.conf 맨 아래에 다음을 추가한다.
pasv_enable=YES
pasv_min_port=10000
pasv_max_port=10100
이렇게 하면 데이터 전송에 10000~10100 포트를 사용한다. 뒤의 방화벽 단계에서 이 범위도 함께 열어 줘야 파일 전송이 정상 동작한다.
방화벽과 SELinux 설정
firewalld 포트 개방
외부 접속을 위해 FTP 서비스(21번)와 패시브 포트 범위를 방화벽에서 허용한 뒤 다시 로드한다.
firewall-cmd --permanent --add-service=ftp
firewall-cmd --permanent --add-port=21/tcp
firewall-cmd --permanent --add-port=10000-10100/tcp # 패시브 포트 범위
firewall-cmd --reload
# 적용 확인
firewall-cmd --list-all
![[리눅스] FTP 서버 CentOS 8 에서 구축 firewall-cmd로 FTP 포트 허용](https://nuschool.cc/wp-content/uploads/2024/10/image-40.png)
SELinux 설정
SELinux는 커널 수준에서 접근을 통제해 애플리케이션 취약점을 통한 침해를 막는 보안 모듈이다. 실습 편의를 위해 끄는 방법과, 운영 환경에서 권장하는 방법을 함께 정리한다.
(실습) SELinux 비활성화 — /etc/selinux/config에서 SELINUX=enforcing을 disabled로 바꾸고 재부팅한다.
vi /etc/selinux/config
# SELINUX=enforcing → SELINUX=disabled
![[리눅스] FTP 서버 CentOS 8 에서 구축 SELinux를 disabled로 변경](https://nuschool.cc/wp-content/uploads/2024/10/image-41.png)
(운영 권장) SELinux를 켠 채 FTP 허용 — SELinux를 끄지 않고 아래 불(boolean)만 켜면 보안을 유지하면서 FTP를 쓸 수 있다.
setsebool -P ftpd_full_access on
# 홈 디렉터리 접근만 필요하면:
setsebool -P ftp_home_dir on
FTP 서비스 시작과 접속 테스트
모든 설정을 마쳤으면 systemctl로 vsftpd를 시작하고, 부팅 시 자동 실행되도록 등록한 뒤 상태를 확인한다.
systemctl start vsftpd
systemctl enable vsftpd
systemctl status vsftpd
![[리눅스] FTP 서버 CentOS 8 에서 구축 vsftpd 서비스 active(running) 상태](https://nuschool.cc/wp-content/uploads/2024/07/image-14.png)
상태가 active (running)이면 정상이다. 마지막으로 같은 서버 또는 다른 PC에서 접속을 테스트한다.
# 로컬에서 빠른 확인 (21번 포트 응답 확인)
ftp localhost
# 또는
curl -v ftp://localhost --user ftpuser:비밀번호
외부 PC라면 FileZilla 등에서 호스트=서버IP, 포트=21, 암호화=명시적 FTP over TLS(또는 일반 FTP), 사용자/비밀번호를 입력해 접속한다. 접속이 안 되면 ① 방화벽 포트(21 + 패시브 범위) ② SELinux ③ vsftpd.conf의 pasv_* 설정을 순서대로 점검하면 대부분 해결된다.
정리
지금까지 CentOS 8에서 vsftpd로 FTP 서버를 구축하는 과정을 정리했다. 핵심 순서는 vsftpd 설치 → vsftpd.conf 설정(익명 차단·로컬 허용·chroot) → 패시브 모드 → 방화벽·SELinux 개방 → 서비스 시작 → 접속 테스트다. 특히 방화벽 뒤 환경이라면 패시브 포트 범위 개방이 빠지면 “접속은 되는데 목록·전송이 멈추는” 증상이 생기니 꼭 확인하자.
참고로 CentOS 8은 2021년 12월로 공식 지원이 종료됐다. 새로 구축한다면 CentOS Stream 9, Rocky Linux, AlmaLinux 같은 RHEL 호환 배포판을 쓰는 것이 좋으며, 위 vsftpd 설정 방식은 이들 배포판에서도 거의 그대로 적용된다. 같은 CentOS 환경에서 웹 서버가 필요하다면 APM(Apache·PHP·MariaDB) 구축 글도 함께 참고하면 좋다.



💬 댓글 0