閱讀338 返回首頁    go 中電雲集


看我linux如何防SYN攻擊,挺實用的

今天早上一到公司登錄公司官網的時候感覺挺慢,登錄服務器查看官網訪問情況:

[root@web ~]# netstat -anp |awk ‘{print $6}’|sort|uniq -c |sort -rn

172 ESTABLISHED

59 CONNECTED

589 SYN_RECV

15 STREAM

SYN居然這麼高,繼續追查是那些ip發出的SYN:

[root@tweb ~]# netstat -an | grep SYN | awk ‘{print $5}’ | awk -F: ‘{print $1}’ | sort | uniq -c | sort -nr | more

570 x.x.x.x

(ip就不寫出了,是山東棗莊聯通的一個ip),隻是這一個ip就發出了這麼多的syn請求連接,本來我們web服務器的並發數不是很高,這樣一來正常的用戶請求得不到相應,頁麵無法打開。因為硬件防火牆歸集團IT部管理,我沒有權限,所以隻能在本地服務器上做些措施對SYN攻擊進行部分減緩。

首先說一下SYN的攻擊原理:

在TCP/IP協議中,TCP協議提供可靠的連接服務,采用三次握手建立一個連接。

第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;

第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。 完成三次握手,客戶端與服務器開始傳送數據.

如果用戶與服務器發起連接請求隻進行到第二次握手而不再響應服務器,服務器就會不停地等待用戶的確認,如果過多這樣的連接就會把服務器端的連接隊列占滿就會導致正常的用戶無法建立連接。所以我們直接從SYN的連接上進行如下改動:

查看linux默認的syn配置:

[root@web ~]# sysctl -a | grep _syn

net.ipv4.tcp_max_syn_backlog = 1024

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_synack_retries = 5

net.ipv4.tcp_syn_retries = 5

tcp_max_syn_backlog是SYN隊列的長度,加大SYN隊列長度可以容納更多等待連接的網絡連接數。tcp_syncookies是一個開關,是否打開SYN Cookie 功能,該功能可以防止部分SYN攻擊。tcp_synack_retries和tcp_syn_retries定義SYN 的重試連接次數,將默認的參數減小來控製SYN連接次數的盡量少。

以下是我修改後的參數,可以根據自己服務器的實際情況進行修改:

[root@web ~]# more /etc/rc.d/rc.local

#!/bin/sh

# This script will be executed *after* all the other init scripts.

# You can put your own initialization stuff in here if you don’t

# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

ulimit -HSn 65535

/usr/local/apache2/bin/apachectl start

#####

sysctl -w net.ipv4.tcp_max_syn_backlog=2048

sysctl -w net.ipv4.tcp_syncookies=1

sysctl -w net.ipv4.tcp_synack_retries=3

sysctl -w net.ipv4.tcp_syn_retries=3

為了不重啟服務器而使配置立即生效,可以執行

#sysctl -w net.ipv4.tcp_max_syn_backlog=2048

#sysctl -w net.ipv4.tcp_syncookies=1

#sysctl -w net.ipv4.tcp_synack_retries=3

#sysctl -w net.ipv4.tcp_syn_retries=3

也有的人喜歡用訪問控製列表來防止SYN的攻擊,在一定程度上減緩了syn的攻擊:

Syn 洪水攻擊

#iptables -A INPUT -p tcp –syn -m limit –limit 1/s -j ACCEPT

–limit 1/s 限製syn並發數每秒1次

防端口掃描

# iptables -A FORWARD -p tcp –tcp-flags SYN,ACK,FIN,RST RST -m limit –limit 1/s -j ACCEPT

死亡之ping

# iptables -A FORWARD -p icmp –icmp-type echo-request -m limit –limit 1/s -j ACCEPT

#>iptables-save >/etc/sysconfig/iptables

進行查看,#iptables -L

ACCEPT     tcp  –  anywhere             anywhere            tcp flags:FIN,SYN,RST,ACK/SYN limit: avg 1/sec burst 5

ACCEPT     tcp  –  anywhere             anywhere            tcp flags:FIN,SYN,RST,ACK/RST limit: avg 1/sec burst 5

ACCEPT     icmp –  anywhere             anywhere            icmp echo-request limit: avg 1/sec burst 5

再次進行查看syn連接:

[root@web ~]# netstat -an | grep SYN | awk ‘{print $5}’ | awk -F: ‘{print $1}’ | sort | uniq -c | sort -nr | more

20 10.92.10.220

1 125.43.36.199

明顯SYN連接數已經下來了。

本文出自 “趙海華_運維之路” 博客,請務必保留此出處https://baiying.blog.51cto.com/1068039/702840

最後更新:2017-01-04 22:34:55

  上一篇:go 服務器防火牆的選擇
  下一篇:go 如何打開注冊MSWC.Tools、MSWC.Status