web-dev-qa-db-ja.com

最も一般的なDoS攻撃に対抗するためのiptablesルール?

最近、小規模なDoS攻撃がたくさんあります。最も一般的なDoS攻撃に対抗し、通常はWebサーバーをセキュリティで保護するためにどのiptablesルールを使用すればよいか迷っています。

WebサーバーはVarnishをスポーツします-> nginx/php5-> memcached-> mysql

一般的なレシートをいくつか試しましたが、リモートサーバーにあるデータベースサーバーへのアクセスもブロックされるため、提案されたルールをフラッシュするだけで、iptablesにfail2banしか表示されない場合は、素手でボラブルな感じになります。

したがって、最も一般的な攻撃ベクトルをブロックするルールを高く評価してください。

7
alfish

ここに私が使用するいくつかのルールがあります:

# Reject spoofed packets
iptables -A INPUT -s 10.0.0.0/8 -j DROP
iptables -A INPUT -s 169.254.0.0/16 -j DROP
iptables -A INPUT -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP

iptables -A INPUT -s 224.0.0.0/4 -j DROP
iptables -A INPUT -d 224.0.0.0/4 -j DROP
iptables -A INPUT -s 240.0.0.0/5 -j DROP
iptables -A INPUT -d 240.0.0.0/5 -j DROP
iptables -A INPUT -s 0.0.0.0/8 -j DROP
iptables -A INPUT -d 0.0.0.0/8 -j DROP
iptables -A INPUT -d 239.255.255.0/24 -j DROP
iptables -A INPUT -d 255.255.255.255 -j DROP

# Stop smurf attacks
iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p icmp -m icmp -j DROP

# Drop all invalid packets
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP

# Drop excessive RST packets to avoid smurf attacks
iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT

# Attempt to block portscans
# Anyone who tried to portscan us is locked out for an entire day.
iptables -A INPUT   -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP

# Once the day has passed, remove them from the portscan list
iptables -A INPUT   -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove

# These rules add scanners to the portscan list, and log the attempt.
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP
20
Bart De Vos

だからあなたの防弾ルールを感謝します。

ISPに連絡して、トラフィックがバックボーンに到達する前にバックボーンでトラフィックをドロップする必要があります。ファイアウォールでトラフィックをドロップする必要がある場合は、すでに利用可能な帯域幅を消費しており、システムのリソースを使用しています。

それが唯一の「防弾」方法です。

3
MDMarra

FTPとSSHへのアクセスを制限するためにIPtablesを使用していますが、コンピューターのIPがサーバーに接続することを許可しています。 DOS攻撃の問題があったとは言えません。

/sbin/iptables -A INPUT -p tcp --dport 22 -s 86.106.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 22 -s 89.122.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 22 -j DROP

/sbin/iptables -A INPUT -p tcp --dport 21 -s 86.106.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 21 -s 89.122.0.0/16 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 21 -j DROP 

これらのルールは、2つの異なるIP上のポート22と21へのアクセスを許可します。おそらく、dbサーバーのMySQLポートを追加することで、他のクライアントがサーバーに直接接続できないようにすることができます。

編集:サーバーが過負荷の場合、Apacheの「mod-status」の統計を確認すると便利です。出力は次のようになります。 http://www.Apache.org/server-status すべてを確認できますサイトの訪問者、スパイダー、URLリクエストなど。実装には1分もかかりません: http://httpd.Apache.org/docs/2.2/mod/mod_status.html

1
adrianTNT