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