ftpサービスとしてvsftpdをお使いの方も多いかと思いますが、vsftpd.confで
listen=YES
pasv_addr_resolve=YES
pasv_address=kamikopanda.ddns.net
こんな感じでftpサービスをdnsでアクセスできるようにしていると、IPアドレスが変更された際にパッシブモードでアクセスできなくなる。vsftpdのプロセスが一度解決した名前は、再解決しないことが原因です。対策は、listen=NOとしてxinetdでアクセスの都度vsftpdが起動されるようにすることです。その対策を実施したのが下記。
FROM alpine
COPY startup.sh /
CMD ["/bin/sh","/startup.sh"]
version: "3.5"
services:
ftp:
build: .
container_name: ftp
hostname: ftp
networks:
- shared
volumes:
- /etc/localtime:/etc/localtime
- ../../letsencrypt:/etc/letsencrypt
- ./libpam-pwdfile.zip:/tmp/libpam-pwdfile.zip
- ./vsftpd.conf:/etc/vsftpd/vsftpd.conf
- ./passwd:/etc/vsftpd/passwd
- ./xinetd.conf:/etc/xinetd.conf
- ./vsftpd:/etc/pam.d/vsftpd
- /mnt/disk/ftp:/mnt/disk/ftp
- ../log:/var/log
privileged: true
ports:
- "20:20"
- "21:21"
- "990:990"
- "60000-60030:60000-60030"
restart: always
networks:
shared:
external: true
#!/bin/sh
cd /tmp
apk add --update build-base git linux-headers bsd-compat-headers
wget https://downloads.sourceforge.net/project/libtirpc/libtirpc/1.2.6/libtirpc-1.2.6.tar.bz2
tar xvjf libtirpc*.tar.bz2
cd libtirpc*
./configure --enable-static --disable-gssapi
make
make install
cd ..
git clone https://github.com/xinetd-org/xinetd
cd xinetd
CFLAGS="-s -I/usr/include/tirpc" CPPFLAGS="-DHAVE_RLIM_T" ./configure
LDFLAGS="-Wl,-Bstatic -ltirpc -Wl,-Bdynamic" make
make install
cd ..
apk --update add vsftpd apache2-utils build-base linux-pam-dev
touch /etc/vsftpd/chroot_list
touch /etc/vsftpd/deny_user
cd /tmp
unzip libpam-pwdfile.zip
cd libpam-pwdfile
make install
xinetd
tail -f /dev/null
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=000
dirmessage_enable=NO
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=NO
log_ftp_protocol=YES
dual_log_enable=YES
ascii_upload_enable=YES
ascii_download_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
ls_recurse_enable=YES
listen=NO
use_localtime=YES
force_dot_files=YES
pasv_min_port=60000
pasv_max_port=60030
pasv_addr_resolve=YES
pasv_address=kamikopanda.ddns.net
file_open_mode=0777
virtual_use_local_privs=YES
anon_umask=000
anon_world_readable_only=NO
anon_other_write_enable=YES
anon_mkdir_write_enable=YES
anon_upload_enable=YES
guest_username=ftp
guest_enable=YES
userlist_enable=YES
userlist_file=/etc/vsftpd/deny_user
pam_service_name=vsftpd
local_root=/mnt/disk/ftp/$USER
user_sub_token=$USER
allow_writeable_chroot=YES
ssl_enable=YES
ssl_sslv2=NO
ssl_sslv3=NO
ssl_ciphers=kEECDH+AESGCM+AES128:kEECDH+AESGCM:kEECDH+AES128:kEECDH+AES:!aNULL:!eNULL:!LOW:!EXP
rsa_cert_file=/etc/letsencrypt/live/kamikopanda.ddns.net/fullchain.pem
rsa_private_key_file=/etc/letsencrypt/live/kamikopanda.ddns.net/privkey.pem
require_ssl_reuse=NO
force_local_logins_ssl=NO
force_local_data_ssl=NO
service ftp
{
disable = no
flags = NOLIBWRAP
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/sbin/vsftpd
server_args = /etc/vsftpd/vsftpd.conf
nice = 10
}
auth required pam_pwdfile.so pwdfile /etc/vsftpd/passwd
account required pam_permit.so
ftpユーザーのパスワードはpamを使って認証するが、その際のユーザー名とパスワードはpasswdファイルに次のように記録しておく。ここで、ハッシュはhtpasswdコマンドなどで求めておく。
注意:htpasswdで生成したパスワードが$apr1$で始まる場合は使用できない。openssl passwd -1で$1$で始まるパスワードを使用する。
ユーザー名1:**************ここにパスワードハッシュ***************
ユーザー名2:**************ここにパスワードハッシュ***************
sudo docker-compose up -d --build