GIT – Syn flood là 1 dạng tấn công từ chối dịch vụ, kẻ tấn công gửi các gói tin kết nối SYN đến hệ thống. Đây là 1 loại tấn công rất phổ biến. Loại tấn công này sẽ nguy hiểm nếu hệ thống cấp phát tài nguyên ngay sau khi nhận gói tin SYN từ kẻ tấn công và trước khi nhận gói ACK.

Các bạn có thể xem thêm về thiết lập 3 way handshake TCP connection.

Nếu việc thiết lập kết nối chưa hòan tất 3 bước đây đủ (gọi là half-open connection) mà buộc hệ thống server phải cấp tài nguyên để quản lý thì kẻ tấn công có thể lấy hết tài nguyên của hệ thống server bằng các “flooding” vào server với các gói tin SYN. Syn flood là 1 dạng tấn công phổ biến và nó có thể được ngăn chặn bằng đoạn lệnh sau:

iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j RETURN

Tất cả các kết nối đến hệ thống chỉ được phép theo các thông số giới hạn sau:
–limit 1/s: Tốc độ truyền gói tin trung bình tối đa 1/s (giây)
–limit-burst 3: Số lương gói tin khởi tạo tối đa được phép là 3
Dùng iptables, thêm rule sau vào:

# Limit the number of incoming tcp connections
# Interface 0 incoming syn-flood protection
iptables -N syn_flood
iptables -A INPUT -p tcp --syn -j syn_flood
iptables -A syn_flood -m limit --limit 1/s --limit-burst 3 -j RETURN
iptables -A syn_flood -j DROP

‐‐limit rate n
‐‐limit‐burst number m

Giải thích 1 cách dễ hiểu là như thế này “Rule trên giới hạn số kết nối tối đa đến hệ thống là n trên mỗi 1 giây sau khi đã có m kết nối được thiết lập”
Bạn cần điều chỉnh thông số -limit-rate và -limit-burst tùy theo yêu cầu và traffic của mạng của bạn.
Giả sử bạn cần giới hạn các kết nối SSH (port 22) không được phép hơn 10 connections trên mỗi 10 phút, rule như sau:

iptables -I INPUT -p tcp -s 0/0 -d $SERVER_IP --sport 513:65535 --dport 22 -m state --state NEW,ESTABLISHED -m recent --set -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 600 --hitcount 11 -j DROP
iptables -A OUTPUT -p tcp -s $SERVER_IP -d 0/0 --sport 22 --dport 513:65

Vậy sau khi đã xác định được IP (ví dụ lấy 1 IP trong LAN 192.168.1.222) tấn công, việc quan trọng vẫn là cách ly các gói tin từ IP (192.168.1.222) để đảm bảo cho hệ thống hoạt động tốt.

# iptables -I INPUT -s 192.168.1.222 -j DROP

Câu lệnh này sẽ thêm một entry vào file cấu hình IPTable, chỉ dẫn nó bỏ qua bất kì gói tin nào đến từ địa chỉ IP 192.168.1.222. Nếu bạn đang đối mặt với rất nhiều cuộc tấn công, tốt hơn hết bạn nên sử dụng một phương pháp tự động hơn để thêm địa chỉ IP từ danh sách cấm. Để làm việc này, ta tạo đoạn mã sau:

#!/bin/sh
for i in $(< banned_IPs.cfg) ; do
iptables -I INPUT -i eth1 -s "$i" -j DROP
done 

Lưu đoạn mã trên vào một file với tên bất kì như banned_IPs.sh và gán cho nó quyền thực thi:

# chmod +x banned_IPs.sh

Bây giờ tạo một file banned_IPs.cfg và nhập vào danh sách địa chỉ IP bạn muốn khóa, mỗi cái trên một dòng (ví dụ):

192.168.1.222
192.168.1.123
192.168.1.122 

Bây giờ chạy file banned_IPs.sh để đưa địa chỉ các địa chỉ IP bạn muốn khóa gửi cho iptables “xử lý” big grin

# ./banned_IPs.sh

SHELL SCRIPTS
Cơ chế hoạt động của nó chỉ đơn giản là tìm xem có những IP nào đang thực hiện kết nối dạng SYN_RECV thì sẽ được đưa vào blacklist và khóa lại, cứ 2 phút 1 lần hệ thống sẽ gọi đến file này, nếu như ip đó không thực hiện tấn công SYN Flood nữa thì IP đó sẽ được xóa ra khỏi danh sách cấm.

Shell này gồm 3 file:

Files blocked.ips, đây chỉ đơn giản là 1 file text bạn chỉ việc tạo ra nó bằng lênh vi bình thường, nội dung trắng, nó được dùng để làm nơi lưu những IP bị nghi ngờ đang DOS.

File iptables.sh, có nội dung:

#!/bin/bash
IPT=/sbin/iptables
SPAMLIST=”spamlist”
SPAMDROPMSG=”SPAM LIST DROP”
BADIPS=$(egrep -v -E “^#|^$” /root/iptables/blocked.ips)
# create a new iptables list
$IPT -N $SPAMLIST
for ipblock in $BADIPS
do
$IPT -A $SPAMLIST -s $ipblock -j LOG –log-prefix “$SPAMDROPMSG”
$IPT -A $SPAMLIST -s $ipblock -j DROP
done
$IPT -I INPUT -j $SPAMLIST
$IPT -I OUTPUT -j $SPAMLIST
$IPT -I FORWARD -j $SPAMLIST 

Tác dụng của file này là đọc các IP bị cấm trong file blocked.ips và thực hiện cấm đối với những IP này và đưa vào log để tiện theo dõi.

Cuối cùng là file autoblock.sh, Nội dung của file này:

#!/bin/bash
/etc/init.d/iptables start
cd /root/iptables
netstat -atun | grep SYN_RECV | awk ‘{print $5}’ | cut -d: -f1 |sort | uniq -d | sort -n > blocked.ips
sh ./iptables.sh 

Tác dụng của file này là tìm xem có những IP nào đang gửi các gói tin dạng SYN_RECV, và đưa những IP này vào file blocked.ips, sau đó gọi file iptables.sh để khóa IP.
Cách triển khai: Tất cả 3 file này chúng ta lưu vào một thư mục, ở đây tôi lưu vào /root/iptables và được chmod cho phép thực thi, thường mọi người hay chmod 777
Sau đó chúng ta khai báo vào Crontab

*/2 * * * * /root/iptables/autoblock.sh

Firewall – DDOS – Flood – Some Protection

DDOS Protection là một vấn đề nan giải và thường xuyên được nhắc đến đới với các hệ thống website và máy chủ. Sau đây là một cách phòng chống cũng khá hữu hiệu cho .

1. tạo 1 file theo đường dẫn sau:

cd /etc/init.d/
vi firewall.sh

2. Sửa file firewall.sh và copy tất cả những dòng sau vào file firewall.sh:

#!/bin/bash

########################################
# Firewall #
########################################

# Variaveis

# Interface Externa (YOUR NETWORK INTERFACE)
if_ext=eth0

# Politica Default – DROP

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# ————————————————

# Protection against TCP syncookies
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# Ignore ICMP
echo “1″ > /proc/sys/net/ipv4/icmp_echo_ignore_all

# Allow access to localhost
iptables -I INPUT -p all -s 127.0.0.1 -j ACCEPT

# Allow connections from origin
iptables -I INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

# Allow external access to ports
iptables -I INPUT -i $if_ext -p tcp –dport 80 -j ACCEPT # HTTP
iptables -I INPUT -i $if_ext -p tcp –dport 7171 -j ACCEPT # TIBIA
iptables -I INPUT -i $if_ext -p tcp –dport 7172 -j ACCEPT # TIBIA GAME PORT

# Limit connections on Tibia Ports
iptables -A INPUT -p tcp -m recent –rcheck –seconds 60 -j REJECT
iptables -A INPUT -p tcp –dport 7171 -m connlimit –connlimit-above 10 -m recent –set -j REJECT
iptables -A INPUT -p tcp –dport 7172 -m connlimit –connlimit-above 10 -m recent –set -j REJECT

# Allow SSH (PUTTY)
iptables -I INPUT -i $if_ext -p tcp –dport 22 -j ACCEPT

# Limit connections
iptables -I INPUT -p tcp -m state –state NEW,ESTABLISHED -m recent –set -j ACCEPT
iptables -I INPUT -p tcp -m state –state NEW -m recent –update –seconds 3 –hitcount 20 -j DROP

# Block TCP-CONNECT scan attempts (SYN bit packets)
#iptables -A INPUT -p tcp –syn -j DROP

# Block TCP-SYN scan attempts (only SYN bit packets)
iptables -A INPUT -m conntrack –ctstate NEW -p tcp –tcp-flags SYN,RST,ACK,FIN,URG,PSH SYN -j DROP

# Block TCP-FIN scan attempts (only FIN bit packets)
iptables -A INPUT -m conntrack –ctstate NEW -p tcp –tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN -j DROP

# Block TCP-ACK scan attempts (only ACK bit packets)
iptables -A INPUT -m conntrack –ctstate NEW -p tcp –tcp-flags SYN,RST,ACK,FIN,URG,PSH ACK -j DROP

# Block TCP-NULL scan attempts (packets without flag)
iptables -A INPUT -m conntrack –ctstate INVALID -p tcp –tcp-flags ! SYN,RST,ACK,FIN,URG,PSH SYN,RST,ACK,FIN,URG,PSH -j DROP

#Block “Christmas Tree” TCP-XMAS scan attempts (packets with FIN, URG, PSH bits)
iptables -A INPUT -m conntrack –ctstate NEW -p tcp –tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN,URG,PSH -j DROP

# Block DOS – Teardrop
iptables -A INPUT -p UDP -f -j DROP

# Block DDOS – Smurf
iptables -A INPUT -m pkttype –pkt-type broadcast -j DROP
iptables -A INPUT -p ICMP –icmp-type echo-request -m pkttype –pkttype broadcast -j DROP
iptables -A INPUT -p ICMP –icmp-type echo-request -m limit –limit 3/s -j ACCEPT

# Block DDOS – SYN-flood
iptables -A INPUT -p TCP –syn -m iplimit –iplimit-above 9 -j DROP

# Block DDOS – SMBnuke
iptables -A INPUT -p UDP –dport 135:139 -j DROP
iptables -A INPUT -p TCP –dport 135:139 -j DROP

# Block DDOS – Jolt
iptables -A INPUT -p ICMP -f -j DROP

# Block DDOS – Fraggle
iptables -A INPUT -p UDP -m pkttype –pkt-type broadcast -j DROP
iptables -A INPUT -p UDP -m limit –limit 3/s -j ACCEPT

# Creates logs of the rest of the connections
iptables -A INPUT -i $if_ext -p all -j LOG –log-prefix ” – FIREWALL: droped -> “

3. Lưu file lại và chạy những lệnh sau:

chmod +x firewall.sh

– Bây giờ khởi động nó :

update-rc.d firewall.sh defaults
– Bây giờ bạn có thể thực thi tường lửa của bạn với lệnh này.
sh firewall.sh
Bạn có thể xem các bản ghi DROP trên:

cat /var/log/messages
Print Friendly

Comments

comments

Bài viết liên quan