Отличный скрипт для IPTables | DROP Policy

Решил поделиться с вами своим скриптом для применения правил к IPTables.
То, как это работает у меня на одном из серваков.

Скрипт и инструкции под катом...

Итак:

1. Переименовываем/переносим стандартный /etc/init.d/iptables

# mv /etc/init.d/iptables /home/defaultuser


2. Создадим новый файл и дадим ему права на исполнение.

# touch /etc/init.d/iptables
# chmod +x /etc/init.d/iptables
# rc-update add iptables default


3. Открываем файл на редактирование с помощью вашего любимого редактора и вставляем правила:

#!/bin/sh
# Start/stop/restart the iptables

#
# Configuration options.
#

# Internet Configuration.
# Всевозможные переменные описывающие интерфейсы и дополнительные айпи, чтобы в дальнейшем отказаться от айпи-адресов в конфиге;

#ETH1
    IP_EXT="xx.xx.xx.xx"
    IF_EXT="eth1"
    NET_EXT="xx.xx.xx.0/24"
    BRD_EXT="xx.xx.xx.255"
#ETH0
    IP_LOC="10.0.0.2"
    IF_LOC="eth0"
    NET_LOC="10.0.0.0/24"
    BRD_LOC="10.0.0.255"
#ADD IF
    WORK="yy.yy.yy.yy"
    ANDREIKA="zz.zz.zz.zz"
    ALL="0/0"
#LoopBack
    LO_IF="lo"
    LO_IP="127.0.0.1/8"
# IPT executable configuration.
   IPT="/sbin/iptables"
   POLICY="DROP" 	# Политика файрволл по умолчанию DROP|ACCEPT
# Мне нравится дроп, тем что, никогда не приходится заморачиваться над запущенными приложениями и соответственно, открытыми портами
# FreeBSD`шники любят ACCEPT, объясняя тем, мол зачем закрывать то, чего у меня нету?
# Моя политика перебдить чем потом недоБЗДеть)))

fr_start() {

     ##################
     # Module loading # 
     ##################

    /sbin/depmod -a
# В новых версиях ядер не актуально, automatic module loading, пережиток прошлого))

    echo 1 > /proc/sys/net/ipv4/ip_forward
    for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 1 > $f ; done

# Т.к. телега является к тому же и роутером разрешаем ip_forwrding, обратите внимание IPv6 форвардинг не включается.

    ###############
    # Clean rules #
    ###############

    $IPT -F
    $IPT -t nat -F
    $IPT -t mangle -F

    $IPT -X
    $IPT -t nat -X
    $IPT -t mangle -X

# Сбрасываем правила 
     ########################
    # Все политики в дроп            #
    ########################
    $IPT -P INPUT $POLICY
    $IPT -P OUTPUT $POLICY
    $IPT -P FORWARD $POLICY

    ################################
    #Цепочки для ненужных пакетов #
    ################################
    $IPT -N check_packets
    $IPT -F check_packets

    ################################
    # Цепочки для всяческих пингов #
    ################################

    #Входящие icmp запросы (пинг etc)
    $IPT -N icmp_in
    $IPT -F icmp_in
    #Исходящие icmp запросы (пинг etc)
    $IPT -N icmp-out
    $IPT -F icmp-out

    ###############################
    # Цепочка для входящих ssh-in #
    ###############################

    $IPT -N ssh-in
    $IPT -F ssh-in

    ##################################################
    #Цепочка с хорошими пакетами statefull           #
    #Разрешает пакеты с уже установленный соединений #
    ##################################################

    $IPT -N statefull
    $IPT -F statefull
    $IPT -A statefull -m state --state ESTABLISHED,RELATED -j ACCEPT


#GO_Fucking_FIREWALL!!!


    #######################
    # check_packets chain #
    #######################

    $IPT -A check_packets -m state --state INVALID -j DROP
    $IPT -A check_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
    $IPT -A check_packets -p tcp ! --syn -m state --state NEW -j DROP
    $IPT -A check_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
    $IPT -A check_packets -p tcp --tcp-flags ALL ALL -j DROP
    $IPT -A check_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
    $IPT -A check_packets -p tcp --tcp-flags ALL NONE -j DROP
    $IPT -A check_packets -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
    $IPT -A check_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

    ######################
    # icmp_packets chain #
    ######################

    $IPT -A icmp_in -m state --state NEW -p icmp --icmp-type echo-request -j ACCEPT
    $IPT -A icmp_in -m state --state NEW -p icmp --icmp-type time-exceeded -j ACCEPT
    $IPT -A icmp_in -m state --state NEW -p icmp --icmp-type destination-unreachable -j ACCEPT


    $IPT -A icmp-out -p icmp --icmp-type 8 -j ACCEPT
    $IPT -A icmp-out -m state --state NEW -p icmp --icmp-type time-exceeded -j ACCEPT
    $IPT -A icmp-out -m state --state NEW -p icmp --icmp-type destination-unreachable -j ACCEPT

    ######################
    # SSH-IN	   chain #
    ######################

    $IPT -A ssh-in -p tcp --dport 22 -j ACCEPT
    $IPT -A ssh-in -m limit --limit 3/minute -p tcp --tcp-flags ALL RST --dport 22 -j ACCEPT
    $IPT -A ssh-in -m limit --limit 3/minute -p tcp --tcp-flags ALL FIN --dport 22 -j ACCEPT
    $IPT -A ssh-in -m limit --limit 3/minute -p tcp --tcp-flags ALL SYN --dport 22 -j ACCEPT
    $IPT -A ssh-in -m state --state RELATED,ESTABLISHED -p tcp --dport ssh -j ACCEPT

    #INPUT
    #########################################
    # Задание правил для входящего траффика #
    #########################################

    #IGMP
    # $IPT -A INPUT -d 224.0.0.0/4 -j ACCEPT
# Мультикасты

    $IPT -A INPUT -j check_packets

    #  Переправляем входящие по SSH

    $IPT -A INPUT -p tcp --dport 22 -j ssh-in
    $IPT -A INPUT -i $LO_IF -d $LO_IP -j ACCEPT
    $IPT -A INPUT -j statefull
    $IPT -A INPUT -p TCP -s $ANDREIKA --dport 22 -j ACCEPT

    #DNS
    $IPT -A INPUT -p TCP -i $IF_LOC --dport 53 -j ACCEPT
    $IPT -A INPUT -p UDP -i $IF_LOC --dport 53 -j ACCEPT
    $IPT -A FORWARD -p TCP -i $IF_LOC --dport 53 -j ACCEPT
    $IPT -A FORWARD -p UDP -i $IF_LOC --dport 53 -j ACCEPT
    $IPT -A INPUT -p TCP -s 127.0.0.1/32 --dport 953 -j ACCEPT
    $IPT -A INPUT -p UDP -s 127.0.0.1/32 --dport 953 -j ACCEPT

    #PPTP
    $IPT -A INPUT -p TCP -s 10.0.0.0/8 --dport 1723 -j ACCEPT
    $IPT -A INPUT -p 47 -i $IF_LOC -j ACCEPT

    #SAMBA
    $IPT -A INPUT -p TCP -i $IF_LOC --dport 135:139 -j ACCEPT
    $IPT -A INPUT -p UDP -i $IF_LOC --dport 135:139 -j ACCEPT
    $IPT -A INPUT -p TCP -i $IF_LOC --dport 445 -j ACCEPT
    $IPT -A INPUT -p UDP -i $IF_LOC --dport 445 -j ACCEPT

    #HTTP
    $IPT -A INPUT -p TCP -s $ALL --dport 80 -j ACCEPT

    # Для непосредственного просмотра страниц через APACHE в обход Nginx
    $IPT -A INPUT -p TCP -s cc.cc.cc.cc/32 --dport 8080 -j ACCEPT
    $IPT -A INPUT -p TCP -s 127.0.0.1/32 --dport 8080 -j ACCEPT

    #DHCP
    $IPT -A INPUT -p TCP -i $IF_LOC --dport 547 -j ACCEPT
    $IPT -A INPUT -p UDP -i $IF_LOC --dport 547 -j ACCEPT

    #NTP
    $IPT -A INPUT -p TCP -i $IF_LOC --dport 123 -j ACCEPT
    $IPT -A INPUT -p UDP -i $IF_LOC --dport 123 -j ACCEPT
    
    #MYSQL
    $IPT -A INPUT -p TCP -s $LO_IP --dport 3306 -j ACCEPT
    
    #FTP
    $IPT -A INPUT -p tcp  --dport 1024:65365 -j ACCEPT
    $IPT -A INPUT -p tcp  --dport ftp -j ACCEPT
    $IPT -A INPUT -p tcp  --dport ftp-data -j ACCEPT

    # Rules for special networks not part of the Internet
    $IPT -A INPUT -p ALL -i $LO_IF -s $LO_IP -j ACCEPT
    $IPT -A INPUT -p ALL -i $LO_IF -s $IP_LOC -j ACCEPT
    $IPT -A INPUT -p ALL -i $LO_IF -s $IP_EXT -j ACCEPT
    # RADIO
    $IPT -A INPUT -p TCP -s 10.0.0.0/8 --dport 8000 -j ACCEPT
    $IPT -A INPUT -p TCP -s 10.0.0.0/8 --dport 8001 -j ACCEPT

    #FORWARD
    #########################################
    # Задание правил для сквозного траффика #
    #########################################

    # Bad TCP packets we don't want
    $IPT -A FORWARD -j check_packets
    $IPT -A FORWARD -j statefull

    #Need to forward only pptp or pppoe
    $IPT -A FORWARD -s $NET_LOC -j ACCEPT
    $IPT -A FORWARD -d $NET_LOC -j ACCEPT
    $IPT -A FORWARD -s $NET_EXT -j ACCEPT
    $IPT -A FORWARD -d $NET_EXT -j ACCEPT
    
    #IGMP
    #$IPT -A FORWARD -d 224.0.0.0/4 -j ACCEPT
    #$IPT -A FORWARD -s 224.0.0.0/4 -j ACCEPT


#OUTPUT
    ##########################################
    # Задание правил для исходящего траффика #
    ##########################################
    # Bad TCP packets we don't want.
    $IPT -A OUTPUT -p tcp -j check_packets
    $IPT -A OUTPUT -p icmp -j icmp-out
    $IPT -A OUTPUT -o $LO_IF -j ACCEPT

    # Special OUTPUT rules to decide which IP's to allow.
    $IPT -A OUTPUT -p ALL -s 0/0 -j ACCEPT
    $IPT -A OUTPUT -j statefull


    ##############
    #  NAT table #
    ##############

    ####################
    # PREROUTING chain #
    ####################
    # Так делаем DNAT во внутреннюю сеть, например для доступа по RAdmin
    #$IPT -t nat -A PREROUTING -s cc.cc.cc.cc -p TCP --dport 4899 -j DNAT --to-destination 10.0.0.222:4899

    #####################
    # POSTROUTING chain #
    #####################

    #INET Rules
    #Раздача Интернет пользователям внутри локалки, с помощью прямого ната или маскарейдинга
 
    #$IPT -t nat -A POSTROUTING -s 10.0.0.0/8 -j MASQUERADE
    #$IPT -t nat -A POSTROUTING -s 10.0.0.0/8 -d cc.cc.cc.cc/32 -j SNAT --to-source $EXT_IP
}

fr_stop() {
    ###############
    # Clean rules #
    ###############
    
   $IPT -F
   $IPT -t nat -F
   $IPT -t mangle -F
    
   $IPT -X
   $IPT -t nat -X
   $IPT -t mangle -X
    
   ################
   # Set policies #
   ################

   $IPT -P INPUT ACCEPT
   $IPT -P OUTPUT ACCEPT
   $IPT -P FORWARD ACCEPT
}

fr_restart() {
    fr_stop
    sleep 1
    fr_start
}

case "$1" in
    'start')
    fr_start
    ;;
    'stop')
    fr_stop
    ;;
    'restart')
    fr_restart
    ;;
    *)
    echo "usage $0 start|stop|restart"
esac


NB: Внимание данный скрипт IPTables используется вместо встроенного init-скрипта Gentoo, удобство заключается в том, что правила унифицированы и подходят под любой линукс, не нужно думать над синтаксисом, и всегда есть где посмотреть эти правила.

{TAGS}




Вас также может заинтересовать:

12.06.2010 IPTables Gentoo
Динамический IP (DHCP) и IPtables