15.2. ホストを SYN フラッドから守る

Alexey の iproute 文書からとった内容を netfilter に合わせ、 パスを調整したものです。これを用いる場合には、 数値をご自分のシステムにあわせて修正してください。

ネットワーク全体を守りたい場合は、このスクリプトは読み飛ばしてください。 これは単一のホストを守るためのものです。

これを 2.4.0 で動作させるには、最新版の iproute2 が必要なようです。

#! /bin/sh -x
#
# 入口 (ingress) の機能を用いたサンプルスクリプト
# このスクリプトでは、到着する SYN を制限する例を示します。
# TCP-SYN 攻撃に対する防御として有用です。SYN に対してより
# 強力な機能 (例えばサブネットを追加するなど) を追加した
# ければ IPchains を使えます。
#
# いろいろなユーティリティのパス。
# 自分の環境にあわせてください。
#
TC=/sbin/tc
IP=/sbin/ip
IPTABLES=/sbin/iptables
INDEV=eth2
#
# $INDEV に到着した SYN パケットに MARK が 1 のタグを付けます。
############################################################ 
$iptables -A PREROUTING -i $INDEV -t mangle -p tcp --syn \
  -j MARK --set-mark 1
############################################################ 
#
# 入口 qdisc を、この入口インターフェースにインストールします
############################################################ 
$TC qdisc add dev $INDEV handle ffff: ingress
############################################################ 

#
# 
# SYN パケットは 40 バイト (320 ビット) なので、3 つの SYN
# は 960 ビット (およそ 1kビット) になります。よって帯域制限
# として、到着 SYN は 3/秒 にします (実はあまり便利ではあり
# ません。しかし要点は押さえています -JHS
############################################################ 
$TC filter add dev $INDEV parent ffff: protocol ip prio 50 handle 1 fw \
police rate 1kbit burst 40 mtu 9k drop flowid :1
############################################################ 


#
echo "---- qdisc parameters Ingress  ----------"
$TC qdisc ls dev $INDEV
echo "---- Class parameters Ingress  ----------"
$TC class ls dev $INDEV
echo "---- filter parameters Ingress ----------"
$TC filter ls dev $INDEV parent ffff:

# 入口 qdisc を削除します。
#$TC qdisc del $INDEV ingress