็†ฑ้–€ๅˆ†้กž
 ่ผ‰ๅ…ฅไธญ…
็›ฎ้Œ„

๐Ÿง Linux FTP Server ๆžถ่จญๆ•™ๅญธ:ๅพž vsftpd ๅฎ‰่ฃๅˆฐไฝฟ็”จ่€…ๆฌŠ้™่จญๅฎšๅ…จๆ”ป็•ฅ

    ๐Ÿง Linux FTP Server ๆžถ่จญๆ•™ๅญธ:ๅพž vsftpd ๅฎ‰่ฃๅˆฐไฝฟ็”จ่€…ๆฌŠ้™่จญๅฎšๅ…จๆ”ป็•ฅ

    ้ฉๅˆๅ‰›ๆŽฅ่งธไธปๆฉŸ็ถญ้‹็š„ไฝ :ๆœฌๆ–‡็”จๆœ€ๅฏฆๅ‹™็š„ๆ–นๅผ,ๅธถไฝ ๅพž 0 ้–‹ๅง‹ๅฎŒๆˆ FTP(vsftpd)ๅฎ‰่ฃ、ไฝฟ็”จ่€…่ˆ‡ๆฌŠ้™็ฎก็†、้˜ฒ็ซ็‰†/SELinux ่จญๅฎš่ˆ‡ TLS ๅŠ ๅฏ†。

    ๐Ÿ“‘ ็›ฎ้Œ„

    ไธ€、็’ฐๅขƒ่ˆ‡ๅฅ—ไปถๆบ–ๅ‚™

    vsftpd(Very Secure FTP Daemon)ไปฅๅฎ‰ๅ…จ่ˆ‡็ฉฉๅฎš่žๅ,ไธปๆต็™ผ่กŒ็‰ˆ็š†ๆไพ›ๅฅ—ไปถ。

    ๆœ€ไฝŽ้œ€ๆฑ‚:้–‹ๅ•Ÿ TCP 21 ่ˆ‡ไธ€ๆฎต「่ขซๅ‹•ๆจกๅผ」้€ฃ็ทšๅŸ (ๅปบ่ญฐ 40000–50000),็ณป็ตฑๆ™‚้˜ๆญฃ็ขบ、DNS ๆญฃๅธธ。
    # ๆชขๆŸฅ็‰ˆๆœฌ่ˆ‡ไฝœๆฅญ็ณป็ตฑ
    cat /etc/os-release
    uname -r

    ไบŒ、ๅฎ‰่ฃ vsftpd

    Debian/Ubuntu

    sudo apt update
    sudo apt install -y vsftpd
    sudo systemctl enable --now vsftpd
    sudo systemctl status vsftpd

    RHEL/CentOS/Rocky/Alma

    sudo dnf install -y vsftpd
    sudo systemctl enable --now vsftpd
    sudo systemctl status vsftpd

    ไธ‰、ๆ ธๅฟƒ่จญๅฎš่ˆ‡ไฝฟ็”จ่€…ๆฌŠ้™

    ไธป่ฆ่จญๅฎšๆช”:/etc/vsftpd.conf。ไปฅไธ‹็‚บๅฎ‰ๅ…จ้ ่จญ่ˆ‡ๆœฌๆฉŸไฝฟ็”จ่€…ไธŠๅ‚ณ็š„ๅธธ็”จ็ต„ๅˆ:

    ๅปบ่ญฐ่จญๅฎš็‰‡ๆฎต(ๅฏ็›ดๆŽฅ่ฆ†่“‹/ๅˆไฝต)
    # /etc/vsftpd.conf — ๅฎ‰ๅ…จๅŸบๆบ–
    listen=YES
    listen_ipv6=NO
    anonymous_enable=NO
    local_enable=YES
    write_enable=YES
    # ไธŠๅ‚ณๆช”ๆกˆ้ ่จญๆฌŠ้™(็ญ‰ๅŒ umask 022)
    local_umask=022
    
    # ้™ๅˆถไฝฟ็”จ่€…ๅœจๅฎถ็›ฎ้Œ„(้ฟๅ…่ถŠๆฌŠ)
    chroot_local_user=YES
    allow_writeable_chroot=YES
    
    # ่ขซๅ‹•ๆจกๅผ;่ซ‹่ˆ‡้˜ฒ็ซ็‰†ไธ€ไฝต้–‹ๆ”พ
    pasv_enable=YES
    pasv_min_port=40000
    pasv_max_port=50000
    
    # ็™ปๅ…ฅ่ˆ‡่จ˜้Œ„
    xferlog_enable=YES
    xferlog_std_format=NO
    log_ftp_protocol=YES
    
    # ๅ…ถไป–ๅผทๅŒ–
    use_localtime=YES
    ftpd_banner=Welcome to WWFandy FTP Service.
    
    # (ๅฆ‚้œ€ๅ…่จฑ็‰นๅฎšไฝฟ็”จ่€…):
    # userlist_enable=YES
    # userlist_file=/etc/vsftpd.userlist
    # userlist_deny=NO  # ๅƒ…ๅ…่จฑๅœจๆธ…ๅ–ฎไธญ็š„ๅธณ่™Ÿ
    

    ๅปบ็ซ‹ๆœฌๆฉŸๅธณ่™Ÿ่ˆ‡ไธŠๅ‚ณ่ณ‡ๆ–™ๅคพ

    # ๅปบ็ซ‹ไธ€ๅ€‹ๅƒ… FTP ็”จ้€”็š„ๅธณ่™Ÿ่ˆ‡่ณ‡ๆ–™ๅคพ
    sudo adduser ftpuser
    sudo passwd ftpuser
    
    # ๆŒ‡ๅฎšๅฏไธŠๅ‚ณ่ณ‡ๆ–™ๅคพ(็ฏ„ไพ‹:/srv/ftp/ftpuser)
    sudo mkdir -p /srv/ftp/ftpuser/upload
    sudo chown -R ftpuser:ftpuser /srv/ftp/ftpuser
    # ๅฐ‡ไฝฟ็”จ่€…ๅฎถ็›ฎ้Œ„ๆ”นๅˆฐ /srv/ftp/ftpuser(ๅฏ้ธ)
    sudo usermod -d /srv/ftp/ftpuser ftpuser
    
    # ้‡ๅ•Ÿๆœๅ‹™
    sudo systemctl restart vsftpd

    (ๅฏ้ธ)ๅŒฟๅๅ”ฏ่ฎ€ไธ‹่ผ‰

    ่‹ฅ้œ€ๅฐๅค–ๆไพ›ๅ…ฌ้–‹ไธ‹่ผ‰,ๅฏๅ•Ÿ็”จๅŒฟๅๆจกๅผไฝ†้ฟๅ…ๅฏซๅ…ฅ:

    # /etc/vsftpd.conf ๅขž่ฃœ
    anonymous_enable=YES
    anon_upload_enable=NO
    anon_mkdir_write_enable=NO
    anon_other_write_enable=NO
    # ๅŒฟๅๆ น็›ฎ้Œ„(้ ่จญ /var/ftp,่ซ‹ๆ”พๅช่ฎ€ๆช”ๆกˆ)
    # anon_root=/var/ftp/pub

    ๅ››、้˜ฒ็ซ็‰†(UFW/Firewalld)่ˆ‡ Passive Port

    FTP ็š„่ณ‡ๆ–™้€ฃ็ทšๅœจ่ขซๅ‹•ๆจกๅผไธ‹ๆœƒ่ฝๅœจไฝ ่จญๅฎš็š„ pasv_min_port..pasv_max_port ็ฏ„ๅœ,ๅ‹™ๅฟ…ๆ”พ่กŒ。

    UFW(Debian/Ubuntu)

    sudo ufw allow 21/tcp
    sudo ufw allow 40000:50000/tcp
    sudo ufw reload
    sudo ufw status

    Firewalld(RHEL/CentOS/Rocky/Alma)

    sudo firewall-cmd --permanent --add-service=ftp
    sudo firewall-cmd --permanent --add-port=40000-50000/tcp
    sudo firewall-cmd --reload
    sudo firewall-cmd --list-all

    ไบ”、SELinux(CentOS/RHEL)ๆณจๆ„ไบ‹้ …

    ๅ•Ÿ็”จ SELinux ๆ™‚,้œ€่จญๅฎšๅธƒๆž—ๅ€ผ่ˆ‡ๆช”ๆกˆๆจ™็ฑค,็ขบไฟ FTP ๅฏ่ฎ€ๅฏซๆญฃ็ขบ่ทฏๅพ‘。

    # ๅ…่จฑ vsftpd ๅฏซๅ…ฅๆœฌๆฉŸไฝฟ็”จ่€…ๅฎถ็›ฎ้Œ„/ๆŒ‡ๅฎš่ทฏๅพ‘(ไพ้œ€ๆฑ‚ๆ“‡ไธ€ๆˆ–ๅคš้ …)
    sudo setsebool -P ftpd_full_access on         # ๅฏฌ้ฌ†:ๅ…่จฑ vsftpd ่ฎ€ๅฏซ(ๆœ€็ฐกๅ–ฎ)
    # ๆˆ–่ผƒ็ฒพๆบ–ๅšๆณ•:ๆจ™่จป่ฆๆไพ›็š„ไธ‹่ผ‰/ไธŠๅ‚ณ็›ฎ้Œ„็‚บ public_content ๆˆ– public_content_rw_t
    sudo semanage fcontext -a -t public_content_rw_t "/srv/ftp(/.*)?"
    sudo restorecon -Rv /srv/ftp

    ๅฆ‚้œ€ๅŒฟๅๅฏซๅ…ฅ(้€šๅธธไธๅปบ่ญฐ),ๅฆๆœ‰ ftpd_anon_write ๅธƒๆž—ๅ€ผๅฏ็”จ;่ซ‹ๅฏฉๆ…Ž่ฉ•ไผฐ้ขจ้šช。

    ๅ…ญ、ๅ•Ÿ็”จ SSL/TLS ๅŠ ๅฏ†็™ปๅ…ฅ

    ๅ‚ณ็ตฑ FTP ๆ˜Žๆ–‡ๅ‚ณ่ผธๅธณๅฏ†,ๅปบ่ญฐ่‡ณๅฐ‘ๅŠ ไธŠ TLS(FTPS)。ไปฅไธ‹็คบ็ฏ„่‡ช็ฐฝๆ†‘่ญ‰ๅฟซ้€Ÿๅ•Ÿ็”จ:

    # ็”ข็”Ÿ่‡ช็ฐฝๆ†‘่ญ‰(ๆœ‰ๆ•ˆ 1 ๅนด)
    sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
      -keyout /etc/ssl/private/vsftpd.key \
      -out /etc/ssl/certs/vsftpd.crt \
      -subj "/C=TW/ST=Taiwan/L=Taipei/O=WWFandy/OU=IT/CN=ftp.example.com"
    
    # vsftpd ๅ•Ÿ็”จ TLS
    sudo bash -c 'cat >> /etc/vsftpd.conf' << "EOF"
    ssl_enable=YES
    rsa_cert_file=/etc/ssl/certs/vsftpd.crt
    rsa_private_key_file=/etc/ssl/private/vsftpd.key
    force_local_logins_ssl=YES
    force_local_data_ssl=YES
    ssl_tlsv1_2=YES
    ssl_sslv2=NO
    ssl_sslv3=NO
    EOF
    
    sudo systemctl restart vsftpd

    ๆญฃๅผ็’ฐๅขƒๅฏไฝฟ็”จๅ…ฌๆœ‰ CA ๆ†‘่ญ‰,ๆˆ–ไปฅๅๅ‘ไปฃ็†(ๅฆ‚ Nginx/HAProxy)ๆไพ› FTPS/FTP-over-TLS ็ต‚็ต。

    ไธƒ、ๆธฌ่ฉฆ่ˆ‡ๅธธ่ฆ‹ๅ•้กŒๆŽ’ๆŸฅ

    ๅŸบๆœฌ้€ฃ็ทšๆธฌ่ฉฆ

    # Linux ็”จๆˆถ็ซฏ(ไบ’ๅ‹•ๅผ)
    ftp -p <server-ip>
    
    # ๅ…ไบ’ๅ‹•(lftp ๆŽจ่–ฆ)
    lftp -u ftpuser,****** -e "ls; put test.txt; bye" ftp://<server-ip>
    
    # ๆชขๆŸฅ่ขซๅ‹•ๆจกๅผ่ˆ‡ TLS
    curl -v --ssl-reqd ftp://<server-ip>/ --user ftpuser:******

    ๅธธ่ฆ‹้Œฏ่ชค้€ŸๆŸฅ

    • ้€ฃๅพ—ไธŠไฝ†ๅˆ—่กจ/ไธŠๅ‚ณๅกไฝ:ๅคšๅŠๆ˜ฏ pasv ๅŸ ๆฒ’ๆ”พ่กŒ;ๅŒๆ™‚็ขบ่ชไธปๆฉŸๅœจ NAT ๅพŒๆ˜ฏๅฆ้œ€ pasv_address=<public-ip>
    • 530 Login incorrect:ๆชขๆŸฅไฝฟ็”จ่€…ๅฏ†็ขผ、/etc/vsftpd.userlist(่‹ฅๆœ‰ๅ•Ÿ็”จ็™ฝๅๅ–ฎ)。
    • 500 OOPS: vsftpd: refusing to run with writable root:ๅทฒ่จญ chroot_local_user=YES ๆ™‚,่ซ‹ๆญ้… allow_writeable_chroot=YES ๆˆ–่ชฟๆ•ดๅฎถ็›ฎ้Œ„ๆฌŠ้™。
    • TLS ้€ฃ็ทš่ขซๆ‹’:็ขบ่ช ssl_enable ่ˆ‡ๆ†‘่ญ‰่ทฏๅพ‘;ๅฎขๆˆถ็ซฏๆ˜ฏๅฆๅ•Ÿ็”จ「้œ€่ฆๅŠ ๅฏ†」。
    • SELinux ๆ‹’็ต•:/var/log/audit/audit.log ๆŸฅ AVC ่จ˜้Œ„;ไปฅ sealert -a ็”ข็”Ÿๅปบ่ญฐ;ๆˆ–ๅ…ˆ็”จ ftpd_full_access on ้ฉ—่ญ‰。

    ๐Ÿงญ ่กŒๅ‹•ๆธ…ๅ–ฎ

    ✅ ๅฎ‰่ฃ vsftpd ไธฆๅฅ—็”จๅฎ‰ๅ…จๅŸบๆบ–่จญๅฎš
    ✅ ๅปบ็ซ‹ ftpuser,่จญๅฎšๅฎถ็›ฎ้Œ„่ˆ‡ไธŠๅ‚ณ่ณ‡ๆ–™ๅคพ
    ✅ ้–‹ๅ•Ÿ TCP/21 ่ˆ‡ 40000–50000/tcp(UFW ๆˆ– Firewalld)
    ✅ (RHEL ็ณป)่จญๅฎš SELinux ๆจ™็ฑค่ˆ‡/ๆˆ–ๅธƒๆž—ๅ€ผ
    ✅ ๅ•Ÿ็”จ TLS(FTPS),ๅผทๅˆถๅธณๅฏ†่ˆ‡่ณ‡ๆ–™ๆตๅŠ ๅฏ†
    ✅ ไปฅ lftp/curl ้ฉ—่ญ‰ๅˆ—่กจ、ไธŠๅ‚ณ、TLS ๆˆๅŠŸ

    ๐Ÿ”— ๅปถไผธ้–ฑ่ฎ€

    — WWFandy・ไธป้กŒ็ญ†่จ˜

    ๐Ÿ”— ๅˆ†ไบซ้€™็ฏ‡ LINE Facebook X

    ๆฒ’ๆœ‰็•™่จ€:

    ๅผต่ฒผ็•™่จ€

    ๅญ—็ดš