ftp server는 계륵같은 존재다. 공유기에 화일을 전송하거나 받을 경우 scp를 사용하면 되니 굳이 필요하지 않다. 그것도 아주 아주 가끔 있는 일이다. 하지만 OpenWrt 를 간이 NAS로 활용하거나 토런트로 다운받은 영상을 밖에서 핸드폰이나 다른 장치로 재생하고 싶을때 사실 ftp만큼 편한게 없어 vsftpd를 설치해 보았다.
사전준비
- usb를 사용하기 위한 usb 저장장치 마운트 는 여기를 참고
- 토런트 사용위한 transmission 설치 는 여기를 참고
사용자 계정 생성
root로도 ftp에 로그인 할 수 있으나 보안을 위해 따로 ftp를 사용할 로컬사용자 계정을 하나 생성한다. 여기서 새로이 생성할 신규 사용자 이름은 ftpuser 이며 /etc/passwd, /etc/group, /etc/shadow 화일을 편집해 사용자를 만들고 따로 패스워드 설정 및 홈디렉토리를 생성해 준다.
참고) OpenWrt는 기본적으로 사용자 추가을 위한 useradd 명령이 없다. useradd 명령을 사용해 사용자 추가를 원할 경우 따로 패키지를 설치해야 한다.
echo "ftpuser:x:1001:1001:ftpuser:/mnt/sda1/ftp:/bin/false" >> /etc/passwd
echo "ftpuser:x:1001:ftpuser" >> /etc/group
echo "ftpuser:x:0:0:99999:7:::" >> /etc/shadow
passwd ftpuser
cat /etc/passwd | grep ftpuser
cat /etc/shadow | grep ftpuser
mkdir /mnt/sda1/ftp
chown ftpsuer.ftpuser /mnt/sda1/ftp
[email protected]:~# echo "ftpuser:x:1001:1001:ftpuser:/mnt/sda1/ftp:/bin/false" >> /etc/passwd [email protected]:~# echo "ftpuser:x:1001:ftpuser" >> /etc/group [email protected]:~# echo "ftpuser:x:0:0:99999:7:::" >> /etc/shadow [email protected]:/etc# passwd ftpuser Changing password for ftpuser New password: Retype password: passwd: password for ftpuser changed by root [email protected]:/etc# cat /etc/passwd | grep ftpuser ftpuser:x:1001:100:ftpuser:/mnt/sda1/ftp:/bin/false [email protected]:/etc# cat /etc/shadow | grep ftpuser ftpuser:$1$UT3.2ahW$Mg66OeNJ2.zhgExHEDDDD/:19030:0:99999:7::: [email protected]:/etc# mkdir /mnt/sda1/ftp [email protected]:/etc# chown ftpsuer.ftpuser /mnt/sda1/ftp
vsftpd 설치
opkg update
opkg install vsftpd-tls
vsftpd 설정
ftp를 사용할 수 있는 사용자 "ftpuser" 를 /etc/vsftpd/vsftpd.users 에 기입해준다. 아래 설정은 etc/vsftpd/vsftpd.users 에 사용자 목록이 없으면 ftp를 로그인할 수 없다.
echo "ftpuser" > /etc/vsftpd/vsftpd.users
/etc/vsftpd.conf 하나 하나의 옵션에 대한 자세한 설명은 아래 참고의 사이트에서 확인할 수 있으며 서버의 설정 기본 방향은 다음과 같음
- explicit tls
- ftp 서비스 포트 : 52121
- ftp 데이터 전송 포트 : passive 모드일 경우 52021~52120 , active 모드일 경우 52020
- passive 모드, active 모드 선택해 접속 가능 (이상하게 모바일앱 solid explorer에서 active 모드일 경우 화일 리스트가 보이지 않았다. 이유를 모르겠음)
- 익명사용자 접속 불가
- 로컬 사용자 접속가능 하지만 /etc/vsftpd/vsftpd.users 에 등록된 사용자만 ftp 접속 가능
- 로컬 사용자는 로그인시 local_root 설정에 따라 /etc/passwd에 등록된 홈 디렉토리가 아닌 /mnt/sda1/transmission/done 를 홈 디렉토리로 한다.
- 본 예시의 인증서는 Let's Encrypt 인증서를 활용하였으나 설정화일내 예시처럼 자체 인증서 생성해 사용 할 수 있다. 또는 vpn 사용을 위한 인증서를 만들었다면 그걸 사용해도 좋다.
vi /etc/vsftpd.conf
background=YES listen=YES listen_port=52121 #implicit_ssl=YES #listen_port=990 connect_from_port_20=YES ftp_data_port=52020 pasv_enable=YES pasv_min_port=52021 pasv_max_port=52120 #pasv_address=myhost.duckdns.org #pasv_addr_resolve=YES local_root=/mnt/sda1/transmission/done max_clients=4 max_per_ip=4 use_localtime=NO anonymous_enable=NO local_enable=YES userlist_enable=YES userlist_deny=NO userlist_file=/etc/vsftpd/vsftpd.users write_enable=YES local_umask=022 check_shell=NO hide_ids=YES ascii_upload_enable=YES ascii_download_enable=YES chroot_local_user=YES allow_writeable_chroot=YES #dirmessage_enable=YES #ftpd_banner=Welcome to blah FTP service. session_support=NO syslog_enable=YES xferlog_enable=YES xferlog_file=/var/log/vsftpd.log #xferlog_std_format=YES ### ### TLS/SSL options ### example key generation: openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/vsftpd/vsftpd_privkey.pem -out /etc/vsftpd/vsftpd_cert.pem -subj /C="DE"/ST="Saxony"/L="Leipzig"/CN="OpenWrt" ssl_enable=YES allow_anon_ssl=NO force_local_data_ssl=NO force_local_logins_ssl=YES ssl_tlsv1=YES ssl_sslv2=NO ssl_sslv3=NO rsa_cert_file=/etc/acme/myhost.duckdns.org_ecc/fullchain.cer rsa_private_key_file=/etc/acme/myhsot.duckdns.org_ecc/myhost.duckdns.org.key require_ssl_reuse=NO ssl_ciphers=HIGH
방화벽 설정
vi /etc/config/firewall
... config rule option name 'Allow-ftp' option src 'wan' option proto 'tcp' list dest_port '52121' list dest_port '52020-52120' option extra '-m conntrack --ctstate NEW' option target 'ACCEPT' option enabled '1' ...
서비스 재시작
/etc/init.d/vsftpd restart
/etc/init.d/firewall restat
vsftpd.conf 설정 간단설명
background=YES # 백그라운드 프로세스 사용여부(listen mode) listen=YES # 단독실행 여부 listen_port=52121 # 단독실행시 ftp 수신대기 포트 #implicit_ssl=YES # implicit_ssl 사용여부 #listen_port=990 # implicit 사용시 포트 번호 connect_from_port_20=YES # active 모드일 경우 ftp-data(20) 사용여부 ftp_data_port=52020 # active 모드일 경우 ftp-data 포트 pasv_enable=Yes # passive 모드 사용여부 pasv_min_port=52021 # passive 모드 데이터 전송 포트 최소 번호 pasv_max_port=52120 # passive 모드 데이터 전송 포트 최대 번호 #pasv_address=myhost.duckdns.org # ftp 서버가 공유기 하단에 있을 경우 필요 #pasv_addr_resolve=YES # ftp 서버가 공유기 하단에 있을 경우 필요 local_root=/mnt/sda1/transmission/done # 로컬계정 사용자의 홈 디렉토리 변경(override) max_clients=4 # 최대 접속 허용수 max_per_ip=4 # 한 아이피당 접속 허용수 use_localtime=NO # 서버시간으로 사용(YES일 경우 filezilla 사용시 시간 동기화가 안되서 NO로 설정) anonymous_enable=NO # 익명 접속 허용 여부 local_enable=YES # 로컬계정 사용자들 접속 허용 여부 userlist_enable=YES # 명시된 사용자만 로그인 허용 userlist_deny=NO # 명시된 사용자 접속 불가 여부 (NO로 설정시 명시된 사용자만 접속가능, YES로 지정시 명시된 사용자만 접속 불가) userlist_file=/etc/vsftpd/vsftpd.users # 명시된 사용자를 읽어올 파일 write_enable=YES # 쓰기권한 허용여부 local_umask=022 # 로컬계정 사용자들의 umask 값 정의 check_shell=NO # 쉘 체크(non PAM vsftpd) hide_ids=YES # 디렉토리 목록에서 UID를 숨길지 설정 ascii_upload_enable=YES # ASCII 파일 업로드 가능여부를 설정 ascii_download_enable=YES # ASCII 파일 다운로드 가능여부를 설정 chroot_local_user=YES # 홈 디렉토리 위로 이동 제한 여부 설정 allow_writeable_chroot=YES # 홈 디렉토리내 write가 가능하도록 허가 #dirmessage_enable=YES # 디렉토리 이동시 각 디렉토리 메시지 보여지게 할지 여부 #ftpd_banner=Welcome to blah FTP service. # FTP 접속자에게 보여줄 환영 메시지 설정 session_support=NO # 로그엔 세션 유지 여부 syslog_enable=YES # syslogd 데몬을 이용해서 로그를 기록 설정 xferlog_enable=YES # 전송(업로드와 다운로드)에 대한 로그기록 여부 xferlog_file=/var/log/vsftpd.log # 전송 로그파일의 위치 #xferlog_std_format=YES # 로그파일에 남길 로그파일의 포맷 지정 ### ### TLS/SSL options ### example key generation: openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/vsftpd/vsftpd_privkey.pem -out /etc/vsftpd/vsftpd_cert.pem -subj /C="DE"/ST="Saxony"/L="Leipzig"/CN="OpenWrt" ssl_enable=YES # ssl/tls 사용여부 allow_anon_ssl=NO # 익명사용자의 ssl을 통한 보안접속을 지원여부 force_local_data_ssl=NO # 로컬사용자 데이터 전송시 ssl 연결을 강제 여부 force_local_logins_ssl=YES # 로컬사용자 로그인시 ssl 연결을 강제 여부 ssl_tlsv1=YES # tls를 사용할 것인지에 대해 설정 ssl_sslv2=NO # ssl v2 프로토콜 연결을 허용 ssl_sslv3=NO # ssl v3 프로토콜 연결을 허용 rsa_cert_file=/etc/acme/myhost.duckdns.org_ecc/fullchain.cer rsa_private_key_file=/etc/acme/myhost.duckdns.org_ecc/myhost.duckdns.org.key require_ssl_reuse=NO # ssl 세션 재사용 ssl_ciphers=HIGH # ssl 암호화 방식을 선택