何為syn攻擊?
先普及下tcp3次握手的知識,在TCP/IP中,tcp協議提供可靠的socket連接服務,通過3次握手建立可靠連接。
tcp3次握手過程:
第一階段:某終端向服務器發送syn(syn=x)請求消息,並進入SYN_SEND狀態
第二階段:服務器收到syn請求后,會回饋給終端synack消息(synack=x+1)和syn消息(syn=y),並進入SYN_RECV狀態
第三階段:終端收到服務器的syn和synack,並向服務器反饋ack消息(ack=y+1),完成3次握手開始傳輸數據。
了解到tcp3次握手之后呢,我們說一下syn攻擊是怎么回事吧。syn其實就是在進行到第二階段結束后,此時服務器不是已經發送了syn消息和synack消息了嗎,這服務器真是個老好人啊,由於tcp3次握手機制,它得等着終端那家伙給它反饋synack消息啊,所以吧,服務器得分配一定的資源等着終端那家伙啊。可是呢,這終端比較壞,不但不回復synack包給服務器,反倒搞一大堆第一階段的syn請求消息。這下服務器可不好過了啊,得騰出好多好多資源給終端留着啊,最后可能就把自己搞死了。這就是所謂的syn攻擊啊,又稱為ddos攻擊。
syn攻擊的防范?
1.通過調整sysctl.conf網絡內核文件
第一步,列出系統現有的sysctl.conf配置並篩選出syn字眼【不篩選的話好多的,展示不了】
[root@centos-linux-01 ~]# sysctl -a|grep syn|grep -v ipv6 sysctl: reading key "net.ipv6.conf.all.stable_secret" sysctl: reading key "net.ipv6.conf.default.stable_secret" sysctl: reading key "net.ipv6.conf.eth0.stable_secret" sysctl: reading key "net.ipv6.conf.lo.stable_secret" fs.quota.syncs = 0 fs.xfs.inherit_sync = 1 fs.xfs.xfssyncd_centisecs = 3000 net.ipv4.tcp_max_syn_backlog = 128 net.ipv4.tcp_syn_retries = 6 net.ipv4.tcp_synack_retries = 5 net.ipv4.tcp_syncookies = 1
第二步,修改syn_retries與synack_retries的數值為2或3,設置syn_cookies為1【centeros 7默認為打開‘1’】
[root@centos-linux-01 ~]# vim /etc/sysctl.conf net.ipv4.tcp_syn_retries = 2 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 1024
這里解釋一下以上內容的含義:
net.ipv4.tcp_syn_retries = 2
【服務器在等待不到終端的確認消息時,syn消息報文會重新發送,需要根據網絡情況盡量減少,如果網絡不好的情況下終端可能會出現連不上服務器的情況】
net.ipv4.tcp_synack_retries = 2
【服務器在等待不到終端的確認消息時,synack消息報文會重新發送,需要根據網絡情況盡量減少,情況和上面一樣】
net.ipv4.tcp_syncookies = 1
【該功能可以防止部分SYN攻擊】
net.ipv4.tcp_max_syn_backlog = 1024
【tcp_max_syn_backlog 是SYN隊列的長度,加大SYN隊列長度可以容納更多等待連接的網絡連接數】
2.通過防火牆編寫高級acl
iptables -N syn-flood iptables -A syn-flood -m limit --limit 50/s --limit-burst 10 -j RETURN iptables -A syn-flood -j DROP iptables -I INPUT -j syn-flood service iptables save
命令解釋:
-N 創建一個條新的鏈
–limit 50/s 表示每秒50次; 1/m 則為每分鍾一次
–limit-burst 表示允許觸發 limit 限制的最大包個數 (預設5),它就像是一個容器,最多裝10個,超過10個就裝不下了,這些包就給后面的規則了
-I INPUT -j syn-flood 把INPUT的包交給syn-flood鏈處理
這里的–limit-burst=10相當於說最開始我有10個可以匹配的包去轉發,然后我匹配的包的個數是根據–limit=50/s進行限制的,也就是每秒限制轉發50個數據包,多余的會被下面符合要求的DROP規則去處理,進行丟棄,這樣就實現了對數據包的限速問題。