Чуть пострадал ерундой и накатал фукции для работы с 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
Комментариев нет:
Отправить комментарий