OpenWrt에 vsftpd 설치

ftp server는 계륵같은 존재다. 공유기에 화일을 전송하거나 받을 경우 scp를 사용하면 되니 굳이 필요하지 않다. 그것도 아주 아주 가끔 있는 일이다. 하지만 OpenWrt 를 간이 NAS로 활용하거나 토런트로 다운받은 영상을 밖에서 핸드폰이나 다른 장치로 재생하고 싶을때 사실 ftp만큼 편한게 없어 vsftpd를 설치해 보았다.

사전준비

사용자 계정 생성

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 암호화 방식을 선택

참고

Comments

No comments yet. Why don’t you start the discussion?

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

  ×  1  =  5