1. 程式人生 > >syn攻擊原理與防護措施

syn攻擊原理與防護措施

何為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 
= 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’】
[[email protected]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規則去處理,進行丟棄,這樣就實現了對資料包的限速問題。