天天看點

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字眼【不篩選的話好多的,展示不了】

[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規則去處理,進行丢棄,這樣就實作了對資料包的限速問題。