Hôm trước mình đã hướng dẫn các bạn cách cài đặt ConfigServer & Firewall (CSF), hôm nay mình sẽ hướng dẫn tiếp cách cấu hình cho CSF để có thể bảo vệ VPS chống lại các cuộc tấn công từ bên ngoài.

Để cấu hình cho CSF, bạn chỉ cần chỉnh sửa nội dung file csf.conf trong folder /etc/csf

nano /etc/csf/csf.conf

Sau đó reload CSF để áp dụng thay đổi:

csf -r

Installing CSF Firewall

Bước 1: Cấu hình ports

Đầu tiên hãy xác định những port bạn sẽ sử dụng và đóng tất cả số còn lại để tăng thêm tính bảo mật cho server.

Mặc định thì những port sau được mở:

TCP_IN = "20,21,22,25,53,80,110,143,443,465,587,993,995"
TCP_OUT = "20,21,22,25,53,80,110,113,443"
UDP_IN = "20,21,53"
UDP_OUT = "20,21,53,113,123"

Danh sách các service đang sử dụng những port trên:

  • Port 20: FTP data transfer
  • Port 21: FTP control
  • Port 22: Secure shell (SSH)
  • Port 25: Simple mail transfer protocol (SMTP)
  • Port 53: Domain name system (DNS)
  • Port 80: Hypertext transfer protocol (HTTP)
  • Port 110: Post office protocol v3 (POP3)
  • Port 113: Authentication service/identification protocol
  • Port 123: Network time protocol (NTP)
  • Port 143: Internet message access protocol (IMAP)
  • Port 443: Hypertext transfer protocol over SSL/TLS (HTTPS)
  • Port 465: URL Rendesvous Directory for SSM (Cisco)
  • Port 587: E-mail message submission (SMTP)
  • Port 993: Internet message access protocol over SSL (IMAPS)
  • Port 995: Post office protocol 3 over TLS/SSL (POP3S)

Khi bạn đã hiểu được ý nghĩa rồi, hãy lựa chọn những port cần thiết mà thôi. Bên dưới là cấu hình những port bạn cần mở khi sử dụng các loại service:

– Trên tất cả server:

TCP_IN: 22,53
TCP_OUT: 22,53,80,113,443
UPD_IN: 53
UPD_OUT: 53,113,123

– Apache/Nginx:

TCP_IN: 80,443

Nếu không dùng HTTPS có thể bỏ port 443

– FTP server:

TCP_IN: 20,21
TCP_OUT: 20,21
UPD_IN: 20,21
UPD_OUT:20,21

– Mail server:

TCP_IN: 25,110,143,587,993,995
TCP_OUT: 25,110

– MySQL server (nếu cần remote access)

TCP_IN: 3306
TCP_OUT: 3306

Lưu ý: Nếu bạn đang dùng IPv6, cần phải cấu hình TCP6_IN, TCP6_OUT, UPD6_IN, và UPD6_OUT tương tự như các port IPv4. Tham khảo thêm danh sách port TCP và UDP trên wiki.

Bước 2: Cấu hình khác

Bên cạnh việc quy định sử dụng port, CSF còn có rất nhiều tùy chọn khác nữa trong file cấu hình. Một số tùy chọn thông dụng bạn nên biết như:

ICMP_IN cho phép ping đến server của bạn, set = 0 để từ chối các request này.

ICMP_IN_LIMIT giới hạn số lượng ping request đến từ 1 địa chỉ IP trong thời gian nhất định. Thông thường bạn không cần phải sửa đổi giá trị mặc định này (1/s)

DENY_IP_LIMIT giới hạn số lượng IP bị block bởi CSF, nếu số lượng IP vượt quá giới hạn này thì những IP cũ sẽ được unblock. Nên giữ số lượng vừa phải bởi nếu bạn lưu nhiều IP quá có thể làm giảm performance hệ thống.

DENY_TEMP_IP_LIMIT cũng tương tự như trên, nhưng cho IP tạm thời.

LF_DAEMON bật chức năng phát hiện login lỗi.

PACKET_FILTER filter các gói tin không hợp lệ.

SYNFLOOD, SUNFLOOD_RATE và SYNFLOOD_BURST kích hoạt chức năng bảo vệ chống SYN flood attacks.

CONNLIMIT giới hạn số lượng kết nối liên tiếp trên 1 port. Ví dụ:

CONNLIMIT = "22;5;80;20"

cho phép tối đa 5 kết nối liên tiếp đến port 22 và 20 kết nối đến port 80

PORTFLOOD giới hạn số lượng kết nối trong mỗi khoảng thời gian trên 1 port. Ví dụ

PORTFLOOD = "22;tcp;5;250"

sẽ giới hạn block địa chỉ IP nếu như tạo quá 5 kết nối trên port 22 sử dụng giao thức TCP trong vòng 250s. Việc block sẽ được tự động xóa sau sau 250s kể từ lần gửi packet cuối cùng. Bạn có thể add thêm port cách nhau bởi dấu phẩy

port1;protocol1;connection_count1;time1,port2;protocol2;connection_count2;time2

Ngoài ra còn có rất nhiều thông số của CSF khác bạn có thể điều chỉnh thêm. Các giá trị mặc định khá tốt và có thể chống lại được việc bị tấn công flood, port scans hoặc dò pass server.

Nếu muốn, các bạn có thể đọc thêm những comment trong file /etc/csf/csf.conf hoặc tham khảo hướng dẫn chính thức từ CSF.

Cuối cùng, để thay đổi có hiệu lực các bạn cần restart lại CSF với lệnh:

csf -r

Chúc các bạn thành công.

Comment của bạn

Lưu ý: tất cả comment đều được kiểm duyệt cẩn thận! Nếu có code bạn hãy up lên pastebin.com rồi để lại link trong comment.

54 Comments

  1. Nguyễn Thanh Tùng 1 comment

    Cho em hỏi cài cái này có cần phải tắt iptables đi không ạ

  2. D 11 comment

    Sau 1 lần config nhầm ko vào được SSH phải reinstall thì cũng ổn
    Có mỗi 2 port web 80 443 là Public nên hầu như toàn chức năng ko dùng đến
    Có bác nào chặn ping IPv6 được không, mình dùng lệnh cũng không được
    ip6tables -A INPUT -p icmpv6 –icmpv6-type echo-request -j DROP

    1. D 11 comment

      Khi bị DDOS muốn chặn toàn bộ nước ngoài thì dùng cách nào cho nhẹ và nhanh vậy có bác nào từng làm chưa, dùng CC_DENY thấy nó load mấy phút chưa xong

      1. D 11 comment

        Mặc định để TCP_IN = “80,443”
        Khi bị DDOS thì xóa nó đi TCP_IN = “” và sửa
        CC_ALLOW_FILTER = “1”
        CC_ALLOW_PORTS = “VN”
        CC_ALLOW_PORTS_TCP = “80,443”
        Nhanh hơn thật nhưng lại chặn luôn cả bots, khá nhiều usecase mà chả có hướng dẫn nào, bó tay, có mỗi 2 port 80/443 là mở thì toàn chức năng thừa thãi phải tắt gần hết cái CSF, tự nhiên dở chứng bỏ Cloudflare 😀

  3. D 11 comment

    Làm đúng hướng dẫn mà chả thấy hoạt động, chặn IP ko được, mở port cố định cho 1 số IP cũng vậy, lằng nhằng thật

  4. Tinhtiennet 23 comment

    A Luân cho e hỏi làm cách nào mình chặn kết nối từ 1 quốc gia chỉ định. Vì vps của e bị china rà đăng nhập quá nhiều… Nó rà hoài e sợ có ngày nó tìm ra đường đi vô. Hic…

  5. Van Dũng 4 comment

    Chào Bác! Bác hướng dẫn tìm và chặn bot vào site giúp với. Mình có 1 trang mới bị gg báo tác vụ thủ công. Từ lúc đó đến nay site vào chậm ko chịu nổi. Mình đổi vps khác vẫn bị. 1 trang web chạy trên vps bình thường, nhưng khi cài domain đó lên thì cả 2 trang đều ko chạy nổi. Đổi cả code vẫn bị. Nếu cài domain trên vps nào thì vps đó bị. Mình nghĩ, do bot vào quá nhiều. Có trả công cho bác nếu giúp mình khắc phục sự cố. Mình đi tìm, ko có người giúp đỡ

  6. phuc 2 comment

    Admin cho em hỏi tí .
    nếu server bị ddods thì làm sao kiểm tra được ip đó tấn công từ website , domain trên server mình nào nhỉ ?

    1. Việt Phương Moderator

      Bạn kiểm tra access_log là sẽ biết các truy cập đến domain nào là chủ yếu

  7. Quyet 3 comment

    Chào bạn!
    Mình đang gặp vấn đề, mình muốn giới hạn thời gian mỗi kết nối nhưng ko đc. Cụ thể khi request được gọi đến, nó sẽ giới hạn chỉ cho tối đa 60s, nếu quá thời gian chờ sẽ trả về lỗi 500. Mình đã thử cấu hình ở các thông số như max_execution_time, KeepAlive, tuy nhiên có vẻ nó ko hoạt động, trình duyệt nó vẫn kết nối mà chẳng thấy dừng. Hy vọng bạn giúp mình, xin cảm ơn!

    1. Việt Phương Moderator

      Phương pháp cụ thể mình không biết rồi. max_execution_time không liên quan lắm đến vấn đề bạn cần. Và bạn cấu hình liên quan gì đến CSF?

      1. Quyet 3 comment

        Cảm ơn bạn đã phản hồi. mình đang cần xử lý vấn đề liên quan đến timeout, mình đã cố gắng tìm nhưng ko thấy, mình cũng ko biết có liên quan đến csf ko nữa, mình hy vọng các bạn có thể chia sẻ để mình khắc phục vấn đề. Mình xin giải thích rõ hơn như sau: Giả sử mình có 1 file script.php, mình cho nó chạy một lệnh nào đó, while chẳng hạn, nó sẽ chạy liên tục, thông thường sau khoảng 60s server sẽ phải ngưng nó lại, tuy nhiên vps của mình nó lại ko dừng, nó cứ chạy và xoay mãi, kết quả làm quá tải server. Mình đang cần một cấu hình nào đó có thể ngắt, ngưng các kết nối này khi quá 60s. Mình đã thử các biện pháp, trong đó có Timeout trong file .conf của apache nhưng ko đc. hy vọng bạn chia sẻ, cảm ơn bạn nhé!

          1. Việt Phương Moderator

            Case này mình không support được rồi. Bạn tham khảo thêm ngoài xem

  8. dũng 119 comment

    cho mình hỏi có cách nào chặn ip của 1 website dc ko
    Mình có 1 site tin tức, nhưng site mình bị 1 site khác gét bài liên tục , họ vẫn để link ảnh của website mình nên mình hỏi xem có cách nào mà link ảnh sang website họ bị die hoặc ko load dc ko ấy

    1. Việt Phương Moderator

      Bạn nghien cứu disable hotlink image nhé. Áp dụng được trong rule Nginx

          1. dũng 119 comment

            Mình đặt code đó vào đây như ảnh dưới nhưng hình như ko có tác dụng hay sao ấy ạ . mình vào domian muốn block kia thì ảnh vẫn hiển thị bình thường mặc dù link ảnh vẫn là của website mình
            https://i.imgur.com/Ru45V4h.png

          2. Việt Phương Moderator

            Bạn đặt có đúng block đâu. Bạn đọc lại trong topic nhé

          3. Việt Phương Moderator

            Dưới server_name của cả block 80 root và block port admin. Và chống cả cho thư mục

          4. dũng 119 comment

            Mình làm được rồi việt phương ạ
            Như vậy là tất cả các website lấy link ảnh của website mình về đều bị lỗi như hình dưới
            https://i.imgur.com/bY6pV8N.png

            Mình vào site của website hay lấy bài của mình thì thấy ảnh của mình bên website họ bị lỗi như vậy, có 1 số bài phải ctrl + f5 thì mới hiện lỗi nữa 😀

          5. Việt Phương Moderator

            Vì lưu cache nên có thể F5 mới thấy. Bạn đặt đúng 2 block chứ?

          6. dũng 119 comment

            Mình đặt nó ở đây ko biết chuẩn chưa
            https://i.imgur.com/HQAyrDF.png
            Mà vào website hay lấy ảnh bên mình check thì ảnh đã bị lỗi rồi

            Nếu đặt chưa đúng cậu chỉ mình đặt chỗ nào cho đúng với ạ
            cám ơn ạ

  9. Khanh Linh 1 comment

    Bạn cho mình hỏi mình block ip bằng lệnh “csf -d Ip” thì có vấn đề là: mặc dù Ip đã nằm trong danh sách block trong file csf.deny. Nhưng khi kiểm tra thì Ip vẫn có kết nối vào server mình được. Mình có test thử một số Ip khác thì hoàn toàn bị block. Không biết nguyên nhân tại sao có một số Ip vẫn không thể bị block khi dùng csf?

    1. Luân Trần Admin

      Mình chưa gặp tình trạng chạy lệnh mà IP ko bị block thế này, theo nguyên tắc là block ngay chứ.

  10. Johnny Nguyen 5 comment

    Mình ko biết là cái csf này hoạt động kiểu gì nhưng trong phần
    # Allow incoming TCP ports
    TCP_IN = “22”
    # Allow outgoing TCP ports
    TCP_OUT = “22”

    Mình thử xóa trắng đi để mỗi 2 cái port 22 đề phòng connect vào SSH xong restart lại csf. Thấy site vẫn hoạt động bình thường chả bị sao cả. Bó tay @@

    1. Luân Trần Admin

      Bạn restart lại VPS xem sao? Có thể web server đang chiếm port đó rồi nên csf không block được?

  11. Mỹ Linh 18 comment

    Anh Luân, cách để chặn IP của một nước qua csf bằng lệnh CC_DENY trên VPS cài hocvps thì làm sao? anh có bài hướng dẫn không. Web e bị thành phần China tấn công hoài …

  12. anhcoo 1 comment

    Tốt nhất mọi người nên dùng vps nước ngoài thỉnh thoảng chập và đứt cáp quang nhưng ko như vps VN, ko làm gì cũng bị quá tải CPU, VPS nước ngoài xài cả đống web cpu vẫn ko quá 1 nhân trong khi vps VN lúc nào cũng 15/2 nhân, hay bị lắm, đơ web luôn

  13. Long Pham 4 comment

    sau khi mình config xong, gõ lệnh csf -r thì hiện 2 dòng thông báo sau
    *WARNING* Binary location for [HOST] [/usr/bin/host] in /etc/csf/csf.conf is either incorrect, is not installed or is not executable
    *WARNING* Missing or incorrect binary locations will break csf and lfd functionality
    Cái này là sao bạn

  14. longdhb@gmail.com 4 comment

    Sao mình cài vào checkmodule thấy ok hết, nhưng có vẽ như csf ko chạy.

    mỗi lần chỉnh sửa /etc/csf/csf.conf thì mình gõ csf -r | csf -q nó hình như ko có hiệu lực nó hiện mấy cái thông báo này:

    *WARNING* URLGET set to use LWP but perl module is not installed, reverting to HTTP::Tiny

    *WARNING* RESTRICT_SYSLOG is disabled. See SECURITY WARNING in /etc/csf/csf.conf.

    Mình thử test bằng cách bỏ thêm 1 port vào tcp_in nhưng telnet chả thấy kết nối, check trên web cũng ko thấy open mà close

    1. Luân Trần Admin

      WARNING chỉ mang tính chất cảnh báo, thông báo bạn, CSF vẫn chạy đó.

  15. Phụng 29 comment

    Mình bị tăng load average dữ quá, nhiều VPS bị luôn. Luân biết lệnh nào mà khi VPS tăng load average lên >1 hoặc >2 thì tự động chạy lệnh service mysql restart.
    Cám ơn Luân

    1. Luân Trần Admin

      Không nên restart bất ngờ thế, kẻo lỗi luôn MySQL không khởi động được nữa đâu. Bạn hãy tìm cách tối ưu cache, tối ưu server hoặc nâng cấp cpu, ram ấy.

  16. Phung 29 comment

    Và để chống quét pass root của VPS thì mình đổi port thì có khắc phục được không nhĩ Luân
    Cám ơn

  17. Phung 29 comment

    Cám ơn Luân, cho mình hỏi thêm là mình xóa table comment trong SQL của wordpress, thì có bị ảnh hưởng khi spam comment ko nhĩ. Web mình hay bị tấn công spam comment. Nó là cho load average trong VPS rất cao, làm đơ VPS

    1. Luân Trần Admin

      Có ảnh hưởng đó bạn, vì các table của nó liên kết với nhau khá chặt chẽ. Tốt nhất xóa trong trang quản lý thôi. Bạn nên cài thêm plugin hạn chế spam comment như Akismet, Growmap Anti Spambot Plugin

  18. Phung 29 comment

    Luân ơi, Dường như CSF này không hoạt động với website xài DNS cloudflare.
    Có cách nào block IP dành cho site wordpress, và xài cloudflare ko nhĩ. Web mình bị tới mấy trăm connect tới cổng 80 làm cho load average rất cao, có khi tới mấy chục. Gần như làm cho tất cả site trên VPS đơ hết luôn. Trong khi CPU chưa tới 1%

    1. Luân Trần Admin

      Vấn đề nó nằm ở chỗ kết nối từ người dùng -> CloudFlare rồi đến VPS sẽ chỉ có IP của CloudFlare thôi. Nên cần tìm cách xử lý cái này trước.

  19. Dương Triều 4 comment

    Chú ý mấy cái chức năng như: PORTFLOOD, SYNFLOOD khi kicks hoạt sẽ làm web hoạt động rất chậm, nên khi website đang ở trạng thái bình thường mình nghỉ không nên kích hoạt nó làm gì.