SYN_RECV的奇怪連線

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洪水攻擊還沒完美解決方案

Last updated