• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 一次DOS事件的解決辦法

    發表于:2007-05-26來源:作者:點擊數: 標簽:
    0.分析過程 首先,分析了DOS的類型、特征、攻擊方法。 使用netstat -na|grep SYN_RECV|wc,發現當前存在大量SYN_RECV狀態連接,源地址都是偽造的,netstat -na|grep SYN_RECV|wc顯示數量為1024個,這個是當然, Linux 默認的Syn_Backlog對列就是1024,超過的

    0.分析過程
    首先,分析了DOS的類型、特征、攻擊方法。

    使用netstat -na|grep SYN_RECV|wc,發現當前存在大量SYN_RECV狀態連接,源地址都是偽造的,netstat -na|grep SYN_RECV|wc顯示數量為1024個,這個是當然,Linux默認的Syn_Backlog對列就是1024,超過的SYN都丟棄了。

    針對的攻擊端口是80:WWW服務,當然,Web服務器也已經無法訪問了。

    在打開SYN_Cookie防護之后,攻擊得到了一些緩解,但隨后攻擊流量又增大了,情況也好不到哪兒去,而Linux的Iptables又不能做syn_proxy的,那么只好從其他方面下手,用tcpdump -w抓下了當時的數據流量,計數分析流量大約在1.8w pps左右,其中99%以上都是偽造源地址的syn包。

    既然是偽造地址,那就比較難處理,不過經過仔細的統計和分析,還是分析出了這次攻擊中主要數據的特征,主要有以下幾條:

    代碼:
    1. tcp標志位為 syn 2. ip數據總長為40Byte 3. ip頭中的Identifier字端固定為256(0x0100) 4. TTL值平均分布為 74 - 95之間 5. tcp窗口值固定為16384 6. 目標端口為tcp:80 7. tcp初始化序列號為 17314131xx,按+1累計依次遞增

    這樣,注意看其中的3、4、5幾條,這是對我們來說最重要的線索。
    3. ip identifier字端固定為0x0100,而在TCP/IP規范中,這個字段是為了防止一個連接中的分片包重復而作的包內序列號。雖然大多數操作系統沒有嚴格準循著一條規范,但這個數值的來源卻是確定的,即在正常的TCP/IP堆棧中,這個字段的值應該是發送此數據包是的TCB(TCP控制塊,一個內核空間的TCP數據結構)的序列號。而即使系統也沒有嚴格準循這一條,那么在網絡中傳輸的數據,identifier字段的內容也應該是隨機分布的,正常的操作系統網絡堆棧不可能發送出大量0x0100這樣固定的字段內容來。

    4. TTL值平均分布在74 - 95之間。按照常識也知道,大多數操作系統默認的TTL應該為32、64、128這樣的2的整數次方;而另一個方面,TTL在網絡傳輸的過程中每過一個路由器就會自動減一,而現在的Internet路由設計已經是比較良好的,從任何一點到達Intetnet的另一端,一般來說TTL條數不會超過20-30,這個我也測試過,從國內網通和電信的網絡看來,到達國內和國際的大多數網站,TTL跳數都在20以內,而從Windows的Tracert命令也可以看出--它假設的最大TTL超時條數也只是30。超過30條的正常Internet路由是很罕見的。那么我們來做一個簡單的減法:

    代碼:
    128 - 30 = 98 64 - 30 = 34 32 - 30 = 2

    所以一個數據包,在正常的傳輸過程中,當到達端點時,它的TTL數分布范圍應該是:代碼:

    2 - 32 (罕見)、 34 - 64 、 98 - 128


    而在本次數據采樣中,大多數偽造地址的SYN數據,TTL都在74 - 95之間。

    其他附加特征,例如IP長度、TCP窗口、TCP SYN_Flag等,也可以作為附加判斷標志。這樣我們提取出這次攻擊的主要特征碼為:

    代碼:
    a. tcp syn flag only, dst port 80 b. ip identifier = 0x0100 c. 74 < ttl < 95 d. tcp window = 16384

    這樣四條特征。

    之后就是想辦法過濾了。因為這次沒辦法假設其他的防火墻,只能用系統自身的iptables擋一下,所以效果么......夠麻煩的。


    1. 下載最新版的iptables-1.3.1和patch-o-matic snapshot 。(需要Linux內核
    2.6.10以上版本支持,這一點...Redhat系的所有版本都得重編了。)
    ftp://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/


    解壓iptables和pom;
    運行pom patch腳本,過程中需要輸入iptables和內核源代碼完全路徑;

    代碼:
    # ./runme connlimit u32 TARPIT pkttype length

    編譯和安裝iptables及pom內核模塊。

    代碼:
    # make -C /lib/modules/`uname -r`/build SUBDIRS=net/ipv4/netfilter/ modules # make -C /lib/modules/`uname -r`/build SUBDIRS=net/ipv4/netfilter/ modules_install


    編譯iptables。并手工安裝;

    代碼:
    # make KERNEL_DIR=內核源碼目錄 # cp iptables iptables-save iptables-restore /usr/sbin # cp extensions/*.so /usr/lib/iptables/


    2. 配置內核參數

    代碼:
    ====================================================================== #--以下為sysctl 內核參數設置 #net.ipv4.conf.default.rp_filter = 1 #net.ipv4.conf.all.rp_filter = 1 #net.ipv4.conf.eth1.rp_filter = 1 # 開啟IP源地址驗證,防止IP地址欺騙,在任何情況下都應開啟,默認關閉 for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f done sysctl -w net.ipv4.conf.default.aclearcase/" target="_blank" >ccept_source_route=0 # 禁用icmp源路由選項 sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 # 忽略icmp ping廣播包,應開啟 #sysctl -w net.ipv4.icmp_echo_ignore_all=1 # 忽略所有icmp ping數據,覆蓋上一項 sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1 # 以下一段為抵抗syn flood攻擊,平時建議關閉 sysctl -w net.ipv4.tcp_syncookies=1 # tcp syncookie,默認關閉 sysctl -w net.ipv4.tcp_max_syn_backlog=1280 # syn隊列,默認1024,> 1280可能工作不穩定,需要修改內核源碼參數 sysctl -w net.ipv4.tcp_synack_retries=2 # syn-ack握手狀態重試次數,默認5,遭受syn-flood攻擊時改為1或2 sysctl -w net.ipv4.tcp_syn_retries=2 # 外向syn握手重試次數,默認4 # 以下一段為應對tcp connect連接耗盡攻擊,如果開啟iptables connlimit模塊可禁用 # 有嚴重連接性能影響和不穩定因素,慎用 sysctl -w tcp_tw_recycle=1 # 默認0,tw快速回收 sysctl -w tcp_tw_reuse=1 # 默認0,tw重用 sysctl -w tcp_keepalive_intvl=60 # 默認75,tcp keeplive探測輪詢時間 sysctl -w tcp_keepalive_probes=3 # 默認9,tcp keeplive探測輪詢次數 sysctl -w tcp_keepalive_time=1800 # 默認7200,tcp keeplive時間 sysctl -w tcp_fin_timeout=30 # 默認60,tcp fin狀態超時時間 #sysctl -w net.ipv4.tcp_retries1=2 # tcp連接重傳參數,慎用 #sysctl -w net.ipv4.tcp_retries2=8 sysctl -w net.ipv4.ip_conntrack_max=65535 # 增大iptables狀態跟蹤表

    ======================================================================


    3. 配置iptables規則
    ======================================================================

    代碼:
    #--以下為iptables規則設置-- modprobe ipt_TARPIT modprobe ipt_u32 modprobe ipt_connlimit modprobe ipt_length modprobe ipt_pkttype iptables -N input_ext iptables -F input_ext # 新建iptables隊列 iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state INVALID -j DROP iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # 激活狀態檢測 iptables -A INPUT -i eth0 -j input_ext # 擴展input規則 iptables -A INPUT -j DROP # 默認input規則,丟棄全部 iptables -A input_ext -p tcp -m tcp --dport 80 --tcp-flags SYN,RST,ACK SYN -m u32 --u32 "0x2&0xffff=0x100&&0x5&0xff=0x4a:0x5f" -j DROP # 本次syn-flood攻擊指紋特征,丟棄 iptables -A input_ext -p tcp -m tcp --dport 80 --tcp-flags SYN,RST,ACK SYN -m connlimit --connlimit-above 5 --connlimit-mask 32 -j TARPIT # 防止連接耗盡攻擊,每IP并發連接限制為4 iptables -A input_ext -p tcp -j TARPIT # 防止端口掃描攻擊 iptables -A input_ext -m pkttype --pkt-type broadcast -j DROP # 丟棄廣播數據包 iptables -A input_ext -p icmp -m limit --limit 6/s -m icmp --icmp-type 4 -j ACCEPT # 接受icmp traceroute/echo reply數據,限制流量 5個/秒 iptables -A input_ext -p icmp -m limit --limit 6/s -m icmp --icmp-type 8 -j ACCEPT iptables -A input_ext -p icmp -m length --length 48:256 -j ACCEPT # 限制icmp包大小為 0 - 256Byte,防止大包flood # 實際網絡中如果不用icmp/udp協議,可以直接全部drop

    ======================================================================



    1. 帶寬占滿的情況下,任何防護都是沒用的。
    2. 任何ip數據都是可以偽造的,如果攻擊數據完全采用隨機數發送的話,那么很可能無跡可尋。
    3. 在進行過濾和dos防御的時候,不可避免的會損失一些正常的連接,這個時候,想想80/20規則,
    不要力求完美。
    4. 任何安全防護措施和內核參數的調整,都可能對系統和網絡的穩定性造成一定的負面影響,所以要根據實際情況而定,切勿忙從。
    5. 這個防火墻規則中主要生效的是TCP段和ICMP段,在帶寬未被占滿時可以一定程度防止syn-flood、icmp-flood、tcp-connect-flood類型的DOS。
    但是syn-flood的u32規則是針對這次攻擊的特征所寫的,在應對其他攻擊時不可能完全有效,必須單獨重新分析。
    tcp-connect連接限制,我目前定的是同一ip地址并發5個web連接,防止連接耗盡,在局域網NAT訪問時可能會有些問題,可以根據網絡拓撲情況添加信任規則。
    6. 常見的網絡層dos主要有:
    syn-flood (協議缺陷型)
    ack-flood(stream) (協議缺陷型)
    icmp-flood(smarf) (流量型)
    udp-flood(froogle) (流量型)
    tcp-connect-flood (資源型)
    對于icmp和udp,可以在規則鏈開始就直接丟棄掉;
    對于tcp-flood,可以使用conn-limit限制,效果比較好,但是要注意調整內核參數ip_conntrack的數值,否則可能造成iptables狀態跟蹤表溢出,反而形成拒絕服務;另外,當syn+ack類型的攻擊發生時,本省也會消耗大量的conntrack資源,所以防火墻規則的順序很重要。
    對于syn-flood,最好的方法還是使用bsd pf的syn-proxy,效果不錯,不過這個下次再講吧。
    如果不行的話,可能就只能針對個案進行模式特征分析了。

    再次提醒,防火墻規則配置有風險,一定要根據自己實際情況調整和測試完畢后再上線??梢栽趇nput鏈的-j input_ext規則之前加一條:
    -i INPUT 1 -s 內網地址 -j ACCEPT return之類的語句完全優先信任管理地址。

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>