syn攻擊原理與防護措施
阿新 • • 發佈:2019-01-03
何為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字眼【不篩選的話好多的,展示不了】
[[email protected]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第二步,修改syn_retries與synack_retries的數值為2或3,設定syn_cookies為1【centeros 7預設為開啟‘1’】= 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
[[email protected]01 ~]# vim /etc/sysctl.conf net.ipv4.tcp_syn_retries這裡解釋一下以上內容的含義: 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= 2 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 1024
iptables -N syn-flood iptables命令解釋: -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規則去處理,進行丟棄,這樣就實現了對資料包的限速問題。-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