서버에 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