Thông thường khi cần kết nối mình sử dụng luôn sFTP, tuy đặc điểm giao thức này rất bảo mật nhưng tốc độ transfer thường chậm hơn so với giao thức FTP truyền thống.

Nếu bạn coi trọng vấn đề tốc độ truyền tải, hãy sử dụng ProFTPD để tạo FTP Server.
proftpd

1. Cài đặt FTP Server với ProFTPD

_ Chúng ta cài đặt ProFTPD nằm trong Extra Packages for Enterprise Linux (EPEL) repository.

# yum install epel-release -y
# yum install proftpd -y

Cấu hình mặc định của ProFTPD đã dùng được rồi, lưu tại: /etc/proftpd.conf.
Lưu ý: Thiết lập DefaultRoot ~ khiến các user không thể truy cập FTP ra ngoài thư mục gốc.

_ Tiếp theo, thêm /bin/false vào cuối file /etc/shells với lệnh sau:

# echo "/bin/false" >> /etc/shells

Đảm bảo trong /etc/shells//sbin/nologin hoặc /bin/false:

/bin/sh
/bin/bash
/sbin/nologin
/bin/tcsh
/bin/csh
/bin/false

_ Bật ProFTPD và thiết lập tự động chạy cùng hệ thống:

# service proftpd start
# chkconfig proftpd on

_ Mở port truy cập FTP – port 21 trong thiết lập tường lửa (iptables, firewalld, csf) của VPS. Mặc định CentOS6 sử dụng IPtables và CentOS7 là FirewallD

iptables -I INPUT -p tcp --dport 21 -j ACCEPT
service iptables save
service iptables restart

2. Tạo FTP user

ProFTPD có thể cấu hình sử dụng user của hệ điều hành (Local User) hoặc user ảo dành riêng cho FTP (Virtual User). Các bạn chỉ có thể lựa chọn cách thức đăng nhập Local User hoặc Virtual User

2.1. Local user

Bạn có thể sử dụng user của hệ điều hành Linux – Local User để đăng nhập FTP Server, trừ các user trong /etc/ftpusers. Khi đó, ProFTPD xác thực đăng nhập bằng mod_auth_unix

_ Tạo user mới useradd với các tùy chọn:

  • -g thiết lập user vào group. Trong HocVPS Script, các thư mục web thuộc group nginx. Để dễ dàng trong việc chỉnh sửa, bạn nên add user vào group nginx và cho phép chỉnh sửa đối với group owner – nginx.
  • -s thiết lập shell đăng nhập. Trong đó, shell sbin/nologin hoặc /bin/false chặn truy cập SSH. Khi đó, user được tạo chỉ có thể đăng nhập trên FTP, không thể đăng nhập SSH cũng như chạy lệnh hệ thống.
  • -d thiết lập thư mục gốc của user.

Như vậy, để tạo FTPuser hocvps chỉ có thể truy cập thư mục /home/hocvps.com/, đồng thời không thể đăng nhập SSH:

# useradd hocvps -g nginx -s /sbin/nologin -d /home/hocvps.com/

Rồi tiến hành thiết lập password cho user vừa tạo: # passwd hocvps

Lưu ý: Nếu muốn chỉnh sửa user đã được tạo: # usermod -a -G nginx hocvps -s /sbin/nologin

_ Thiết lập quyền chỉnh sửa của Group Owner Nginx đối với thư mục web:

# chmod -R g+rw /home/hocvps.com/

2.2. Virtual User

Virtual User là user ảo được tạo bởi FTPassWD, chỉ có thể sử dụng trên FTP (không phải user hệ thống Linux). Khi đó, ProFTPD xác thực đăng nhập bằng mod_auth_file.

Chương trình ProFTPD Utilities với nhiều công cụ nhỏ bên trong sẽ giúp thiết lập, quản lý ProFTPD. Trong đó, công cụ ftpasswd dùng để thiết lập Virtual User. Cài đặt:

# yum install proftpd-utils -y

_ Tạo thư mục lưu thông tin đăng nhập Virtual User:

# mkdir /etc/proftpd
# touch /etc/proftpd/passwd /etc/proftpd/group
# chown -R nobody:nobody /etc/proftpd

_ Chỉnh sửa cấu hình ProFTPD tại /etc/proftpd.conf

  • Comment (#) dòng
AuthPAMConfig proftpd
AuthOrder mod_auth_pam.c* mod_auth_unix.c
  • Chèn xuống dưới :
AuthOrder mod_auth_file.c
AuthUserFile /etc/proftpd/passwd
AuthGroupFile /etc/proftpd/group
RequireValidShell off

Rồi tiến hành restart service: service proftpd restart

_ Tạo user mới (UID và GID bạn nhập tùy ý số lớn hơn 500)

# ftpasswd --passwd --name=hocvps --uid=1000 --gid=1000 --home=/home/hocvps/ --shell=/sbin/nologin --file=/etc/proftpd/passwd

ftpasswd: using alternate file: /etc/proftpd/passwd
ftpasswd: creating passwd entry for user hocvps
Password: #nhập_mật_khẩu

_ Thiết lập quyền chỉnh sửa với thư mục web :

# chmod -R o+rw /home/hocvps/

Vậy là xong rồi đấy, giờ bạn có thể kết nối FTP đến server sử dụng account đã tạo ở trên. Đối với Windows OS, các bạn có thể sử dụng File Zilla để đăng nhập. Trên quan điểm cá nhân, các bạn nên cấu hình đăng nhập chỉ bằng Virtual User.

3. Một số lỗi thường gặp:

– Quá trình Upload gặp lỗi PassiveMode thì chỉnh TransferMode sang Active trên FTP Client. Trong FileZilla là Edit – Settings – Connection – FTP – Transfer Mode.

– Nếu đã thiết lập tường lửa Iptables và chuyển ActiveMode mà vẫn không thể kết nối thì bạn thêm giá trị ip_conntrack_ftp vào /etc/sysconfig/iptables-config
Cụ thể là IPTABLES_MODULES=”ip_conntrack_ftp”. Sau đó tiến hành restart Iptables
Chỉ áp dụng CentOS 6 và nếu VPS không có module ip_conntrack_ftp trong hệ thống thì cần yêu cầu support thêm thủ công

Comment của bạn

Your email address will not be published. Required fields are marked *

178 Comments

  1. Lê Thịnh 24 comment

    – Mình làm đến phần restart service: service proftpd restart thì nó báo lỗi

    [root@banghetuvanphong home]# service proftpd restart
    Redirecting to /bin/systemctl restart proftpd.service
    Job for proftpd.service failed because the control process exited with error code. See “systemctl status proftpd.service” and “journalctl -xe” for details.

    – Chạy systemctl status proftpd -l thì nó ra thế này:

    proftpd.service – ProFTPD FTP Server
    Loaded: loaded (/usr/lib/systemd/system/proftpd.service; enabled; vendor preset: disabled)
    Active: failed (Result: exit-code) since Thu 2019-01-31 10:04:40 +07; 2min 35s ago
    Process: 27319 ExecStart=/usr/sbin/proftpd $PROFTPD_OPTIONS (code=exited, status=1/FAILURE)
    Main PID: 27124 (code=exited, status=0/SUCCESS)

    Jan 31 10:04:40 banghetuvanphong systemd[1]: Starting ProFTPD FTP Server…
    Jan 31 10:04:40 banghetuvanphong proftpd[27319]: 2019-01-31 10:04:40,756 banghetuvanphong proftpd[27319]: fatal: AuthOrder: AuthOrder has already been configured on line 88 of ‘/etc/proftpd.conf’
    Jan 31 10:04:40 banghetuvanphong systemd[1]: proftpd.service: control process exited, code=exited status=1
    Jan 31 10:04:40 banghetuvanphong systemd[1]: Failed to start ProFTPD FTP Server.
    Jan 31 10:04:40 banghetuvanphong systemd[1]: Unit proftpd.service entered failed state.
    Jan 31 10:04:40 banghetuvanphong systemd[1]: proftpd.service failed.

    Ad xem giúp với

    1. Việt Phương Moderator

      Hình như bạn chỉnh sửa file /etc/proftpd.conf nhầm lẫn giũa các phương thức đăng nhập (User Linux hoặc Virtual User)
      Bạn kiểm tra lại file nhé
      AuthOrder: AuthOrder has already been configured on line 88 of ‘/etc/proftpd.conf’

  2. Thao Marky 26 comment

    Mình làm theo các bước ở đây, và tạo Virtual User nhừng ko kết nối dc bạn ơi. Kể cả dùng FTP Account tạo trong Sentora cũng ko kết nối được. Check port 21 đã mở rồi

    Mà trong file /etc/proftpd.conf của mình ko có đoạn code này
    AuthPAMConfig proftpd
    AuthOrder mod_auth_pam.c* mod_auth_unix.c

    Mà nó lại nằm trong file proftpd.conf.rpmnew

    1. Việt Phương Moderator

      Vậy bạn đăng nhập bằng Linux User được không? Ví dụ tài khoản root đó

          1. Thao Marky 26 comment

            Mình vào bằng FileZilla bằng root (port 21) thì nó báo:
            Could not connect to server

            Port 21 mình mở rồi, check đã Open

            Mình gõ netstat -tulpn nó ra thế này
            [root@sv ~]# netstat -tulpn
            -bash: netstat: command not found

          2. Việt Phương Moderator

            1. Bạn port toàn bộ lỗi nhé. Chứ câu ý ngắn quá
            2. ss -tulpn thì ra kết quả gì
            3. IP VPs bạn là gì?

          3. Thao Marky 26 comment

            Lỗi khi mình đăng nhập bằng port 21 đây
            Status: Connecting to 23.94.223.232:21...
            Status: Connection established, waiting for welcome message...
            Error: Could not connect to server

            ss – tupln của mình nó ra thế này

            [root@sv ~]# ss -tulpn
            Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
            Cannot open netlink socket: Protocol not supported
            udp UNCONN 0 0 23.94.223.233:53 *:* users:(("named",pid=476,fd=527),("named",pid=476,fd=526),("named",pid=476,fd=525),("named",pid=476,fd=524))
            udp UNCONN 0 0 23.94.223.232:53 *:* users:(("named",pid=476,fd=523),("named",pid=476,fd=522),("named",pid=476,fd=521),("named",pid=476,fd=520))
            udp UNCONN 0 0 127.0.0.1:53 *:* users:(("named",pid=476,fd=519),("named",pid=476,fd=518),("named",pid=476,fd=517),("named",pid=476,fd=516))
            udp UNCONN 0 0 :::53 :::* users:(("named",pid=476,fd=515),("named",pid=476,fd=514),("named",pid=476,fd=513),("named",pid=476,fd=512))
            Cannot open netlink socket: Protocol not supported
            tcp LISTEN 0 0 23.94.223.233:53 *:* users:(("named",pid=476,fd=24))
            tcp LISTEN 0 0 23.94.223.232:53 *:* users:(("named",pid=476,fd=23))
            tcp LISTEN 0 0 127.0.0.1:53 *:* users:(("named",pid=476,fd=22))
            tcp LISTEN 0 0 *:25 *:* users:(("master",pid=872,fd=13))
            tcp LISTEN 0 0 127.0.0.1:953 *:* users:(("named",pid=476,fd=25))
            tcp LISTEN 0 0 *:443 *:* users:(("httpd",pid=31504,fd=3),("httpd",pid=13760,fd=3),("httpd",pid=13759,fd=3),("httpd",pid=13750,fd=3),("httpd",pid=13688,fd=3),("httpd",pid=13389,fd=3),("httpd",pid=13316,fd=3),("httpd",pid=13189,fd=3),("httpd",pid=10655,fd=3))
            tcp LISTEN 0 0 *:4190 *:* users:(("dovecot",pid=440,fd=17))
            tcp LISTEN 0 0 127.0.0.1:6082 *:* users:(("varnishd",pid=2731,fd=5))
            tcp LISTEN 0 0 127.0.0.1:10025 *:* users:(("master",pid=872,fd=96))
            tcp LISTEN 0 0 *:110 *:* users:(("dovecot",pid=440,fd=27))
            tcp LISTEN 0 0 *:143 *:* users:(("dovecot",pid=440,fd=38))
            tcp LISTEN 0 0 *:8080 *:* users:(("httpd",pid=31504,fd=5),("httpd",pid=13760,fd=5),("httpd",pid=13759,fd=5),("httpd",pid=13750,fd=5),("httpd",pid=13688,fd=5),("httpd",pid=13389,fd=5),("httpd",pid=13316,fd=5),("httpd",pid=13189,fd=5),("httpd",pid=10655,fd=5))
            tcp LISTEN 0 0 *:80 *:* users:(("httpd",pid=31504,fd=4),("httpd",pid=13760,fd=4),("httpd",pid=13759,fd=4),("httpd",pid=13750,fd=4),("httpd",pid=13688,fd=4),("httpd",pid=13389,fd=4),("httpd",pid=13316,fd=4),("httpd",pid=13189,fd=4),("httpd",pid=10655,fd=4))
            tcp LISTEN 0 0 *:8145 *:* users:(("sshd",pid=422,fd=3))
            tcp LISTEN 0 0 :::21 :::* users:(("proftpd",pid=4478,fd=0))
            tcp LISTEN 0 0 :::53 :::* users:(("named",pid=476,fd=21))
            tcp LISTEN 0 0 :::25 :::* users:(("master",pid=872,fd=14))
            tcp LISTEN 0 0 :::3306 :::* users:(("mysqld",pid=450,fd=26))
            tcp LISTEN 0 0 :::80 :::* users:(("varnishd",pid=2732,fd=6))
            tcp LISTEN 0 0 :::8145 :::* users:(("sshd",pid=422,fd=4))

          4. Việt Phương Moderator

            Port VPS thì mở. ProFTPD đang chạy. Chỉ còn 1 phương án này
            Đó là nếu bạn đã chỉnh sửa /etc/proftpd.conf để đăng nhập bằng Virtual User thì không đăng nhập được bằng Linux User
            Nên khi đăng nhập bằng Linux User (root) bạn cần sửa file cấu hình trên về ban đầu

          5. Thao Marky 26 comment

            Trong file /etc/proftpd.conf của mình cũng ko có mấy cái dòng như phía trên, mà nó lại nằm ở file proftpd.conf.rpmnew cơ. Mình chưa sửa file đấy

  3. Trần Lâm 4 comment

    Em gà mờ không biết bước này chỉnh sửa ở đâu nhờ trợ giúp ạ. Em Cám Ơn.

    Chỉnh sửa cấu hình ProFTPD tại /etc/proftpd:

    Comment (#) dòng:

    AuthPAMConfig proftpd
    AuthOrder mod_auth_pam.c* mod_auth_unix.c

    Chèn xuống dưới :

    AuthOrder mod_auth_file.c
    AuthUserFile /etc/proftpd/passwd
    AuthGroupFile /etc/proftpd/group
    RequireValidShell off

      1. Trần Lâm 4 comment

        Hix chả biết sai bước nào giờ User session không kết nối được sever luôn:

        Session stopped
        – Press to exit tab
        – Press R to restart session
        – Press S to save terminal output to file

        Network error: Connection timed out

        Hỗ trợ em với ạ.

        1. Việt Phương Moderator

          Bạn mô tả thé mô hồ quá. Mà bạn đang không kết nối đc server qua FTP hay SSH?
          Kiểm tra service liên quan nhé

  4. HuyNV 2 comment

    E mở lên #service proftpd start thì nó báo fails. Because a configured resource limit was exceeded. Ad giúp e với

      1. HuyNV 2 comment

        Starting ProFTPD FTP Server…
        PID file /run/proftpd/proftpd.pid not readble (yet?) after start.
        failted to start ProFTPD FTP Server
        Unit proftpd.service entered failed state
        proftpd/service failed

        Ad xem giup e!

        1. Việt Phương Moderator

          Cho mình kết quả của
          # sestatus
          # ls -al /run/proftpd/proftpd.pid
          # cat /etc/*-release

  5. Phecti 4 comment

    File Manager nhanh hơn ftp nhé. Vì có thể nén tải lên rùi giải nén trển lên

    1. Việt Phương Moderator

      File Manager hoạt động qua PHP bị giới hạn nhiều hơn là bạn dùng FTP, về thời gian thực thi, dung lượng tập tin và việc nén/giải nén

      1. Phecti 4 comment

        Anh nói rõ thêm cho em đc ko ah. Tại em dùng để tải mã nguồn wp lên thấy vẫn ổn và cũg thấy nhanh

        1. Việt Phương Moderator

          Bạn làm việc với mã nguồn tầm vài Gb là sẽ thấy sự khác biệt

  6. Hieu 14 comment

    Cho mình hỏi việc thiết lập virtual user và chọn cho nó nhóm riêng thì khác thế nào so với tạo local user và thêm vào nhóm nginx? Liệu virtual user ở nhóm riêng thì khi chạy web có trục trặc gì không? Cảm ơn nhiều

    1. Việt Phương Moderator

      Như mình đề cập đó, Virtual User là user ảo được tạo bởi FTPassWD, chỉ có thể sử dụng trên FTP (không phải user hệ thống Linux) và nó cũng độc lập luôn với Web Server

    1. Việt Phương Moderator

      FTP là nhanh nhất rồi bạn nhé. Không thì bạn up lên Cloud rồi dùng rclone tải về

  7. Cuong 9 comment

    mình start thì bị failed:

    Starting proftpd: [FAILED]

    giờ làm cách nào biết failed là gì nhỉ?

      1. Cuong 9 comment

        Thanks for reply,

        Nhưng bị ko có log nào được lưu trong thư mục /var/log/proftpd/

          1. Cuong 9 comment

            Status: Connecting to xx.xx.xx.xx:21…
            Status: Connection established, waiting for welcome message…
            Status: Insecure server, it does not support FTP over TLS.
            Status: Logged in
            Status: Retrieving directory listing…

            Logged rồi, mà Retrieving directory ko được, đã phân quyền vào thư mục bằng lệnh chmod -R g+rw /home/domain.com/ mà vẫn ko retrieving được

            Thường mắc bệnh gì ad? Mình add user vào group nginx.

          2. Việt Phương Moderator

            Thông tin mù mờ vậy mình không rõ rồi. Bạn kiểm tra lại các bước và cấu hình ProFTPD thôi

          3. Cuong 9 comment

            thêm giá trị “ip_conntrack_ftp” vào
            /etc/sysconfig/iptables-config

            IPTABLES_MODULES=”ip_conntrack_ftp”

            Thấy có bạn comment cái này, áp dụng phát là được luôn, mình nghĩ ad nên add phần này vào bài tut, chắc có bác sẽ gặp 🙂

            Thanks ad support nha.

          4. Việt Phương Moderator

            Nếu không nhầm thì kết nối FTP(ví dụ FileZilla) bạn để PassiveMode ?

          5. Cuong 9 comment

            Mình dùng FileZilla, thấy mode là default thôi, ko biết default của nó là passive hay Active

          6. Việt Phương Moderator

            Uhm bạn, default hình như là PassiveMode và connect này có thể gây lỗi như bạn mô tả nên mình muốn kiểm tra lại

  8. kieuqtoan 27 comment

    Muốn 1 user truy cập vào 2 thư mục website thì làm thế nào vậy bạn

    Mình đã tạo 1 user cho thư mục A, sau đó mình tạo 1 thư mục B và muốn user này được phép truy cập thư mục B nữa. A và B ngang hàng

    1. Việt Phương Moderator

      Của bạn chắc là user X CHỈ cho thư mục A,B và user Y CHỈ cho thư mục C? Hiện mình chưa có ý tưởng cho vấn đề này rồi. Bạn tham khảo thêm trên mạng xem.

        1. Việt Phương Moderator

          Không có giải pháp rồi. Bạn tạo 2 user vậy. Có giải pháp thêm bảo mình nhé

  9. manhnd 10 comment

    Chào Luan !

    Mình làm đi làm lại vẫn bị lỗi như ở bên dưới. Server mới hoàn toàn và cài proftpd sau khi cài hocvps.

    Status: Connected to 125.253.113.24
    Error: Received unexpected end-of-file from SFTP server
    Error: Could not connect to server

    1. Việt Phương Moderator

      Hình như bạn đang kết nối sFTP? Nếu thế thì đâu cần cài đặt và liên quan đến FTP?

      1. manhnd 10 comment

        Vậy thì làm thế nào để 1 server có rất nhiều web có thể hoạt động được với những account khác nhau.. Khi đó mình có thể làm bằng tay hay làm được với hocvps.

        1. Việt Phương Moderator

          Thì bạn làm như trong bài viết hướng dẫn. Và bạn kết nối qua cổng FTP 21 chứ không phải cổng 22 SSH làm sFTP

  10. Trần Hoàng Giang 1 comment

    Mình dùng cách tạo Virtual User nhưng bị lỗi
    Connection attempt failed with “ECONNREFUSED – Connection refused by server”.

    Sau đó mình thử debug bằng lệnh systemctl status proftpd.service thì bị báo
    proftpd[452]: mod_auth_file/1.0: unable to use world-readable AuthUserFile ‘/etc/proftpd/passwd’ (…ot permitted

    Có nghĩa là chưa khởi động đc proftpd. Vì vậy mình chạy tiếp lệnh để chmod
    sudo chmod o-rwx /etc/proftpd/ftpd.passwd

    Sau đó khởi động proftpd thành công bằng lệnh.
    sudo service proftpd start

    Thử lại bằng filezilla thấy ok. Mong giúp đc ai đang bị lỗi.

    1. Việt Phương Moderator

      Well noted. Tiện, bạn xem giúp mình đã set user nobody:nobody cho file đó chưa? Vì ProFTPD chạy trên user nobody và nếu file đó thuộc quyền sở hữu nobody thì ProFTPD sẽ đọc đc file đó. Chứ mình thường không muốn file đó đọc đc bởi tất cả mọi user

    1. Việt Phương Moderator

      Lỗi timeout khó biết lắm. Bạn dùng Local User ? Bạn kiểm tra lại service ftp với phần đăng nhập FileZilla bạn điền đúng k?

      1. kieuqtoan 27 comment

        Mình dùng Virtual User, kiểm tra các service ftp vẫn chạy bình thường, tạo cả user mới cũng vẫn bị, pass đã nhập chuẩn (nếu nhập sai nó thông báo lỗi khác)

        1. Việt Phương Moderator

          Nếu Virtual User thì bạn đã config /etc/proftpd chưa? Bạn kiểm tra có nội dung trong /etc/proftpd/passwd không

          1. Việt Phương Moderator

            Khó hiểu vậy nhỉ. Vậy bạn thử Local User được không

  11. KennyMax 13 comment

    Luân tích hợp tính năng cài đặt FTP Server và tạo User FTP vào HocVPS Script cho anh em tiện sử dụng đi Luân 😀

    1. Việt Phương Moderator

      Không nên bạn à. HocVPS được thiết kế mang tới những nhu cầu cơ bản nhất cho người dùng, cũng như đảm bảo hệ thống tối ưu. Vì vậy, các nhu cầu thêm bên ngoài mà tùy người cần thiết hay không thì sẽ không tích hợp.

    1. Việt Phương Moderator

      Nếu bạn dùng user Linux thì bạn tìm hiểu nghiên cứu về Disk Quota nhé.
      Còn bạn dùng user Virutal trong ProFTPD Utilities thì có tool là ftpquota.
      Cụ thể thì hiện tại mình chưa nghiên cứu

  12. Hieu 14 comment

    Chào HocVPS,
    Mình có adduser vào thư mục /home/tenmien.com/public_html thành công nhưng gặp lỗi
    “This is most likely due to insufficient permissions. Verify both the destination path and permissions, then try again. If the problem persists, contact your system administrator or hosting provider.”.
    Mình có tìm hiểu ra là do lúc chọn tên miền cài đặt HocVPS, thì ngnix tự động tạo cho mình thư mục public_html này nên khi mình dùng FTP thì không có quyền lưu file.
    Vậy có cách nào xử lý không nhỉ?
    Mình đang xử lý tạm thời bằng cách sửa owner của thư mục đó cho user FTP. Nhưng nếu sau này cứ thêm domain lại phải sửa thế này thì mệt quá.
    Thanks bạn

    1. Việt Phương Moderator

      Vậy bạn sửa thư mục đó quyền write cho other hoặc add user vào group nginx

        1. Việt Phương Moderator

          Bạn dùng local user(user của Linux) hay virtual user(user của riêng FTP)?

          1. Hieu 14 comment

            Mình dùng user root để vào hocvps panel.
            Sau đó mình cài ProFTP, tạo 1 user bằng useradd để truy cập FTP đó bạn

          2. Việt Phương Moderator

            usermod -a -G nginx tên_user để add user vào group nginx