>>> 此貼的回復 >> 現在沒有能很好抵御syn-flood的方式吧. 對層的概念仍然不很明朗,所以... 不管如何都會塞住帶寬...以及路由的低效.... 不熟悉,請指教........
>>> 此貼的回復 >> DDOS是不能防御的,SYN-FLOOD屬於DOS,可以防御的
>>> 此貼的回復 >> 我見到比較好的方法是用防火牆 先由防火牆建立連接經過三次握手再傳給服務器對付syn flood
>>> 此貼的回復 >> 呵呵,其實我也是不懂的,對協議了解不深刻. 一般的syn flood 是大量的客戶端去連接服務器.建立一次握手後就不再繼續,於是服務器等待超時. 如果大量的sys連接的話就會造成服務器壓力或者連接數滿而達到目的. 可以用防火牆來先與客戶端建立連接,達到三次握手的才傳給服務器,減輕服務器壓力.但必須好的防火牆啊,他本身就會成為弱點. 還有可以多服務器分時,由防火牆分別按算法發配請求.
>>> 此貼的回復 >> 是這樣的,當我們發現被DOS攻擊以後怎麼辦呢? 如何確定是否被DOS攻擊呢? netstat -an,查看ESTABLISHED數,然後禁掉該IP
SHELL思想也類似,寫一個SHELL,讓CROND每分鐘運行一次 SHELL去檢查ESTABLISHED數量,然後統計某ESTABLISHED數量最高的IP 然後向iptables裡-I INPUT一條-s IP --p tcp --dport PORT -j DROP
也就是說,讓防火牆具有自動更改規則的動態機制
這個想法可行嗎?
>>> 此貼的回復 >> iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT 應該是可以的。
>>> 此貼的回復 >> iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 這句是有的,否則防火牆不允許其他人連接,我的默認規則是DROP,所以必須加這個,問題是已經加了,但不能防止SYN攻擊
>>> 此貼的回復 >> purge覺得這是一個方法,思路的問題。以前看到過這樣的討論。
比如,可以這樣:
做防火牆的機子收到客戶端的SYN包時,直接轉發給服務器;
然後,收到服務器回應的SYN/ACK包後,一方面將SYN/ACK包轉發給客戶端,不去管它; 另一方面以客戶端的名義給服務器回送一個ACK包,完成TCP的三次握手;這樣,可以使服務器完成連接狀態。
當客戶端真正的ACK包到達時,有數據則轉發給服務器,否則丟棄該包。 理由是:服務器能承受連接狀態要比半連接狀態高得多,所以這種方法能有效地減輕對服務器的攻擊。
沒有實踐過,但是這是一個思路。
>>> 此貼的回復 >> 參見OpenBSD中pf的synproxy動作,例如: pass in on $ext_if proto tcp from any to $web_server port www flags S/SA synproxy state
>>> 此貼的回復 >> 也不穩妥吧。 SYN半連接DOS,不是看消耗的資源多不多,而是到一定半連接數量時,服務器就不會接受SYN請求,這樣來做到DOS,這個時候服務器資源占用的並不多。但你提出的完成握手,這樣的話,系統很快可能達到進程/線程上限,整個系統的資源將有可能耗盡,比上一種情況更危險。 我是這麼理解的 :)