Thế nào là SYN FLOODING & SYN SPOOFING ?
SYN flood là một dạng tấn công từ chối dịch vụ. Chúng ta có thể nói rằng SERVER bị tấn công flood khi kẻ tấn công cố gắng tạo một lượng rất lớn các kết nối ở trạng thái "SYN RECEIVED" cho đến khi "backlog queue" bị đầy. Trạng thái "SYN RECEIVED" nghĩa là khi SERVER nhận 1 yêu cầu kết nối (tức nhận 1 packet với cờ SYN được thiết lập) và SERVER sẽ cấp phát 1 tài nguyên bộ nhớ cho kết nối này. Tấn công flood tạo ra quá nhiều các kết nối dạng "half-open" đến nỗi mà SERVER trở nên quá tải và không thể xử lý các yêu cầu kết nối khác nữa.
Để tăng cường tấn công SYN flood, kẻ tấn công sẽ giả địa chỉ IP nguồn của gói SYN (gói yêu cầu kết nối đến server). Khi đó hệ thống SERVER sẽ không thể hoàn tất quá trình kết nối của gói SYN này bởi lẽ địa chỉ nguồn là một địa chỉ không tồn tại. Dạng tấn công này gọi là "SYN spoofing attack".
Chúng ta cần biết rằng quá trình tạo một kết nối đầy đủ sẽ mất một ít thời gian. Đầu tiên, sau khi nhận yêu cầu kết nối(gói tin có cờ SYN được thiết lập), SERVER sẽ đặt kết nối "half-open" này vào "backlog queue" và gửi gói tin đáp ứng trả về cho máy client(gói tin có cờ SYN và ACK được thiết lập). Khi SERVER không nhận được tín hiệu trả lời tiếp theo của CLIENT, nó sẽ cố gắng truyền lại gói SYN+ACK cho đến khi time-out, và sau cùng sẽ xoá kết nối "half-open" này khỏi "backlog-queue". Trong 1 số hệ điều hành, thời gian tối đa để xử lý packet yêu cầu kết nối có thể đến 3 phút. Bài viết này sẽ hướng dẫn bạn chỉnh thông số này. Một thông tin quan trọng khác nữa mà bạn cần chú ý là hệ điều hành chỉ có thể xử lý 1 số lượng kết nối "half-open" nhất định trong "backlog-queue". Số lượng nhất định được xác định thông qua kích thước của "backlog-queue". Chẳng hạn, kích thước "backlog-queue" của RedHat 7.3 là 256, Windows 2000 Professional là 100. Vì vậy khi kích thước giới hạn này đạt tới thì hệ thống sẽ không thể nhận thêm các yêu cầu kết nối khác đến nữa.
1. Làm sao phát hiện SYN ATTACK?
Một cách đơn giản nhất để phát hiện ra SERVER bị SYN Flood là sử dụng lệnh netstat. Trạng thái half-open được mô tả bằng SYN_RECEIVED trong Windows và SYN_RECV trong Linux. Trong Linux bạn gõ lệnh sau để xem các kết nối half-open.
# netstat -n -p TCP|grep SYN_RECV
tcp 0 0 10.100.0.200:21 237.177.154.8:25882 SYN_RECV -
tcp 0 0 10.100.0.200:21 236.15.133.204:2577 SYN_RECV -
tcp 0 0 10.100.0.200:21 127.160.6.129:51748 SYN_RECV -
tcp 0 0 10.100.0.200:21 230.220.13.25:47393 SYN_RECV -
tcp 0 0 10.100.0.200:21 227.200.204.182:60427 SYN_RECV -
tcp 0 0 10.100.0.200:21 232.115.18.38:278 SYN_RECV -
tcp 0 0 10.100.0.200:21 229.116.95.96:5122 SYN_RECV -
tcp 0 0 10.100.0.200:21 236.219.139.207:49162 SYN_RECV -
tcp 0 0 10.100.0.200:21 238.100.72.228:37899 SYN_RECV -
tcp 0 0 10.100.0.200:21 237.177.154.8:25882 SYN_RECV -
tcp 0 0 10.100.0.200:21 236.15.133.204:2577 SYN_RECV -
tcp 0 0 10.100.0.200:21 127.160.6.129:51748 SYN_RECV -
tcp 0 0 10.100.0.200:21 230.220.13.25:47393 SYN_RECV -
tcp 0 0 10.100.0.200:21 227.200.204.182:60427 SYN_RECV -
tcp 0 0 10.100.0.200:21 232.115.18.38:278 SYN_RECV -
tcp 0 0 10.100.0.200:21 229.116.95.96:5122 SYN_RECV -
tcp 0 0 10.100.0.200:21 236.219.139.207:49162 SYN_RECV -
tcp 0 0 10.100.0.200:21 238.100.72.228:37899 SYN_RECV -
#netstat -n -p TCP|grep SYN_RECV | grep :80|wc -l
500
500
Backlog-queue là một cấu trúc bộ nhớ lớn dùng để xử lý các gói tin yêu cầu kết nối SYN cho đến khi quá trình bắt tay kết nối (3-way handshake) hoàn tất. Hệ điều hành sẽ cấp phát 1 phần bộ nhớ hệ thống cho mỗi yêu cầu kết nối đến. Backlog-queue sẽ cho biết có thể xử lý bao nhiêu kết nối half-open cùng một lúc. Khi lượng yêu cầu kết nối đến đạt giá trị maximum của backlog-queue, thì các yêu cầu kết nôi tiếp theo sẽ không được xử lý.
Vì vậy để hạn chế mức độ ảnh hưởng của SYN Flood, chúng ta sẽ điều chỉnh các thông số bảo vệ của hệ điều hành gồm:
* Tăng kích thước của backlog-queue để có thể xử lý nhiều yêu cầu kết nối hơn.
* Giảm tối thiểu thời gian "các kết nối chờ xử lý" trong backlog-quee mà đã chiếm dụng bộ nhớ do OS cấp phát.
3. Trong Linux bạn sử dụng các lệnh sau
* Bật cơ chế SYN cookies
# echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# sysctl -w net.ipv4.tcp_max_syn_backlog="2048"
# sysctl -w net.ipv4.tcp_synack_retries=9
# sysctl -w net.ipv4.tcp_syn_retries=9
# sysctl -w net.ipv4.tcp_syn_retries=9