FTP 는 파일공유를 위한 가장 기본적인
프로토콜 중 하나이다.
윈도우 든 리눅스 든 기본적으로 제공하기때문에
쉽게 사용할 수 있다.
기본으로 제공되는 FTP 서비스 외에도
파일질라, vsftp 등 은 더 다양한 기능을 제공한다.
다만 생각보다 환경 구축 과정이 초보에게는
어렵거나 귀찮을 수 있다.
그런 사람들을 위해 docker로 FTP 서버
만드는 방법을 소개하겠다.
우선 사용할 이미지를 골라야한다.
fauria/vsftpd라는 이미지를
많은 사람들이 사용하고 있다.
vsftpd는 Very Secure FTP Daemon의
약자에 나와있듯이 보안이 강화되었다.
pure-ftpd도 많은 유저들이 사용중이니
살펴보고 골라서 사용하면 된다.
사실 둘다 워낙 유명한 데몬이다보니
어떤 이미지를 골라도 크게 차이 나지 않는다.
이를 기반으로 docker-compose.yml을
작성해보면 다음과 같다.
version: '3' services: vsftpd: image: fauria/vsftpd container_name: vsftpd environment: - FTP_USER=아이디 - FTP_PASS=비밀번호 - PASV_MIN_PORT=21100 - PASV_MAX_PORT=21110 - PASV_ADDRESS=접속주소 - PASV_ADDR_RESOLVE=YES ports: - 0.0.0.0:ftp포트:20 - 0.0.0.0:ftp포트2:21 - 0.0.0.0:21100-21110:21100-21110 volumes: - 공유경로:/home/vsftpd/아이디:rw - ./log/vsftpd:/var/log/vsftpd
한글로 적은 것은 직접 입력해야한다.
Active모드에서 21포트로 연결되면 서버측에서
클라이언트로 20포트로 데이터를 전송한다.
보안측면에서는 더 안전할 수 있지만
클라이언트 방화벽에 의해 차단될 가능성이 있다.
Passive모드에서는 데이터를 받을 때도
클라이언트가 서버에 접속하기때문에
방화벽 문제가 생기지 않는다.
PASV_ADDRESS는 서버의 IP를 적어도 되고
본인이 사용중인 도메인을 적어도 된다.
ftp포트는 많은 해커들이 노리고 있기때문에
꼭 20,21 이외의 포트번호를 지정하길 바란다.
내부 20포트에 해당하는 포트는 서버에서 클라이언트로
접속하는 것이기때문에 포트포워딩 하지 않아도 된다.
volume에 절대경로를 사용해도 되고
상대경로를 사용해도 상관없다.
예를들어 외장하드에 Transmission으로 받은 파일을
공유하기 위해 /mnt/xxx 로 지정했다.
FTP 주의사항
이전글에도 적었듯이 Transmission Docker와
FTP docker는 동시에 사용할 수 없다.
오늘 소개한 이미지의 단점은
멀티유저사용이 까다롭다.
다음과 같은 방법으로 멀티유저 사용이 가능하다.
docker exec -i -t vsftpd bash mkdir /home/vsftpd/아이디 echo -e "아이디\n비밀번호" >>/etc/vsftpd/virtual_users.txt /usr/bin/db_load -T -t hash -f /etc/vsftpd/virtual_users.txt /etc/vsftpd/virtual_users.db exit docker restart vsftpd
vsftpd의 bash에 들어가서 수동으로 virtual user를
추가하는 방법이다.
다만 위의코드대로 수행하면 원본 아이디와
별도의 폴더를 공유하게 된다.
같은 폴더를 공유하게 하려면 다음과 같은 경로를
docker-compose.yml의 volume에 추가하면 된다.
공유경로:/home/vsftpd/추가아이디:rw
잘 추가되었는지 보려면 다시 bash에 들어가
db_dump -d a /etc/vsftpd/virtual_users.db | grep len
라는 명령어를 쳐보면 된다.
추가한 사용자를 삭제하기 위해서는 virtual_users.txt에서
추가아이디와 비밀번호를 삭제한후 db_load 해주면 된다.
이해가 잘 안간다면 멀티유저를 지원하는
다른 이미지를 사용하길 바란다.
이런 종류의 방범은 db가 볼륨에 저장되지 않기때문에
docker-compose.yml을 이용해 다시 켤 경우
virtual_users.db가 원복된다는 점이 문제다.
이런 경우 유저를 추가하기보단 yml 파일에서
아이디와 비번을 공용으로 바꾸는것이 더 간편하다.
관련글