[우분투 팁] vsftpd로 패시브모드 FTPS(FTPES) 서버 구축 – 1

우선 vsftpd로 FTP서버부터 구축(패시브 모드로)해보고(우분투 계정정보를 평문으로 전송하므로 보안에 취약함), 보안은 챙겨야 되니까
다음은 FTPES(보안 FTP) 서버로 전환구축, 그래두 우분투 계정 털릴까봐 불안하니까
마지막으로 vsftpd 가상계정 전환구축하는 것까지 적겠습니다.

글이 길어지면 적정선에서 나눌게요.

 

▲ 우선 시스템을 최신 상태로 유지해야겠죠.

sudo apt-get update
sudo apt-get upgrade

해줍니다. 저는 한번에 처리하도록 입력했어요(스샷 참고).

 

그 다음, 아래처럼 입력하여 vsftpd를 설치해 줍니다.

▲ sudo apt-get install vsftpd

 

▲ 설치 후 sudo service –status-all (또는 sudo service –status-all | grep + ) 이라고 쳐보면 vsftpd 서비스가 실행되고 있음(+표시)을 확인할 수 있을 겁니다. 환경설정 아직 안했는데.;;;

 

▲ sudo netstat -atlpvn 라고 쳐보니까 21번 포트가 vsftpd에 의해 열려 있네요. 기본값으로 21번 포트는 FTP 명령어 송수신에, 20번 포트는 FTP 데이터 송수신에 쓰이게끔 세팅되어 있을테니(액티브 모드 기준)… 데이터를 주고받으면  20번 포트도 열리겠죠?

아무튼, PC가 인터넷 선에 (공유기 없이) 직결되어 있다면 현재 상태는 보안상 안좋으니까 sudo service vsftpd stop 이라고 쳐서 vsftpd 서비스를 중단하시고,
공유기에 PC가 연결돼 있다면 (공유기 방화벽이 막아주니까) 서비스 중지 없이 설정파일 구성 작업을 합니다.
(참고 : 서비스를 시작하려면 sudo service vsftpd start 라고, 작동중인 서비스를 재시작하려면 sudo service vsftpd restart 라고 입력하면 됩니다.)

 

설정파일을 구성해 봅시다. vsftpd 설정파일의 경로는 /etc/vsftpd.conf 입니다.

▲ 수정 전에 vsftpd.conf 파일을 vsftpd-ori.conf 로 백업해두면 좋겠죠(퇴로 확보!). -rp 옵션은 복사할 때 파일의 소유자,그룹자,권한,시간정보 등도 그대로 유지하면서 복사하라는 의미입니다.

 

▲ 이제 진짜로 설정파일을 열고(sudo gedit /etc/vsftpd.conf), 주석이 빠져서 실제로 기능하는 부분의 의미를 대략적으로 느껴봅니다.

 

※ 참고 : [우분투 16.04] VSFTPD 설정파일 매뉴얼 한글번역

 

기본 설정파일에 있는 설정 항목들만 (설명 빼고) 추려봤습니다.

 

listen=NO
listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
secure_chroot_dir=/var/run/vsftpd/empty
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

 

액티브 모드로 FTP가 작동하도록 세팅되어 있습니다.
기본 상태(액티브 모드+SSL 없음)로 써도 상관없다고 생각한다면 그대로 쓰면 되겠습니다.
(#write_enable=YES 의 주석은 풀어줘야 하겠죠.)

그래서 저는 기본 설정을 이렇게 정리하고, 일부 수정하고, 주석 부분을 모두 지웠습니다.
(주의 : “옵션=YES” 처럼 붙여서 적어야 합니다. “옵션 = YES” 처럼 사이를 띄우면 작동이 안 되더군요.)

 

########### 기본 설정(Standalone Mode) ###########
listen=NO
listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
dirmessage_enable=NO
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
secure_chroot_dir=/var/run/vsftpd/empty
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

 

※ 액티브 모드 : 서버가 클라이언트 측에서 열어준 포트로 접근하여 데이터를 넣어줌. => 클라이언트(접속자)가 본인 PC의 방화벽 설정을 잘 해야겠죠? 방화벽이 포트를 막고 있으면 서버가 접근을 못하니까 데이터를 보낼 수 없음.

※ 패시브 모드 : 클라이언트가 서버 측에서 열어준 포트로 접근하여 데이터를 뽑아옴. => 클라이언트(접속자)가 본인 PC 방화벽에 신경쓸 필요가 없겠죠.

액티브 모드와 패시브 모드의 매커니즘과 장단점은 아래 포스팅에서 파악하시면 좋을 듯하고…
https://mintnlatte.tistory.com/407

 

저는 외부망(집 밖)에서 쓸거고, 클라이언트쪽 방화벽 설정을 매번 신경쓰는 게 싫어서 패시브모드 쓸 겁니다.

패시브 모드는 서버 측의 방화벽을 신경써야 한다고 하는데요(vsftpd에서 사용할 포트들을 열어줘야 함),

 

▲ 방화벽 체크는 sudo iptables -L 이나 sudo ufw status verbose 같은 명령어로 할 수 있습니다.
우분투 데스크탑(16.04) 버전은 방화벽이 비활성화되어 있네요? -_-;;

나중에라도 UFW나 iptables 등을 이용해서 방화벽을 구축하는 것을 추천드리고요,
저는 공유기를 쓰고 있으니까 공유기의 방화벽이 어느정도 걸러줄 것으로 믿고, 급한 마음에 방화벽 활성화과정(+vsftpd용 포트 개방) 없이 FTP 패시브모드 세팅을 하겠습니다. 

 

https://mintnlatte.tistory.com/407 포스팅을 보면 “Passive 모드는 두 번째 data포트로 1024 이후의 임의의 포트를 사용한다”고 하는데, 임의의 포트는 1024~65535까지 범위가 무척 넓습니다. 그런데 방화벽에서 1024~65535포트 전체를 풀어줄 수는 없는 노릇이니까… vsftpd는 패시브모드에서 쓰는 포트 범위를 제한할 수 있게끔 설계되어 있습니다.

https://www.yougetsignal.com/tools/open-ports/
위 사이트를 활용해서 본인 인터넷 회선이 풀어준 포트들(1024 이후)을 파악하고, 그 중에서 마음에 드는 범위를 정해 두세요.

그리고 터미널 창에서 sudo gedit /etc/vsftpd.conf 이런 식으로 입력해서 /etc/vsftpd.conf 파일을 열고, 기본 설정 추가 항목들과 패시브모드 설정용 옵션들을 하단에 추가해 줍니다. 나머지 옵션들은 선택적으로 넣으세요.

 

########### 기본 설정 추가 ###########
listen_port=21
utf8_filesystem=YES
user_sub_token=$USER
local_root=/home/$USER(본인이 원하는 경로)
local_umask=022
# local_umask 설정 추가하면서 file_open_mode는 주석처리.
#file_open_mode=0644
tcp_wrappers=YES
ascii_download_enable=NO
async_abor_enable=NO
xferlog_std_format=NO
hide_ids=YES

 

########### 감옥 설정 추가 : local_root 디렉토리에 갇혀서 상위로 못 올라가게 됨. local_root가 없으면 /home/$USER 에 갇힘. ###########
chroot_list_enable=YES
#아래는 감옥 제외자 명단 설정파일 경로입니다. 터미널에서 sudo gedit /etc/vsftpd/vsftpd.chroot_list 친 다음, 한줄에 제외자 계정 하나씩 넣고 저장+빠져나오세요(기본으로 root 를 넣어주면 좋습니다.).
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list
chroot_local_user=YES
allow_writeable_chroot=YES

 

########### 패시브 모드를 위한 설정 ###########
pasv_enable=YES
pasv_min_port=5200
pasv_max_port=5210
#pasv_address=123.123.123.123(본인의 IP주소)
pasv_addr_resolve=YES
pasv_address=jimnong.tistory.com(본인의 DDNS 주소 또는 도메인 주소)

 

이런 식으로요.
저는 5200~5210 포트 범위를 패시브모드 용으로 쓸 겁니다. 공유기의 포트포워딩 설정도 적당히 연결해 주시고요(저는 20,21,5200-5210번 포트를 뚫었겠죠?).
붉은색푸른색 설정 중에서 하나만 쓰면 됩니다. 저는 IP주소 적어놓고 쓰다가(붉은색) DDNS 주소로 바꾸고(부른색), pasv_address 옵션은 주석처리(#)해서 무력화 했네요.

 

“감옥 설정 추가” 항목 중의 주석에 썼듯이, 터미널에서 sudo gedit /etc/vsftpd/vsftpd.chroot_list 친 다음, 한줄에 제외자 계정 하나씩 넣고 저장+빠져나오세요. 제외자가 없으면 빈 파일이라도 만들어 두어야 하는데, 기본으로 root 를 넣어주면 좋습니다. root 계정은 갇혀서 좋을 게 없으니.

 

그리고 기본 설정에

listen=NO
listen_ipv6=YES

이렇게 되어 있었죠? 하나가 YES면 나머지는 반드시 NO여야 하는데, 패시브 모드에서 이대로 놔두면… 파일질라 FTP 클라이언트에서는 “서버가 알 수 없는 주소와 수동형 응답을 보냈습니다. 대신 서버 주소를 사용합니다.” 라는 에러를 뿜지만 접속은 될 겁니다. 하지만 IOS나 안드로이드용 FTP 클라이언트에선 패시브모드 접속이 안되더군요.

그래서~ “기본 설정” 상단 두 줄을

listen=YES
listen_ipv6=NO

라고 바꿔주고, 설정파일 저장 후 빠져나왔습니다.

 

설정파일 변경사항을 반영해야지요.
vsftpd 서비스를 중지했었다면 터미널 창에서(단축키 : Ctrl+Alt+T) sudo service vsftpd start 라고 입력해서 서비스를 시작해 주시고,
vsftpd 서비스가 작동 중이었다면 sudo service vsftpd restart 라고 입력해서 서비스를 재시작해 줍니다.

 

이제 FTP 클라이언트 프로그램으로 접속 테스트해 보세요. listen_port=21 로 설정했었으니까, 외부망 IP주소:21 이런 식으로 접속하면 되겠죠? DDNS 연결+포트포워딩 하셨으면 DDNS주소:포워딩한 포트 형식으로 접속하면 될 테고요.

 

▲ 패시브모드 설정했는데 “나는 꼭 vsftpd 구축한 컴퓨터에서 자체 테스트를 하고 싶다!” 하신다면 vsftpd.conf 파일에서 pasv_address를 localhost로 잠시 바꾸고 시도해보면 됩니다(vsftpd 서비스 재시작 必).

 

본의 아니게 글이 길어졌습니다. 여기서 잠깐 끊고, 다음 글에서 FTPS로 전환하는 방법을 적도록 하겠습니다.

 

[우분투 16.04] vsftpd에서 root 접속시 530 Login incorrect 에러(접속불가) 해결방법

CC BY-NC-ND 4.0