Bảo Vệ Server Khỏi Tấn Công SYN Flood
Giới Thiệu
Tấn công SYN Flood là một trong những hình thức tấn công từ chối dịch vụ (DDoS) phổ biến, nhằm mục đích làm quá tải server bằng cách khai thác quy trình bắt tay ba bước (three-way handshake) của giao thức TCP. Kẻ tấn công gửi một lượng lớn gói tin SYN đến server nhưng không hoàn tất quá trình bắt tay, khiến server phải duy trì nhiều k�ất nối bán mở (half-open connections) và cạn kiệt tài nguyên. Điều này dẫn đến việc server không thể xử lý các yêu cầu hợp lệ, gây ra tình trạng gián đoạn dịch vụ nghiêm trọng. Bài viết này sẽ hướng dẫn bạn các biện pháp cấu hình hệ thống để tăng cường khả năng chống chịu SYN Flood.
📋 Thời gian: 25 phút | Độ khó: Trung bình
Yêu Cầu
Để thực hiện theo hướng dẫn này, bạn cần:
- Một server chạy hệ điều hành Linux (ví dụ: Ubuntu, CentOS).
- Quyền truy cập root hoặc người dùng có quyền sudo.
- Kiến thức cơ bản về cách sử dụng dòng lệnh Linux và chỉnh sửa tệp cấu hình.
- Hiểu biết cơ bản về giao thức TCP/IP và tường lửa.
Các Bước Thực Hiện
Bước 1: Kích hoạt SYN Cookies và Tối ưu hóa TCP Stack qua Sysctl
SYN Cookies là một cơ chế bảo vệ hiệu quả, cho phép server phản hồi các yêu cầu SYN mà không cần cấp phát tài nguyên cho đến khi nhận được gói tin ACK cuối cùng. Ngoài ra, việc điều chỉnh các tham số TCP khác trong sysctl.conf sẽ giúp server xử lý lượng lớn kết nối bán mở tốt hơn.
-
Mở tệp cấu hình
sysctl.conf:sudo nano /etc/sysctl.conf -
Thêm hoặc sửa đổi các dòng sau vào cuối tệp:
# Kích hoạt SYN Cookies - Rất quan trọng để chống SYN Flood
net.ipv4.tcp_syncookies = 1
# Giảm số lần thử lại SYN-ACK. Giúp giải phóng các kết nối bán mở nhanh hơn.
net.ipv4.tcp_synack_retries = 2
# Tăng kích thước hàng đợi backlog cho các kết nối SYN đang chờ xử lý.
# Giá trị này nên được tăng lên nếu server thường xuyên nhận nhiều kết nối.
net.ipv4.tcp_max_syn_backlog = 8192 # Có thể tăng lên 16384 hoặc 32768 tùy thuộc vào RAM
# Giảm thời gian chờ FIN_WAIT_2. Giúp giải phóng tài nguyên nhanh hơn.
net.ipv4.tcp_fin_timeout = 20
# Tăng số lượng cổng cục bộ khả dụng. Hữu ích cho các server có nhiều kết nối đi.
# net.ipv4.ip_local_port_range = 1024 65535 # Thường không cần thay đổi trừ khi có vấn đề về cổng
# Cho phép tái sử dụng các socket TIME-WAIT. Hữu ích cho các server tải cao.
net.ipv4.tcp_tw_reuse = 1
# Cho phép tái chế các socket TIME-WAIT (cẩn thận khi dùng trong môi trường NAT).
# net.ipv4.tcp_tw_recycle = 1 # Bị loại bỏ trong Linux kernel 4.12 trở lên do vấn đề với NAT💡 Mẹo: Đối với
tcp_max_syn_backlog, giá trị tối ưu có thể phụ thuộc vào lượng RAM và CPU của server. Bắt đầu với 8192 và tăng dần nếu cần. -
Lưu tệp và áp dụng các thay đổi:
sudo sysctl -p✅ Thành công: Các thay đổi về cấu hình TCP stack đã được áp dụng.
Bước 2: Cấu hình Tường lửa (IPTables/UFW) để Hạn chế Tốc độ SYN
Tường lửa có thể giúp hạn chế số lượng gói tin SYN mà server chấp nhận trong một khoảng thời gian nhất định, giảm thiểu tác động của SYN Flood.
Tùy chọn 1: Sử dụng IPTables (cho người dùng có kinh nghiệm)
-
Thêm các quy tắc IPTables để giới hạn tốc độ gói SYN:
# Giới hạn số lượng gói SYN mới đến mỗi giây trên cổng 80 (HTTP)
sudo iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
sudo iptables -A INPUT -p tcp --syn --dport 80 -m limit --limit 100/sec --limit-burst 200 -j ACCEPT
# Giới hạn số lượng gói SYN mới đến mỗi giây trên cổng 443 (HTTPS)
sudo iptables -A INPUT -p tcp --syn --dport 443 -m connlimit --connlimit-above 20 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
sudo iptables -A INPUT -p tcp --syn --dport 443 -m limit --limit 100/sec --limit-burst 200 -j ACCEPT
# Quan trọng: Đảm bảo các quy tắc này nằm trước các quy tắc chấp nhận kết nối thông thường.
# Lưu ý: Các giá trị --limit và --limit-burst cần được điều chỉnh tùy theo lưu lượng truy cập bình thường của server.⚠️ Cảnh báo: Thiết lập giới hạn quá thấp có thể chặn truy cập hợp lệ trong các tình huống tải cao. Hãy giám sát chặt chẽ sau khi áp dụng.
-
Lưu các quy tắc IPTables để chúng tồn tại sau khi khởi động lại:
- Trên Debian/Ubuntu:
sudo apt-get install iptables-persistent
sudo netfilter-persistent save - Trên CentOS/RHEL:
sudo yum install iptables-services
sudo systemctl enable iptables
sudo service iptables save
✅ Thành công: Tường lửa đã được cấu hình để hạn chế tốc độ SYN.
- Trên Debian/Ubuntu:
Tùy chọn 2: Sử dụng UFW (Uncomplicated Firewall - cho Ubuntu/Debian)
Nếu bạn đang sử dụng UFW, việc cấu hình giới hạn tốc độ SYN đơn giản hơn.
- Kích hoạt UFW nếu chưa kích hoạt:
sudo ufw enable - Thêm quy tắc giới hạn tốc độ:
UFW sẽ tự động thiết lập giới hạn mặc định là 6 kết nối mỗi 30 giây cho mỗi địa chỉ IP nguồn. Mặc dù không mạnh mẽ như IPTables tùy chỉnh, nó cung cấp một lớp bảo vệ cơ bản.
# Giới hạn số lượng kết nối mới đến cổng 80 và 443
sudo ufw limit 80/tcp
sudo ufw limit 443/tcp
Bước 3: Giám sát và Phân tích Lưu lượng Mạng
Việc giám sát liên tục là chìa khóa để phát hiện và phản ứng nhanh chóng với các cuộc tấn công SYN Flood.
-
Kiểm tra số lượng kết nối bán mở:
netstat -ant | grep SYN_RECV | wc -lNếu số lượng này tăng đột biến, server của bạn có thể đang bị tấn công.
-
Kiểm tra các kết nối TCP:
sudo ss -s # Hiển thị tóm tắt các socket
sudo ss -tan state syn-recv # Liệt kê các kết nối ở trạng thái SYN_RECV -
Sử dụng
tcpdumpđể phân tích gói tin (khi nghi ngờ tấn công):sudo tcpdump -i eth0 -n -s 1500 'tcp[13] & 2 != 0 and not (tcp[13] & 16 != 0)' # Chỉ hiển thị gói SYNLệnh này sẽ hiển thị các gói tin SYN đến trên giao diện
eth0. Nếu bạn thấy một lượng lớn gói tin SYN từ một hoặc nhiều địa chỉ IP nguồn lạ, đó là dấu hiệu của SYN Flood.
Troubleshooting
-
Server vẫn chậm hoặc không phản hồi sau khi cấu hình:
- Kiểm tra lại
sysctl -p: Đảm bảo các thay đổi trong/etc/sysctl.confđã được áp dụng. - Giới hạn tường lửa quá thấp: Nếu bạn thấy các yêu cầu hợp lệ bị từ chối, hãy tăng giá trị
limitvàlimit-bursttrong IPTables hoặc xem xét lại quy tắc UFW. - Tấn công quá lớn: Các biện pháp này giúp giảm thiểu, nhưng nếu tấn công quá lớn, bạn có thể cần sự hỗ trợ từ nhà cung cấp dịch vụ hosting (ISP) để lọc lưu lượng ở tầng mạng cao hơn.
- Kiểm tra lại
-
Tường lửa chặn nhầm truy cập hợp lệ:
- Kiểm tra logs của tường lửa: Xem các gói tin nào đang bị chặn.
- Kiểm tra thứ tự quy tắc IPTables: Đảm bảo các quy tắc giới hạn tốc độ nằm ở đúng vị trí, không chặn các kết nối đã được thiết lập.
-
Không thể lưu IPTables:
- Đảm bưo bạn đã cài đặt
iptables-persistent(Debian/Ubuntu) hoặciptables-services(CentOS/RHEL) và sử dụng lệnh lưu đúng cách.
- Đảm bưo bạn đã cài đặt
Kết Luận
Chống lại SYN Flood đòi hỏi một cách tiếp cận đa tầng. Bằng cách kích hoạt SYN Cookies, tối ưu hóa các tham số TCP qua sysctl, và thiết lập các quy tắc tường lửa thông minh, bạn có thể tăng cường đáng kể khả năng phòng thủ của server. Tuy nhiên, không có giải pháp nào là hoàn hảo. Việc giám sát liên tục lưu lượng mạng và chuẩn bị sẵn sàng cho các cuộc tấn công lớn hơn, có thể yêu cầu sự can thiệp từ nhà cung cấp dịch vụ, là rất quan trọng. Hãy luôn cập nhật hệ thống và tường lửa của bạn để đảm bảo mức độ bảo mật cao nhất.