20091124

Настройка ipfw для рабочей станции

Ломает меня всё время писать одно и то же.
Чуть пострадал ерундой и накатал фукции для работы с iptables. теперь конфиг выглядит так:

drop_rulles DROP DROP DROP
block_known_attacks
block_ip "10.0.0.0/8" "172.16.0.0/12"
# запретить переброску любого траффика
$iptf -j DROP
allow_dns $defdns
allow_loopback
allow_established
allow_tcp_in netbios-ssn microsoft-ds
block_local_services 6000:6003 783 331 10000 9050 http https mysql ipp
allow_tcp_out http https ftp ftp-data ssh xmpp-client aol rsync netbios-ssn microsoft-ds
allow_icmp_type_io parameter-problem source-quench echo-reply echo-request


Намного приятнее, чем много строк нечитаемого текста.
Разумеется, для этого пришлось повозиться.
Далее идет файл для упрощенной работы с ip-таблицами.
Вверху функции, внизу правила.
Огромную часть занимают функции, но благодаря им довольно-таки приличная настройка становится возможной за 10-12 строк читаемого текста. При этом никто не мешает добавлять специфические правила прямыми вызовами iptables





#!/bin/bash
###
### Конфигурация IPTABLES
###
###

#####################################
### Функции

###
# очистка правил ipfw
# политики Input Output Forward
#
# drop_rulles INPUT_POL OUTPUT_POL FORWARD_POL
#
###
drop_rulles()
{
    echo $0

    $ipt -F
    $ipt -X
    $ipt -P INPUT $1
    $ipt -P OUTPUT $2
    $ipt -P FORWARD $3
    $ipt -N BAD_IPS
    $ipt -F BAD_IPS
    $ipti -j BAD_IPS
    $ipto -j BAD_IPS
    $iptf -j BAD_IPS

}

##
# защита от известных атак
##
block_known_attacks()
{
    echo $0
    #syn-флад
    $iptit ! --syn -m state --state NEW -j DROP
    $iptot ! --syn -m state --state NEW -j DROP
    #udp-флад
    $iptiu -s 0/0 --destination-port 138 -j DROP
    $iptiu -s 0/0 --destination-port 113 -j REJECT

    # фрагментиованные icmp
    $iptiiall -f -j DROP
    $iptoiall -f -j DROP
    $iptfiall -f -j DROP
    # фрагментированные udp
    $iptiu -f -j DROP
    $iptou -f -j DROP
    $iptfu -f -j DROP
   
    # запретить внешние подключения к lo
    $ipti -s 127.0.0.1/255.0.0.0  ! -i lo -j DROP

    # запретить пакеты, которые нельзя идентифицировать
    $ipti -m state --state INVALID -j DROP
    $ipto -m state --state INVALID -j DROP
    $iptf -m state --state INVALID -j DROP
}

##
# разрешить работу с dns-сервером, указанным в параметре
##
allow_dns ()
{
   echo  $0
    $iptiu -s $1 --sport domain $despriports -j ACCEPT
    $iptou -d $1 --dport domain $sunpriports -j ACCEPT
    $iptfu -d $1 --dport domain $sunpriports -j ACCEPT

    $iptit -s $1 --sport domain $despriports -j ACCEPT
    $iptot -d $1 --dport domain $sunpriports -j ACCEPT
    $iptft -d $1 --dport domain $sunpriports -j ACCEPT
       
}


##
# Запретить доступ к локальным сервисам
# по сути к указанным портам
##
block_local_services ()
{
    echo $0
   for i in $@; do {
       ${iptit} -m multiport ! -i lo -j DROP --dports $i
    }; done
}



##
# разрешить входящие icmp определенного типа
##
allow_icmp_type_i () {
   echo $0
   for i in $@; do {
       $iptii $i -j ACCEPT
   }; done
}

##
# разрешить исходящие icmp определенного типа
##
allow_icmp_type_o () {
   echo $0
   for i in $@; do {
       $iptoi $i -j ACCEPT
   }; done
}

##
# разрешить переброску icmp определенного типа
##
allow_icmp_type_f () {
   echo $0
   for i in $@; do {
       $iptfi $i -j ACCEPT
   }; done
}


##
# разрешить входяшие и исходящие icmp по типу
##
allow_icmp_type_io () {
    echo $0
    for i in $@; do {
        allow_icmp_type_i $i
        allow_icmp_type_o $i
        allow_icmp_type_f $i
    }; done
}

##
# разрешить входящие tcp на указанные порты
##
allow_tcp_in ()
{
    echo $0
    for i in $@; do {
        $iptit --dport $unprior  -j ACCEPT --sport $i
    }; done
}

##
# разрешить исходящие tcp на указанные порты
##
allow_tcp_out ()
{
    echo $0
    for i in $@; do {
        $iptot --sport $unprior -j ACCEPT --dport $i
    }; done
}

##
# разрешить переброску tcp на указанные порты
##
allow_tcp_forward ()
{
    echo $0
    for i in $@; do {
        $iptft --sport $unprior -j ACCEPT --dport $i
    }; done
}

##
# разрешитьуже установленные
##
allow_established ()
{
    echo $0
    $iptit -m state --state ESTABLISHED,RELATED -j ACCEPT
    $iptot -m state --state ESTABLISHED,RELATED -j ACCEPT
    $iptft -m state --state ESTABLISHED,RELATED -j ACCEPT   
}

block_ip ()  {
    echo $0
    for i in $@; do {
        $ipt -A BAD_IPS -s $i -j DROP
        $ipt -A BAD_IPS -d $i -j DROP
    }; done
}

##
# разрешить loopback
##
allow_loopback()
{
    echo $0
    $ipti -i lo -j ACCEPT
    $ipto -o lo -j ACCEPT
}

############################################
# используемые выше переменные
##
# путь к iptables
ipt='/sbin/iptables'
# непривелигированные порты
unprior="1024:65535"

###########
# команды-сокращения, используемые в функциях
#ipt -[Input|Output|Forward][TCP|UDP|ICMP]
# ipt iof
ipto="${ipt} -A OUTPUT"
ipti="${ipt} -A INPUT"
iptf="${ipt} -A FORWARD"

# ipt(iof)t = tcp
iptot="${ipt} -A OUTPUT -p tcp -m tcp"
iptit="${ipt} -A INPUT -p tcp -m tcp"
iptft="${ipt} -A FORWARD -p tcp -m tcp"

# ipt(iof)u = udp
iptou="${ipt} -A OUTPUT -p udp -m udp"
iptiu="${ipt} -A INPUT -p udp -m udp"
iptfu="${ipt} -A FORWARD -p udp -m udp"

# ipt(iof)i = icmp по типу
iptoi="${ipt} -A OUTPUT -p icmp -m icmp --icmp-type"
iptii="${ipt} -A INPUT -p icmp -m icmp --icmp-type"
iptfi="${ipt} -A FORWARD -p icmp -m icmp --icmp-type"

# ipt(ipf)iall = icmp все подряд
iptoiall="${ipt} -A OUTPUT -p icmp -m icmp "
iptiiall="${ipt} -A INPUT -p icmp -m icmp "
iptfiall="${ipt} -A FORWARD -p icmp -m icmp "
#################################################


############################################
# локальные переменные
defdns="192.168.1.1"

############################################
# собственно, правила

# input output forward
drop_rulles DROP DROP DROP

## todo расширить block_known_attacks для возможности блокировки указанных соединений
block_known_attacks
# запретить известных гадов и явные подделки
block_ip "10.0.0.0/8" "172.16.0.0/12"

# запретить переброску любого траффика
$iptf -j DROP

allow_dns $defdns
allow_loopback
allow_established

# samba
# allow_tcp_in netbios-ssn microsoft-ds

block_local_services 6000:6003 783 331 10000 9050 http https mysql ipp
allow_tcp_out http https ftp ftp-data ssh xmpp-client aol rsync netbios-ssn microsoft-ds


#allow_tcp_forward ports

allow_icmp_type_io parameter-problem source-quench echo-reply echo-request
#allow_icmp_type_i echo-reply
#allow_icmp_type_o echo-request


$ipt -L 

Комментариев нет: