리눅스에서 vsftpd로 FTP 서버 설치·설정

조회수 27

서버에 FTP를 구성할 때 vsftpd를 설치하고 로컬 유저만 사용하는 설정을 정리한 내용이다. 유저 생성, 홈 디렉터리 권한, vsftpd.conf 전체 교체 방법과 PASV 포트·공인 IP 설정을 포함한다.

1. FTP 전용 유저 생성

시스템 유저를 하나 생성하고 비밀번호를 설정한 뒤, 해당 유저의 홈 디렉터리 권한을 711로 설정한다. 711이면 해당 유저만 진입 가능하고 타 유저는 접근할 수 없어, FTP 전용 계정을 둘 때 자주 사용하는 방식이다.

useradd [id]
passwd [id]
chmod 711 /home/[id]

[id] 자리에 실제 사용할 계정 이름을 넣는다.

2. yum 업데이트

yum update

필요 시 -y 옵션을 붙여 비대화형으로 실행해도 된다.

3. vsftpd 설치

yum install vsftpd

CentOS·RHEL·Amazon Linux 계열에서 사용하는 패키지 이름이다.

4. vsftpd.conf 수정

설정 파일 경로는 /etc/vsftpd/vsftpd.conf이다. 기존 내용을 전부 삭제한 뒤 아래 설정으로 통째로 교체하는 방식을 사용할 수 있다. vi 사용 시 맨 위로 이동(gg 또는 1G)한 뒤 dG로 현재 줄부터 파일 끝까지 삭제한 다음 아래 내용을 붙여 넣는다.

vi /etc/vsftpd/vsftpd.conf

vi에서 첫 줄로 가는 것은 gg 또는 1G, 현재 줄부터 끝까지 삭제는 dG이다.

이어서 아래 내용으로 채운다. pasv_address는 공인 IP가 고정일 때만 설정하고, 유동 IP이면 맨 앞에 #을 붙여 주석 처리한다.

listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=000
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
allow_writeable_chroot=YES
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=10090
pasv_max_port=10100
pasv_address=공인아이피

요약하면, 익명 접속 비활성화(anonymous_enable=NO), 로컬 유저만 허용·쓰기 허용, 홈 디렉터리 이탈 방지(chroot, chroot_local_user=YES), chroot 내 쓰기 허용(allow_writeable_chroot=YES), PASV 포트 10090~10100 지정이다. SSL은 비활성(ssl_enable=NO)으로 두고, 필요 시 인증서 경로를 설정하여 활성화할 수 있다.

5. vsftpd 기동

systemctl start vsftpd
systemctl enable vsftpd

enable을 해 두면 재부팅 후에도 자동으로 기동된다. 상태 확인은 systemctl status vsftpd로 한다.

6. 방화벽에서 FTP·PASV 포트 개방

21번 포트와 PASV 구간(10090~10100)을 열어야 외부에서 접속할 수 있다.

# firewalld 사용 시
firewall-cmd --permanent --add-service=ftp
firewall-cmd --permanent --add-port=10090-10100/tcp
firewall-cmd --reload

7. 자주 발생하는 문제와 대처

chroot 사용 시 로그인 후 업로드·쓰기가 되지 않는 경우

chroot_local_user=YES만 두고 allow_writeable_chroot=YES가 없으면, 보안상 홈 디렉터리가 쓰기 불가로 설정되어 업로드나 파일 생성이 되지 않을 수 있다. allow_writeable_chroot=YES를 추가한 뒤 vsftpd를 재시작하면 쓰기가 가능해진다.

PASV 모드에서 연결 끊김 또는 타임아웃

클라이언트가 PASV로 접속할 때 서버가 알려 준 IP·포트로 연결하는데, NAT 뒤에 있거나 유동 IP인데 pasv_address를 맞추지 않으면 클라이언트가 잘못된 IP로 접속을 시도하여 실패한다. 공인 IP가 고정이면 pasv_address=공인IP를 설정하고, 유동이면 주석 처리하거나 스크립트로 동적 설정한다. pasv_address를 공인 IP로 맞추면 PASV 연결이 정상 동작한다.

방화벽 미개방으로 21번은 되는데 목록·전송이 되지 않는 경우

21번만 열고 pasv_min_port~pasv_max_port 구간을 열지 않으면, 명령 채널은 되는데 디렉터리 목록이나 전송이 실패하는 경우가 있다. 위와 같이 10090~10100 tcp를 개방하면 해결할 수 있다.

SELinux로 인해 vsftpd가 홈 디렉터리에 접근하지 못하는 경우

SELinux가 활성화되어 있으면 vsftpd가 유저 홈 디렉터리 읽기를 차단할 수 있다. getenforce가 Enforcing이면 setsebool -P ftp_home_dir 1을 시도하거나, 로그를 확인하며 필요한 컨텍스트를 설정한다. ftp_home_dir 불리언을 1로 설정하면 접속이 가능해진다.

한 줄 요약

useradd·passwd·홈 711 → yum update·vsftpd 설치 → vsftpd.conf 교체(anonymous NO, local·write·chroot·allow_writeable_chroot·PASV 포트·pasv_address) → systemctl start·enable vsftpd → 방화벽 21·PASV 포트 구간 개방. chroot 내 쓰기 불가 시 allow_writeable_chroot, PASV 미동작 시 pasv_address·방화벽 확인.

댓글 0

  • 첫 번째 댓글을 남겨보세요.