天天看點

DDOS攻擊 防禦方案

https://blog.csdn.net/weixin_37202689/article/details/72843355 一、DDOS認識

    分布式拒絕服務(DDoS:Distributed Denial of Service)攻擊指借助于客戶/伺服器技術,将多個計算機聯合起來作為攻擊平台,對一個或多個目标發動DDoS攻擊,進而成倍地提高拒絕服務攻擊的威力。

========================================================================================================= 二、DDOS防範

1、一般的DDOS攻擊可以修改/proc/sys/net/ipv4/tcp_max_syn_backlog裡的參數就行了,預設參數一般都很小,設為8000以上,一般的DDOS攻擊就可以解決了。

2、如果上升到timeout階段,可以将/proc/sys/net/ipv4/tcp_fin_timeout設小點。

3、比較徹底的解決方法是添置硬體防火牆。不過,硬體防火牆價格比較昂貴。可以考慮利用

Linux

系統本身提供的防火牆功能來防禦。

①防止syn攻擊(DDOOS攻擊的一種)

 代碼如下

iptables -I INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT

iptables -I FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT防止同步包洪水(Sync Flood)

②防止各種端口掃描

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

③Ping洪水攻擊(Ping of Death)

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

④、Linux下設定

如果你的伺服器配置不太好,TCPTIME_WAIT套接字數量達到兩、三萬,伺服器很容易被拖死。通過修改Linux核心參數,可以減少伺服器的TIME_WAIT套接字數量。

TIME_WAIT檢視指令: netstat-an | grep "TIME_WAIT" | wc -l 

在Linux下,如CentOS,可以通過修改/etc/sysctl.conf檔案來達到目的。

檢視SYN相關的配置

/sbin/sysctl -a |grep syn

vim /etc/sysctl.conf

增加以下幾行:以下是代碼片段:

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_keepalive_time = 1200

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.ip_local_port_range = 1024 65000

net.ipv4.tcp_max_syn_backlog = 2048

net.ipv4.tcp_max_tw_buckets = 5000

net.ipv4.tcp_synack_retries = 3

net.ipv4.tcp_syn_retries = 3

net.ipv4.tcp_fin_timeout                       修改系統預設的TIMEOUT 時間。

net.ipv4.tcp_keepalive_time= 1200              表示當keepalive起用的時候,TCP發送keepalive消息的頻度。預設是2小時,改為20分鐘。

net.ipv4.tcp_syncookies= 1                      表示開啟SYNCookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,預設為0,表示關閉;

net.ipv4.tcp_tw_reuse= 1                       表示開啟重用。允許将TIME-WAIT sockets重新用于新的TCP連接配接,預設為0,表示關閉;

net.ipv4.tcp_tw_recycle= 1                     表示開啟TCP連接配接中TIME-WAIT sockets的快速回收,預設為0,表示關閉;

net.ipv4.ip_local_port_range= 10000 65000         表示用于向外連接配接的端口範圍。預設情況下很小:32768到61000,改為10000到65000。(注意:這裡不要将最低值設的太低,否則可能會占用掉正常的端口!)

net.ipv4.tcp_max_syn_backlog= 8192             表示SYN隊列的長度,預設為1024,加大隊列長度為8192,可以容納更多等待連接配接的網絡連接配接數。

net.ipv4.tcp_max_tw_buckets= 5000             表示系統同時保持TIME_WAIT的最大數量,如果超過這個數字,TIME_WAIT将立刻被清除并列印警告資訊。預設為180000,改為5000。對于Apache、Nginx等伺服器,上幾行的參數可以很好地減少TIME_WAIT套接字數量,但是對于 Squid,效果卻不大。此項參數可以控制TIME_WAIT的最大數量,避免Squid伺服器被大量的TIME_WAIT拖死。

net.ipv4.tcp_synack_retries                      為了打開對端的連接配接,核心需要發送一個SYN并附帶一個回應前面一個SYN的ACK。也就是所謂三次握手中的第二次握手。這個設定決定了核心放棄連接配接之前發送SYN+ACK包的數量。

net.ipv4.tcp_syn_retries                         在核心放棄建立連接配接之前發送SYN包的數量

加大SYN隊列長度可以容納更多等待連接配接的網絡連接配接數,打開SYN Cookie功能可以阻止部分SYN攻擊,降低重試次數也有一定效果。

三、檢測SYN攻擊

1、# netstat -n -p -t

tcp0 0 10.11.11.11:23124.173.152.8:25882 SYN_RECV-

tcp0 0 10.11.11.11:23236.15.133.204:2577 SYN_RECV-

tcp0 0 10.11.11.11:23127.160.6.129:51748 SYN_RECV-

LINUX系統中看到的,很多連接配接處于SYN_RECV狀态(在WINDOWS系統中是SYN_RECEIVED狀态),源IP位址都是随機的,表明這是一種帶有IP欺騙的SYN攻擊。

2、# netstat -n -p -t | grep SYN_RECV | grep :80 | wc -l

324

檢視在LINUX環境下某個端囗的未連接配接隊列的條目數,顯示TCP端囗22的未連接配接數有324個,雖然還遠達不到系統極限,但應該引起管理者的注意。

3、# netstat -na | grep SYN_RECV

tcp 0 0 58.193.192.20:80 221.0.108.162:32383 SYN_RECV

tcp 0 0 58.193.192.20:80 125.85.118.231:2601 SYN_RECV

tcp 0 0 58.193.192.20:80 222.242.171.215:2696 SYN_RECV

tcp 0 0 58.193.192.20:80 116.52.10.51:2629 SYN_RECV

tcp 0 0 58.193.192.20:80 218.171.175.157:1117

4、# netstat -na | grep SYN_RECV |wc

11 66 979

四、SYN配置

1、檢視系統SYN相關的配置

# /sbin/sysctl -a | grep syn

net.ipv6.conf.default.max_desync_factor = 600

net.ipv6.conf.all.max_desync_factor = 600

net.ipv6.conf.eth0.max_desync_factor = 600

net.ipv6.conf.lo.max_desync_factor = 600

net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv = 60

net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent = 120

net.ipv4.tcp_max_syn_backlog = 1280

net.ipv4.tcp_synack_retries = 2

net.ipv4.tcp_syn_retries = 5

fs.quota.syncs = 18

2、SYN相關配置

防範SYN攻擊設定,縮短SYN-Timeout時間:

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

iptables -A INPUT -i eth0 -m limit –limit 1/sec –limit-burst 5 -j ACCEPT

每秒最多3個 syn 封包進入表達為 :

iptables -N syn-flood

iptables -A INPUT -p tcp –syn -j syn-flood

iptables -A syn-flood -p tcp –syn -m limit –limit 1/s –limit-burst 3 -j RETURN

iptables -A syn-flood -j REJECT

#設定syncookies:

sysctl -w net.ipv4.conf.all.send_redirects=0

sysctl -w net.ipv4.conf.all.accept_redirects=0

sysctl -w net.ipv4.conf.all.forwarding=0

/sbin/sysctl -w net.ipv4.conf.default.accept_source_route=0 # 禁用icmp源路由選項

/sbin/sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 # 忽略icmp ping廣播包,應開啟

/sbin/sysctl -w net.ipv4.icmp_echo_ignore_all=1 # 忽略所有icmp ping資料,覆寫上一項

五、受到DDOS攻擊後,如何處理和切換 1、使用iptables屏蔽攻擊IP

首先使用以下代碼,找出攻擊者IP

netstat -ntu | awk'{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

以下指令将顯示所有打開你的伺服器的活躍連接配接,如果它顯示連接配接超過500,那麼将肯定有問題。

使用以下代碼顯示連接配接到80段口的活躍的網絡連接配接

netstat -n | grep:80 |wc -l

以下指令結果是100或以上,那麼伺服器可能被同步攻擊。

netstat -n | grep:80 | grep SYN |wc -l

一旦你獲得了攻擊你的伺服器的IP清單,你可以很容易地阻止它。

使用下面的指令來阻止IP或任何其他特定的IP:

route addipaddress reject

一旦你在伺服器上阻止了一個特定IP的通路,你可以檢查對它的阻止是否有效

通過使用下面的指令:

route -n |grepIPaddress

當你發現攻擊你伺服器的IP你可以使用下面的指令來關閉他們的連接配接:

iptables -A INPUT1 -s $IPADRESS -j DROP/REJECT

請注意你必須用你使用netstat指令找到的IP數替換$IPADRESS

service iptablesrestart

service iptablessave

上面的指令執行後,停止httpd連接配接,重新開機httpd服務

使用下面的指令:

killall -KILLhttpd

service httpdstartssl

2、軟體解決 ㈠、使用DDoS deflate+iptables

DDoS deflate是一款免費的用來防禦和減輕DDoS攻擊的腳本。它通過netstat監測跟蹤建立大量網絡連接配接的IP位址,在檢測到某個結點超過預設的限制時,該程式會通過APF或IPTABLES禁止或阻擋這些IP.

安裝DDoS deflate

wget http://www.inetbase.com/scripts/ddos/install.sh //下載下傳DDoSdeflate

chmod 0700 install.sh //添權重限

./install.sh //執行

配置DDoS deflate

下面是DDoS deflate的預設配置位于/usr/local/ddos/ddos.conf,預設如下:

##### Paths of thescript and other files

PROGDIR="/usr/local/ddos"

PROG="/usr/local/ddos/ddos.sh"

IGNORE_IP_LIST="/usr/local/ddos/ignore.ip.list" //IP位址白名單

CRON="/etc/cron.d/ddos.cron" //定時執行程式

APF="/etc/apf/apf"

IPT="/sbin/iptables"

##### frequency inminutes for running the script

##### Caution: Every time this setting is changed, run the script with --cron

##### option so that the new frequency takes effect

FREQ=1 //檢查時間間隔,預設1分鐘

##### How manyconnections define a bad IP? Indicate that below.

NO_OF_CONNECTIONS=150 //最大連接配接數,超過這個數IP就會被屏蔽,一般預設即可

##### APF_BAN=1(Make sure your APF version is atleast 0.96)

##### APF_BAN=0 (Uses iptables for banning ips instead of APF)

APF_BAN=1 //使用APF還是iptables。推薦使用iptables,将APF_BAN的值改為0即可。

##### KILL=0 (BadIPs are'nt banned, good for interactive execution of script)

##### KILL=1 (Recommended setting)

KILL=1 //是否屏蔽IP,預設即可

##### An email issent to the following address when an IP is banned.

##### Blank would suppress sending of mails

EMAIL_TO="root" //當IP被屏蔽時給指定郵箱發送郵件,推薦使用,換成自己的郵箱即可

##### Number ofseconds the banned ip should remain in blacklist.

BAN_PERIOD=600 //禁用IP時間,預設600秒,可根據情況調整

使用者可根據給預設配置檔案加上的注釋提示内容,修改配置檔案。

檢視/usr/local/ddos/ddos.sh檔案的第117行

netstat -ntu | awk‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -nr > $BAD_IP_LIST

修改為以下代碼即可!

netstat -ntu | awk‘{print $5}’ | cut -d: -f1 | sed -n ‘/[0-9]/p’ | sort |uniq -c | sort -nr > $BAD_IP_LIST

測試

防ddos攻擊效果

NO_OF_CONNECTIONS=3

#這裡為了友善測試,設定為3。生産環境下,幾十到幾百都可以了解為正常,上千肯定就是不正常了,除非是應用内部各個伺服器之間的通信

通過一台固定ip的機器ssh連接配接該伺服器,當連接配接到超過3甚至更多時,不會立刻顯示連不上,因為ddos.sh預設一分鐘運作一次,當過不到一分鐘時,會發現連接配接掉了,檢視部署了防ddos軟體的伺服器上可以看到iptables的政策中多了:

DROP all --31.210.16.29.broad.cs.gd.dynamic.163data.com.cn anywhere

說明确實生效了,當10分鐘後,iptables上這條政策會被取消的

關于如何檢視單個IP的連接配接數目可以通過如下指令檢視,依次排列:

netstat -na|grep ESTABLISHED|awk'{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -r -n

..............

40 127.0.0.1

1 121.9.252.28

1 173.117.140.69

ddos攻擊很常見,攻擊效果也很好,比如像前段時間由于維基創始人引發的那次大範圍的攻擊。

如果有專門防止ddos的硬體裝置的話最好,沒有的話就利用DDoS-Deflate結合iptables在一定程度上防範ddos攻擊也是一種很好的政策。

㈡、使用 智能 dns解析,自動解析到好的伺服器

需要在dnspod.cn購買

㈢、使用負載均衡

兩台或兩台伺服器以上,LVS+Keepalive或LVS+heartbeat實作雙機或多機熱備

1、syn攻擊

[if !supportLists]A.1 [endif]

SYN Flood攻擊

此種攻擊經過抓包分析可以看到,大量的syn請求發向目标位址,而syn包的源位址為大量的随機生成的虛假位址。

DDOS攻擊 防禦方案

在目标主機上使用netstat–an指令可以看到大量syn連接配接,處于syn_received狀态

DDOS攻擊 防禦方案

2、ack攻擊

此種攻擊方式為攻擊主機向目标主機發送大量含有ack标志位的包,目标主機向攻擊主機回複rst标志位的包;或者攻擊主機向目标主機發送大量的psh+ack标志位的包,目标主機直接丢棄,最終導緻目标主機性能嚴重下降。抓包結果如下;

DDOS攻擊 防禦方案

3、ICMP攻擊

DDOS攻擊 防禦方案

4、UDP攻擊

此種攻擊由攻擊主機向目标主機未開放端口發送大量udp資料包,目标主機直接丢棄,并回複icmp不可達資訊,消耗目标主機資源

DDOS攻擊 防禦方案

5、DNS攻擊

DDOS攻擊 防禦方案

6、Connection-Flood 和 URL Get Flood

DDOS攻擊 防禦方案
防護方式:

LINUX:

編輯/etc/sysctl.conf,添加以下參數

#增加連接配接數: net.ipv4.tcp_max_syn_backlog = 2048 #檢查 syncookies 值: net.ipv4.tcp_syncookies = 1 #減少重新連接配接次數: net.ipv4.tcp_synack_retries = 2 #發送keepalive消息間隔時間修改: net.ipv4.tcp_keepalive_time = 300 #會話結束等待時間修改: net.ipv4.tcp_fin_timeout = 20 #TCP檢測連接配接中斷的數量修改: net.ipv4.tcp_keepalive_probes = 4 #把不符合rfc1377文檔的包丢棄: net.ipv4 . tcp_rfc1337 = #加快接收用戶端的連接配接速度: net.ipv4.tcp_abort_on_overflow = 1 windows: Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]

#關閉無效網關的檢查。當伺服器設定了多個網關,這樣在網絡不通暢的時候系統會嘗試連接配接第二個網關,通過關閉它可以優化網絡。

"EnableDeadGWDetect"=dword:00000000

#禁止轉發廣播包。

"ForwardBroadcasts"=dword:00000000

#禁止響應ICMP重定向封包。此類封包有可能用以攻擊,是以系統應該拒絕接受ICMP重定向封包。

"EnableICMPRedirect"=dword:00000000

#不允許釋放NETBIOS名。當攻擊者發出查詢伺服器NETBIOS名的請求時,可以使伺服器禁止響應。

#注意系統必須安裝SP2以上

"NoNameReleaseOnDemand"=dword:00000001

#發送驗證保持活動資料包。該選項決定TCP間隔多少時間來确定目前連接配接還處于連接配接狀态,不設該值,則系統每隔2小時對TCP是否有閑置連接配接進行檢查,這裡設定時間為5分鐘。

"KeepAliveTime"=dword:000493e0

#禁止進行最大包長度路徑檢測。該項值為1時,将自動檢測出可以傳輸的資料包的大小,可以用來提高傳輸效率,如出現故障或安全起見,設項值為0,表示使用固定MTU值576bytes。

"EnablePMTUDiscovery"=dword:00000000

#啟動syn攻擊保護。預設項值為0,表示不開啟攻擊保護,項值為1和2表示啟動syn攻擊保護,設成2之後安全級别更高,對何種狀況下認為是攻擊,則需要根據下面的TcpMaxHalfOpen和TcpMaxHalfOpenRetried值設定的條件來觸發啟動了。這裡需要注意的是,NT4.0必須設為1,設為2後在某種特殊資料包下會導緻系統重新開機。

"SynAttackProtect"=dword:00000002

#同時允許打開的半連接配接數量。所謂半連接配接,表示未完整建立的TCP會話,用netstat指令可以看到呈SYN_RCVD狀态的就是。這裡使用微軟建議值,伺服器設為100,進階伺服器設為500。建議可以設稍微小一點。

"TcpMaxHalfOpen"=dword:00000064

#判斷是否存在攻擊的觸發點。這裡使用微軟建議值,伺服器為80,進階伺服器為400。

"TcpMaxHalfOpenRetried"=dword:00000050

#設定等待SYN-ACK時間。預設項值為3,預設這一過程消耗時間45秒。項值為2,消耗時間為21秒。項值為1,消耗時間為9秒。最低可以設為0,表示不等待,消耗時間為3秒。這個值可以根據遭受攻擊規模修改。微軟站點安全推薦為2。

"TcpMaxConnectResponseRetransmissions"=dword:00000001

#設定TCP重傳單個資料段的次數。預設項值為5,預設這一過程消耗時間240秒。微軟站點安全推薦為3。

"TcpMaxDataRetransmissions"=dword:00000003

#設定syn攻擊保護的臨界點。當可用的backlog變為0時,此參數用于控制syn攻擊保護的開啟,微軟站點安全推薦為5。

"TCPMaxPortsExhausted"=dword:00000005

#禁止IP源路由。預設項值為1,表示不轉發源路由包,項值設為0,表示全部轉發,設定為2,表示丢棄所有接受的源路由包,微軟站點安全推薦為2。

"DisableIPSourceRouting"=dword:0000002

#限制處于TIME_WAIT狀态的最長時間。預設為240秒,最低為30秒,最高為300秒。建議設為30秒。

"TcpTimedWaitDelay"=dword:0000001e

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters]

#增大NetBT的連接配接塊增加幅度。預設為3,範圍1-20,數值越大在連接配接越多時提升性能。每個連接配接塊消耗87個位元組。

"BacklogIncrement"=dword:00000003

#最大NetBT的連接配接快的數目。範圍1-40000,這裡設定為1000,數值越大在連接配接越多時允許更多連接配接。

"MaxConnBackLog"=dword:000003e8

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Afd\Parameters]

#配置激活動态Backlog。對于網絡繁忙或者易遭受SYN攻擊的系統,建議設定為1,表示允許動态Backlog。

"EnableDynamicBacklog"=dword:00000001

#配置最小動态Backlog。預設項值為0,表示動态Backlog配置設定的自由連接配接的最小數目。當自由連接配接數目低于此數目時,将自動的配置設定自由連接配接。#預設值為0,對于網絡繁忙或者易遭受SYN攻擊的系統,建議設定為20。

"MinimumDynamicBacklog"=dword:00000014

#最大動态Backlog。表示定義最大"準"連接配接的數目,主要看記憶體大小,理論每32M記憶體最大可以增加5000個,這裡設為20000。

"MaximumDynamicBacklog"=dword:00002e20

#每次增加的自由連接配接資料。預設項值為5,表示定義每次增加的自由連接配接數目。對于網絡繁忙或者易遭受SYN攻擊的系統,建議設定為10。

"DynamicBacklogGrowthDelta"=dword:0000000a

#禁用任務分派。任務分派是NDIS5.0将原本由處理器進行的TCP中IPSEC加密和校驗和計算的任務配置設定給網卡來做,這樣可以顯著提升系統的性能。但在某些情況下,比如ISA Server 2004可能會出現被SYNflood攻擊時連接配接不穩定現象。在SYN攻擊保護模式中,ISA沒有正确的進行任務分派,結果校驗和崩潰,然後不能建立新的TCP連接配接。隻要禁止任務分派就可以解決這個問題。

"DisableTaskOffload"=dword:00000001

#--------------------------------------------------------------------------------------------------------------------------

#以下部分需要根據實際情況手動修改

#[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]

#啟用網卡上的安全過濾

#"EnableSecurityFilters"=dword:00000001

#同時打開的TCP連接配接數,這裡可以根據情況進行控制。

#"TcpNumConnections"=

#該參數控制 TCP 報頭表的大小限制。在有大量 RAM 的機器上,增加該設定可以提高 SYN 攻擊期間的響應性能。

#"TcpMaxSendFree"=

#[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{自己的網卡接口}]

#禁止路由發現功能。ICMP路由通告封包可以被用來增加路由表紀錄,可以導緻攻擊,是以禁止路由發現。

#"PerformRouterDiscovery "=dword:00000000 

繼續閱讀