Linux Advanced Routing & Traffic Control HOWTO
Prev | Chapter 15. Cookbook | Next

# 15.2. Protecting your host from SYN floods

>From Alexey's iproute documentation, adapted to netfilter and with more plausible paths. If you use this, take care to adjust the numbers to reasonable values for your system.

If you want to protect an entire network, skip this script, which is best suited for a single host.

It appears that you need the very latest version of the iproute2 tools to get this to work with 2.4.0.

    #! /bin/sh -x
    #
    # sample script on using the ingress capabilities
    # this script shows how one can rate limit incoming SYNs
    # Useful for TCP-SYN attack protection. You can use
    # IPchains to have more powerful additions to the SYN (eg
    # in addition the subnet)
    #
    #path to various utilities;
    #change to reflect yours.
    #
    TC=/sbin/tc
    IP=/sbin/ip
    IPTABLES=/sbin/iptables
    INDEV=eth2
    #
    # tag all incoming SYN packets through $INDEV as mark value 1
    ############################################################
    $iptables -A PREROUTING -i $INDEV -t mangle -p tcp --syn \
      -j MARK --set-mark 1
    ############################################################
    #
    # install the ingress qdisc on the ingress interface
    ############################################################
    $TC qdisc add dev $INDEV handle ffff: ingress
    ############################################################

    #
    #
    # SYN packets are 40 bytes (320 bits) so three SYNs equals
    # 960 bits (approximately 1kbit); so we rate limit below
    # the incoming SYNs to 3/sec (not very useful really; but
    #serves to show the point - 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:

    #deleting the ingress qdisc
    #$TC qdisc del $INDEV ingress

Prev | Home | Next
Running multiple sites with different SLAs | Up | Rate limit ICMP to prevent dDoS