SYN攻擊是最常見又最容易被利用的一種攻擊手法。還記得2000年YAHOO網站遭受的攻擊事例,當時黑客利用的就是簡單而有效的SYN攻擊,有些網絡蠕蟲病毒配合SYN攻擊DDOS的破壞。
TCP握手協議在TCP/IP協議中,TCP協議提供可靠的連接服務,採用三次握手建立一個連接。 第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認; 第二次握手:服務器收到syn包,必須確認客戶的SYN(ack= j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態; 第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。
SYN_RECV 表示正在等待處理的請求數;ESTABLISHED 表示正常數據傳輸狀態;TIME_WAIT 表示處理完畢,等待超時結束的請求數。
SYN_RECV是指,服務端被動開啟後,接收到了客戶端的SYN並且傳送了ACK時的狀態。再進一步接收到客戶端的ACK就進入ESTABLISHED狀態。
TCP SYN Flood是一種常見,而且有效的遠端(遠程)拒絕服務(Denial of Service)攻擊方式,它透過一定的操作破壞TCP三次握手建立正常連線,佔用並耗費系統資源,使得提供TCP服務的主機系統無法正常工作。
tcp_synack_retries默認為5,表示重發5次,每次等待30~40秒,即“半連接”默認hold住大約180秒。
tcp6 0 0 120.115.2.158:80 45.56.69.15:35842 SYN_RECV -
tcp6 0 0 120.115.2.158:80 45.56.69.15:49813 SYN_RECV -
tcp6 0 0 120.115.2.158:80 149.255.109.168:44657 SYN_RECV -
tcp6 0 0 120.115.2.158:80 149.248.55.130:14794 SYN_RECV -
tcp6 0 0 120.115.2.158:80 149.248.55.130:18994 SYN_RECV -
被攻擊了半連接=>hold住180秒,服務器遭受到大量的大量SYN_RECV,80port佔死,網站打不開
最簡易處理方式
echo 1 > /proc/sys/net/ipv4/tcp_synack_retries
cat /proc/sys/net/ipv4/tcp_max_syn_backlog
256
firewall處理並log:
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -f -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -N LOGGING
iptables -A INPUT -j LOGGING
iptables -A LOGGING -p tcp --syn -m limit --limit 1/s -j LOG --log-prefix "SYN_RECV: " --log-level 4
iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
echo 2048 > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo 1 > /proc/sys/net/ipv4/tcp_synack_retries
echo 1 > /proc/sys/net/ipv4/tcp_syn_retries
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
根據log可以找到有問題的ip
cat /var/log/syslog | sed 's/ /\n/g' | grep "SRC=" | sort | uniq -c | sort -g | tail -100
1 SRC=193.169.253.86
1 SRC=45.143.221.27
1 SRC=68.183.216.220
1 SRC=92.63.194.148
4 SRC=120.115.2.240
5 SRC=163.26.120.93
10 SRC=140.164.9.4
15 SRC=120.115.3.107
99 SRC=208.79.240.3
151 SRC=120.115.2.251
162 SRC=37.97.242.72
當一個IP受到SYN_FLOOD攻擊時,因為SYN_RECV的上限是256,所以過長的隊列讓Virtual Host變得不穩定。
所以/proc/sys/net/ipv4/tcp_max_syn_backlog設定為2048
經由log紀錄,此段C class的網段(美國ip)須封鎖
TCP洪水攻擊還沒完美解決方案