Увеличиваем безопасность через файерволы
28.02.10 /
В этой статье расскажу, о правилах файерволов, которые позволяют бороться с паразитируещим траффиком (фрагментированные пакеты, неправильные бродкасты, ...). Приведу примеры для таких файерволов: ipfw, pf, iptables. В некоторых из них будут специфические правила, которые отсутствуют в других.
Сразу скажу о переменных, которые используются здесь:
- ${FwCMD} - путь к бинарнику ipfw, обычно это /sbin/ipfw
- ${LanOut} - внешний интерфейс
- ${IPT} - путь к бинарнику iptables, обычно это /sbin/iptables
1) IPFW
# Разрешаем весь траффик по внутреннему интерфейсу (петле)
# Вообще я во многих местах читал что без него может ничё не заработать вообще
# и прочие страшилки. Работает - почта, апач, .... А вот squid - не работает :)
# так что без него и правда - никуда.
${FwCMD} add allow ip from any to any via lo0
${FwCMD} add deny ip from any to 127.0.0.0/8
${FwCMD} add deny ip from 127.0.0.0/8 to any
# режем частные сети на внешнем интерфейсе - по легенде он у нас
# смотрит в интернет, а значит пакетам этим браться неоткуда на нём.
# рубим частные сeти
${FwCMD} add deny ip from any to 10.0.0.0/8 in via ${LanOut}
${FwCMD} add deny ip from any to 172.16.0.0/12 in via ${LanOut}
${FwCMD} add deny ip from any to 192.168.0.0/16 in via ${LanOut}
${FwCMD} add deny ip from any to 0.0.0.0/8 in via ${LanOut}
# рубим автоконфигуреную частную сеть
${FwCMD} add deny ip from any to 169.254.0.0/16 in via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add deny ip from any to 240.0.0.0/4 in via ${LanOut}
# рубим фрагментированные icmp
${FwCMD} add deny icmp from any to any frag
# рубим широковещательные icmp на внешнем интерфейсе
${FwCMD} add deny icmp from any to 255.255.255.255 in via ${LanOut}
${FwCMD} add deny icmp from any to 255.255.255.255 out via ${LanOut}
# рубим траффик к частным сетям через внешний интерфейс
# заметтьте - эти правила отличаются от тех что были выше!
${FwCMD} add deny ip from 10.0.0.0/8 to any out via ${LanOut}
${FwCMD} add deny ip from 172.16.0.0/12 to any out via ${LanOut}
${FwCMD} add deny ip from 192.168.0.0/16 to any out via ${LanOut}
${FwCMD} add deny ip from 0.0.0.0/8 to any out via ${LanOut}
# рубим автоконфигуреную частную сеть
${FwCMD} add deny ip from 169.254.0.0/16 to any out via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add deny ip from 224.0.0.0/4 to any out via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add deny ip from 240.0.0.0/4 to any out via ${LanOut}
# port-scan protect
${FwCMD} add 71 deny log tcp from any to any tcpflags fin, syn, rst, psh, ack, urg
${FwCMD} add 72 deny log tcp from any to any tcpflags !fin, !syn, !rst, !psh, !ack, !urg
${FwCMD} add 73 deny log tcp from any to any not established tcpflags fin
# Запрещаем пакеты с не кор рек т ны ми TCP-флагами.
# NULL-пакеты . второй тест nmap
${FwCMD} add 74 deny log tcp from any to any tcpflags !syn,!ack,!rst
# XMAS-пакеты . третий тест nmap
${FwCMD} add 75 deny log tcp from any to any tcpflags syn,fin,urg,psh,!ack
${FwCMD} add 76 deny log tcp from any to any tcpflags syn,fin,!ack,
# Седьмой тест nmap
${FwCMD} add 77 deny log tcp from any to any tcpflags fin,urg,psh,!ack
${FwCMD} add 78 deny log tcp from any to any tcpflags fin,!ack
${FwCMD} add 79 deny log tcp from any to any tcpflags urg,!ack
${FwCMD} add 80 deny log tcp from any to any tcpflags psh,!ack
# allow trafic only to that int, where it arrive
${FwCMD} add 70 deny log ip from any to any not verrevpath in
2) PF
# Нормализируем весь входящий траффик. Это избавит от всякого рода фрагментированностей.
#ВНИМАНИЕ! В OPENBSD, НАЧИНАЯ С ВЕРСИИ 4.6 ЭТОГО ПРАВИЛА УЖЕ НЕТ
#ИСПОЛЬЗОВАНИЯ ЕГО ПРИВЕДЁТ К ОШИБКЕ, БУДЬ-ТЕ ВНИМАТЕЛЬНЫ
scrub in all
#Включаем блокировку антиспуффинга. Кстати, для нормальной работы нужно ещё правило для петлевого интерфейса
set skip on lo0
antispoof quick for ${LanOut}
# Защищаемся от сканнирования Nmap'a.
block in quick from any os NMAP
# Разрешаем весь траффик по внутреннему интерфейсу (петле)
# Вообще я во многих местах читал что без него может ничё не заработать вообще
# и прочие страшилки. Работает - почта, апач, .... А вот squid - не работает :)
# так что без него и правда - никуда.
pass on lo0 inet proto ip from any to any
block quick inet ptoto ip from any to 127.0.0.0/8
block quick inet ptoto ip from 127.0.0.0/8 to any
# режем частные сети на внешнем интерфейсе - по легенде он у нас
# смотрит в интернет, а значит пакетам этим браться неоткуда на нём.
# рубим частные сeти
block in quick on ${LanOut} inet proto ip from any to 10.0.0.0/8
block in quick on ${LanOut} inet proto ip from any to 172.16.0.0/12
block in quick on ${LanOut} inet proto ip from any to 192.168.0.0/16
block in quick on ${LanOut} inet proto ip from any to 0.0.0.0/8
# рубим автоконфигуреную частную сеть
block in quick on ${LanOut} inet proto ip from any to 169.254.0.0/16
# рубаем мультикастовые рассылки
block in quick on ${LanOut} inet proto ip from any to 240.0.0.0/4
# рубим широковещательные icmp на внешнем интерфейсе
block in quick on ${LanOut} inet proto icmp from any to 255.255.255.255
block out quick on ${LanOut} inet proto icmp from any to 255.255.255.255
# рубим траффик к частным сетям через внешний интерфейс
# заметьте - эти правила отличаются от тех что были выше!
block out quick on ${LanOut} inet proto ip from 10.0.0.0/8 to any
block out quick on ${LanOut} inet proto ip from 172.16.0.0/12 to any
block out quick on ${LanOut} inet proto ip from 192.168.0.0/16 to any
block out quick on ${LanOut} inet proto ip from 0.0.0.0/8 to any
# рубим автоконфигуреную частную сеть
block out quick on ${LanOut} inet proto ip from 169.254.0.0/16 to any
# рубаем мультикастовые рассылки
block out quick on ${LanOut} inet proto ip from 240.0.0.0/4 to any
3) IPTABLES
# Разрешаем весь траффик по внутреннему интерфейсу (петле)
# Вообще я во многих местах читал что без него может ничё не заработать вообще
# и прочие страшилки. Работает - почта, апач, .... А вот squid - не работает :)
# так что без него и правда - никуда.
${IPT} -A INPUT -p tcp -i lo0 -j ACCEPT
${IPT} -A OUTPUT -p tcp -i lo0 -j ACCEPT
${IPT} -A INPUT -p tcp --dst 127.0.0.0/8 -j REJECT
${IPT} -A OUTPUT -p tcp --dst 127.0.0.0/8 -j REJECT
${IPT} -A INPUT -p tcp --src 127.0.0.0/8 -j REJECT
${IPT} -A OUTPUT -p tcp --src 127.0.0.0/8 -j REJECT
# режем частные сети на внешнем интерфейсе - по легенде он у нас
# смотрит в интернет, а значит пакетам этим браться неоткуда на нём.
# рубим частные сeти
${IPT} -A INPUT -p tcp -i ${LanOut} --dst 10.0.0.0/8 -j REJECT
${IPT} -A INPUT -p tcp -i ${LanOut} --dst 172.16.0.0/12 -j REJECT
${IPT} -A INPUT -p tcp -i ${LanOut} --dst 192.168.0.0/16 -j REJECT
${IPT} -A INPUT -p tcp -i ${LanOut} --dst 0.0.0.0/8 -j REJECT
# рубим автоконфигуреную частную сеть
${IPT} -A INPUT -p tcp -i ${LanOut} --dst 169.254.0.0/16 -j REJECT
# рубаем мультикастовые рассылки
${IPT} -A INPUT -p tcp -i ${LanOut} --dst 240.0.0.0/4 -j REJECT
# рубим фрагментированные icmp
${IPT} -A INPUT -f -p icmp -j REJECT
# рубим широковещательные icmp на внешнем интерфейсе
${IPT} -A INPUT -p icmp -i ${LanOut} --dst 255.255.255.255 -j REJECT
${IPT} -A OUTPUT -p icmp -i ${LanOut} --dst 255.255.255.255 -j REJECT
# режем частные сети на внешнем интерфейсе - по легенде он у нас
# смотрит в интернет, а значит пакетам этим браться неоткуда на нём.
# рубим частные сeти
${IPT} -A OUTPUT -p tcp -i ${LanOut} --src 10.0.0.0/8 -j REJECT
${IPT} -A OUTPUT -p tcp -i ${LanOut} --src 172.16.0.0/12 -j REJECT
${IPT} -A OUTPUT -p tcp -i ${LanOut} --src 192.168.0.0/16 -j REJECT
${IPT} -A OUTPUT -p tcp -i ${LanOut} --src 0.0.0.0/8 -j REJECT
# рубим автоконфигуреную частную сеть
${IPT} -A OUTPUT -p tcp -i ${LanOut} --src 169.254.0.0/16 -j REJECT
# рубаем мультикастовые рассылки
${IPT} -A OUTPUT -p tcp -i ${LanOut} --src 240.0.0.0/4 -j REJECT
Примечание: многое почерпнул с ресурса lissyara.su.
Автор: skeletor
По материалам:
Добавить комментарий