Rules for Iptables

Discussion in 'Безопасность и Анонимность' started by L0rd_Ha0S, 13 Feb 2007.

  1. L0rd_Ha0S

    L0rd_Ha0S Elder - Старейшина

    Joined:
    25 Jan 2006
    Messages:
    148
    Likes Received:
    102
    Reputations:
    64
    Давно собирался настроить на своем десктопе фаервол (iptables), наконец дошли руки и до него :) Настроил, но теперь вот интересуют любые интересные правила, к примеру правила для защиты от разного вида атак и т.п. Интересно было бы посмотреть на правила/скрипты, которыми пользуетесь Вы. Возможно там найдутся какие-нибудь полезные строки :). Кому не жалко, выкладывайте сюда. Начну с себя, вот мой стартовый скрипт инициализации фаервола, который я написал для удобства запуска/остановки фаервола(вообще,у меня он запускается во время загрузки системы INIT'ом, но иногда бывает нужно временно отключить его), все правила написаны исключительно по моим потребностям, немного переделав правила "под себя" (если, конечно, они вас не устраивают) можете использовать его для своих целей.

    Вот сам скрипт:
    Code:
    #!/bin/bash
    # iptables-control
    # Author: L0rd_Ha0S
    # Скрипт для запуска/остановки iptables
    # Правила построены по принципу "что не разрешено-то запрещено"
    # Charset for comments: UTF-8
    # Date: Feb 12, 2007
    #
    # Parameters
    IPTABLES="/sbin/iptables"
    INET_IFACE="ppp+"
    DNS1="`cat /etc/ppp/pppoe.conf|grep DNS1|grep -v "#"|sed 's/DNS1=//g'`"
    DNS2="`cat /etc/ppp/pppoe.conf|grep DNS2|grep -v "#"|sed 's/DNS2=//g'`"
    LAN_IFACE="eth0"
    LAN_IP="192.168.1.52"
    LAN_ADDR="192.168.1.0/24"
    LO_IFACE="lo"
    
    # Functions: stop_firewall, start_firewall
    
    stop_firewall()
    {
    echo -ne " \033[01;36m*\033[00m Stopping firewall"
    
    # Перенаправляем stdout и stderr в /dev/null
    exec 3>&1 4>&2 1>/dev/null 2>/dev/null
    
    # Сбрасываем все правила
    $IPTABLES -F
    # Удаляем все пользовательские цепочки
    $IPTABLES -X
    
    # Устанавливаем политику по умолчанию ACCEPT
    $IPTABLES -P INPUT ACCEPT
    $IPTABLES -P OUTPUT ACCEPT
    $IPTABLES -P FORWARD ACCEPT
    
    # Восстанавливаем stdout и stderr
    exec 1>&3 2>&4
    
    echo -e "\t\t\t\t\t\t\t\t\t\t\t\t\t \033[01;32m[ ok ]\033[00m"
    }
    
    start_firewall()
    {
    echo -e " \033[01;36m*\033[00m Starting firewall"
    
    # Перенаправляем stdout и stderr в /dev/null
    exec 3>&1 4>&2 1>/dev/null 2>/dev/null
    
    ## Загрузка модулей
    /sbin/depmod -a
    
    /sbin/modprobe ip_tables
    /sbin/modprobe ip_conntrack
    /sbin/modprobe iptable_filter
    /sbin/modprobe iptable_mangle
    /sbin/modprobe ipt_LOG
    /sbin/modprobe ip_conntrack_ftp
    
    ## Определяем правила фаервола
    # Устанавливаем политики по умолчанию
    $IPTABLES -P INPUT DROP
    $IPTABLES -P OUTPUT DROP
    $IPTABLES -P FORWARD DROP
    
    # Сбрасываем старые правила, чтобы они не смешивались с новыми
    $IPTABLES -F
    # Удаляем все пользовательские цепочки
    $IPTABLES -X
    
    ## Общие правила
    # Разрешаем руту доступ в сеть
    $IPTABLES -A OUTPUT -m owner --uid-owner root -j ACCEPT
    # Запрещаем nobody доступ в сеть
    $IPTABLES -A OUTPUT -m owner --uid-owner nobody -j DROP
    
    # icmp
    $IPTABLES -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
    $IPTABLES -A INPUT -p icmp --icmp-type 13 -j DROP # Deny Timestamp request
    $IPTABLES -A INPUT -p icmp --icmp-type 15 -j DROP # Deny Information request
    $IPTABLES -A INPUT -p icmp --icmp-type 17 -j DROP # Deny Address mask request
    $IPTABLES -A INPUT -p icmp -j ACCEPT
    $IPTABLES -A OUTPUT -p icmp -j ACCEPT
    
    
    ## loopback
    # Разрешаем весь обмен данными через loopback
    $IPTABLES -A INPUT -p ALL -i $LO_IFACE -j ACCEPT
    $IPTABLES -A OUTPUT -p ALL -o $LO_IFACE -j ACCEPT
    
    ## Локальная сеть
    # Тут разрешаем необходимые порты
    # Заносим в лог все попытки соединения с 21,22,23,80 портами из сети $LAN_ADDR
    $IPTABLES -A INPUT -i $LAN_IFACE -p tcp --dport 21 -s $LAN_ADDR -m state --state NEW -j ULOG --ulog-prefix "FTP REQUESTS FROM LAN:"
    $IPTABLES -A INPUT -i $LAN_IFACE -p tcp --dport 22 -s $LAN_ADDR -m state --state NEW -j ULOG --ulog-prefix "SSH REQUESTS FROM LAN:"
    $IPTABLES -A INPUT -i $LAN_IFACE -p tcp --dport 23 -s $LAN_ADDR -m state --state NEW -j ULOG --ulog-prefix "TELNET REQUESTS FROM LAN:"
    $IPTABLES -A INPUT -i $LAN_IFACE -p tcp --dport 80 -s $LAN_ADDR -m state --state NEW -j ULOG --ulog-prefix "WEB REQUESTS FROM LAN:"
    # Заносим в лог и уничтожаем все пакеты, которые имеют статус NEW, но SYN-флаг в которых не установлен
    $IPTABLES -A INPUT -i $LAN_IFACE -p tcp ! --syn -m state --state NEW -j ULOG --ulog-prefix "NEW NOT SYN FROM LAN:"
    $IPTABLES -A INPUT -i $LAN_IFACE -p tcp ! --syn -m state --state NEW -j DROP
    # Уничтожаем все пакеты, имеющие статус INVALID
    $IPTABLES -A INPUT -i $LAN_IFACE -p tcp -m state --state INVALID -j DROP
    $IPTABLES -A OUTPUT -o $LAN_IFACE -p tcp -m state --state INVALID -j DROP
    # Запрещаем все попытки установления соединения
    $IPTABLES -A INPUT -i $LAN_IFACE -p tcp --syn -j REJECT
    # Что-то вроде политики по умолчанию для $LAN_IFACE
    $IPTABLES -A INPUT -i $LAN_IFACE -s $LAN_ADDR -d $LAN_IP -p ! icmp -j ACCEPT
    $IPTABLES -A OUTPUT -o $LAN_IFACE -s $LAN_IP -d $LAN_ADDR -p ! icmp -j ACCEPT
    
    
    ## Интернет
    # Тут разрешаем необходимые порты
    # Заносим в лог все попытки соединения с 21,22,23,80 и непривилегированными портами
    $IPTABLES -A INPUT -i $INET_IFACE -p tcp --dport 21 -m state --state NEW -j ULOG --ulog-prefix "FTP REQUESTS FROM INET:"
    $IPTABLES -A INPUT -i $INET_IFACE -p tcp --dport 22 -m state --state NEW -j ULOG --ulog-prefix "SSH REQUESTS FROM INET:"
    $IPTABLES -A INPUT -i $INET_IFACE -p tcp --dport 23 -m state --state NEW -j ULOG --ulog-prefix "TELNET REQUESTS FROM INET:"
    $IPTABLES -A INPUT -i $INET_IFACE -p tcp --dport 80 -m state --state NEW -j ULOG --ulog-prefix "WEB REQUESTS FROM INET:"
    $IPTABLES -A INPUT -i $INET_IFACE -p tcp --dport 1024:65535 -m state --state NEW -j ULOG --ulog-prefix "ATTEMPT TO CONNECT TO UNPORT:"
    # Заносим в лог и уничтожаем все пакеты, которые имеют статус NEW, но SYN-флаг в которых не установлен
    $IPTABLES -A INPUT -i $INET_IFACE -p tcp ! --syn -m state --state NEW -j ULOG --ulog-prefix "NEW NOT SYN FROM INET:"
    $IPTABLES -A INPUT -i $INET_IFACE -p tcp ! --syn -m state --state NEW -j DROP
    # Уничтожаем все пакеты, имеющие статус INVALID
    $IPTABLES -A INPUT -i $INET_IFACE -p tcp -m state --state INVALID -j DROP
    $IPTABLES -A OUTPUT -o $INET_IFACE -p tcp -m state --state INVALID -j DROP
    # Запрещаем все попытки установления соединения
    $IPTABLES -A INPUT -i $INET_IFACE -p tcp --syn -j DROP
    # Разрешаем пакеты из установленных соединений
    $IPTABLES -A INPUT -i $INET_IFACE -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
    # принимаем DNS-ответы
    $IPTABLES -A INPUT -i $INET_IFACE -p udp --sport 53 -s $DNS1 -j ACCEPT
    $IPTABLES -A INPUT -i $INET_IFACE -p udp --sport 53 -s $DNS2 -j ACCEPT
    # Заносим в лог и разрешаем исходящие соединения только на эти порты
    $IPTABLES -A OUTPUT -o $INET_IFACE -p tcp -m multiport --dports 20,21,23,25,110,465,989,990,994,995 -m state --state NEW -j ULOG --ulog-prefix "OUTGOING REQUESTS"
    $IPTABLES -A OUTPUT -o $INET_IFACE -p tcp -m multiport --dports 1080,8080,1194,1433,1434,1723,3306,9999 -m state --state NEW -j ULOG --ulog-prefix "OUTGOING REQUESTS"
    $IPTABLES -A OUTPUT -o $INET_IFACE -p tcp -m multiport --dports 20,21,22,23,25,80,110,443,465,989,990,994,995 -j ACCEPT
    $IPTABLES -A OUTPUT -o $INET_IFACE -p tcp -m multiport --dports 1080,8080,1194,1433,1434,1723,3306,5190,9999 -j ACCEPT
    # Разрешаем DNS-запросы
    $IPTABLES -A OUTPUT -o $INET_IFACE -p udp --dport 53 -d $DNS1 -j ACCEPT
    $IPTABLES -A OUTPUT -o $INET_IFACE -p udp --dport 53 -d $DNS2 -j ACCEPT
    # Устанавливаем ловушки. Работает только при устновленном Patch-o-matic
    #$IPTABLES -A INPUT -p tcp -j TARPIT
    
    # Восстанавливаем stdout и stderr
    exec 1>&3 2>&4
    
    echo -e "\t\t\t\t\t\t\t\t\t\t\t\t\t \033[01;32m[ ok ]\033[00m"
    }
    
    
    
    if [ $UID = 0 ]; then
    	case "$1" in 
    		start)
    			start_firewall
    			exit 0
    			;;
    		restart|reload|force-reload)
    			stop_firewall
    			start_firewall
    			exit 3
    			;;
    		stop)
    			stop_firewall
    			exit 0
    			;;
    		*)
    			progname=`echo $0|sed 's/\/usr//g'|sed 's/\/local//g'|sed 's/\/sbin//g'|sed 's/\/bin//g'|sed 's/\///g'|sed 's/\.//g'`
    			echo -e " Usage: $progname \033[01;32m{\033[00mstart\033[01;32m|\033[00mrestart\033[01;32m|\033[00mstop\033[01;32m}\033[00m"
    			exit 1
    			;;
    	esac;
    else
    	echo -e " \033[31mYou must be root!\033[00m";
    fi
    
    exit 0
    
     
    #1 L0rd_Ha0S, 13 Feb 2007
    Last edited: 26 Nov 2007
    3 people like this.
  2. hsi

    hsi Member

    Joined:
    11 Sep 2006
    Messages:
    214
    Likes Received:
    61
    Reputations:
    7
    Я как-то особо не заморачивался серьезной настройкой iptables на домашней машине. Да и, думаю, это ни к чему. Наверное, топик получится весьма познавательный. :)

    Несколько весьма полезных руководств:
    Начальная настройка межсетевого экрана Iptables
    Руководство по iptables (Iptables Tutorial 1.1.19)
    Iptables Tutorial 1.2.2 (ENG)
     
    2 people like this.
  3. L0rd_Ha0S

    L0rd_Ha0S Elder - Старейшина

    Joined:
    25 Jan 2006
    Messages:
    148
    Likes Received:
    102
    Reputations:
    64
    Кому как, но мне так очень не понравилось бы если бы по моему компу кроме меня шарился кто-нибудь еще(я вообще немного параноик :)), поэтому и заморачиваюсь с настройкой фаервола. За ссылки, конечно, спасибо, только я таких и множества подобных этим руководств начитался пока разбирался с iptables ;). Что можно я уже взял из них, поэтому и интересуюсь чужими правилами/скриптами, потому что в них можно найти что-нить поинтереснее чем в общих руководствах.
     
  4. ShadOS

    ShadOS ы

    Joined:
    11 Feb 2007
    Messages:
    667
    Likes Received:
    351
    Reputations:
    413
    Советую почитать мою статью о расширенных возможностях iptables. Хотя писалась она давно (начало 2005 года) и большинство модулей перекачевали в стандартную поставку ядра без доустановки patch-o-matic (если кто помнит - было такое раньше извращение =)).
    http://hellknights.void.ru/articles/0x48k-Advanced_IpTables.htm
    Там множество интересных примеров.
    Кроме того привожу пример и пояснения из руководства gentoo, хотя он больше подходит для сервеной машины:
    Code:
    /etc/init.d/firewall
    #!/sbin/runscript
    IPTABLES=/sbin/iptables
    IPTABLESSAVE=/sbin/iptables-save
    IPTABLESRESTORE=/sbin/iptables-restore
    FIREWALL=/etc/firewall.rules
    DNS1=212.242.40.3
    DNS2=212.242.40.51
    #inside
    IIP=10.0.0.2
    IINTERFACE=eth0
    LOCAL_NETWORK=10.0.0.0/24
    #outside
    OIP=217.157.156.144
    OINTERFACE=eth1
    
    opts="${opts} showstatus panic save restore showoptions rules"
    
    depend() {
      need net
    }
    
    rules() {
      stop
      ebegin "Setting internal rules"
    
      einfo "Setting default rule to drop"
      $IPTABLES -P FORWARD DROP
      $IPTABLES -P INPUT   DROP
      $IPTABLES -P OUTPUT  DROP
    
      #default rule
      einfo "Creating states chain"
      $IPTABLES -N allowed-connection
      $IPTABLES -F allowed-connection
      $IPTABLES -A allowed-connection -m state --state ESTABLISHED,RELATED -j ACCEPT
      $IPTABLES -A allowed-connection -i $IINTERFACE -m limit -j LOG --log-prefix \
          "Bad packet from ${IINTERFACE}:"
      $IPTABLES -A allowed-connection -j DROP
    
      #ICMP traffic
      einfo "Creating icmp chain"
      $IPTABLES -N icmp_allowed
      $IPTABLES -F icmp_allowed
      $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \
          time-exceeded -j ACCEPT
      $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \
          destination-unreachable -j ACCEPT
      $IPTABLES -A icmp_allowed -p icmp -j LOG --log-prefix "Bad ICMP traffic:"
      $IPTABLES -A icmp_allowed -p icmp -j DROP
    
      #Incoming traffic
      einfo "Creating incoming ssh traffic chain"
      $IPTABLES -N allow-ssh-traffic-in
      $IPTABLES -F allow-ssh-traffic-in
      #Flood protection
      $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
          ALL RST --dport ssh -j ACCEPT
      $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
          ALL FIN --dport ssh -j ACCEPT
      $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \
          ALL SYN --dport ssh -j ACCEPT
      $IPTABLES -A allow-ssh-traffic-in -m state --state RELATED,ESTABLISHED -p tcp --dport ssh -j ACCEPT
    
      #outgoing traffic
      einfo "Creating outgoing ssh traffic chain"
      $IPTABLES -N allow-ssh-traffic-out
      $IPTABLES -F allow-ssh-traffic-out
      $IPTABLES -A allow-ssh-traffic-out -p tcp --dport ssh -j ACCEPT
    
      einfo "Creating outgoing dns traffic chain"
      $IPTABLES -N allow-dns-traffic-out
      $IPTABLES -F allow-dns-traffic-out
      $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS1 --dport domain \
          -j ACCEPT
      $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS2 --dport domain \
         -j ACCEPT
    
      einfo "Creating outgoing http/https traffic chain"
      $IPTABLES -N allow-www-traffic-out
      $IPTABLES -F allow-www-traffic-out
      $IPTABLES -A allow-www-traffic-out -p tcp --dport www -j ACCEPT
      $IPTABLES -A allow-www-traffic-out -p tcp --dport https -j ACCEPT
    
      #Catch portscanners
      einfo "Creating portscan detection chain"
      $IPTABLES -N check-flags
      $IPTABLES -F check-flags
      $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -m limit \
          --limit 5/minute -j LOG --log-level alert --log-prefix "NMAP-XMAS:"
      $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
      $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -m limit --limit \
          5/minute -j LOG --log-level 1 --log-prefix "XMAS:"
      $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -j DROP
      $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG \
          -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS-PSH:"
      $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
      $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -m limit \
          --limit 5/minute -j LOG --log-level 1 --log-prefix "NULL_SCAN:"
      $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -j DROP
      $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -m limit \
          --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/RST:"
      $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
      $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit \
          --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/FIN:"
      $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
    
      # Apply and add invalid states to the chains
      einfo "Applying chains to INPUT"
      $IPTABLES -A INPUT -m state --state INVALID -j DROP
      $IPTABLES -A INPUT -p icmp -j icmp_allowed
      $IPTABLES -A INPUT -j check-flags
      $IPTABLES -A INPUT -i lo -j ACCEPT
      $IPTABLES -A INPUT -j allow-ssh-traffic-in
      $IPTABLES -A INPUT -j allowed-connection
    
      einfo "Applying chains to FORWARD"
      $IPTABLES -A FORWARD -m state --state INVALID -j DROP
      $IPTABLES -A FORWARD -p icmp -j icmp_allowed
      $IPTABLES -A FORWARD -j check-flags
      $IPTABLES -A FORWARD -o lo -j ACCEPT
      $IPTABLES -A FORWARD -j allow-ssh-traffic-in
      $IPTABLES -A FORWARD -j allow-www-traffic-out
      $IPTABLES -A FORWARD -j allowed-connection
    
      einfo "Applying chains to OUTPUT"
      $IPTABLES -A OUTPUT -m state --state INVALID -j DROP
      $IPTABLES -A OUTPUT -p icmp -j icmp_allowed
      $IPTABLES -A OUTPUT -j check-flags
      $IPTABLES -A OUTPUT -o lo -j ACCEPT
      $IPTABLES -A OUTPUT -j allow-ssh-traffic-out
      $IPTABLES -A OUTPUT -j allow-dns-traffic-out
      $IPTABLES -A OUTPUT -j allow-www-traffic-out
      $IPTABLES -A OUTPUT -j allowed-connection
    
      #Allow client to route through via NAT (Network Address Translation)
      $IPTABLES -t nat -A POSTROUTING -o $OINTERFACE -j MASQUERADE
      eend $?
    }
    
    start() {
      ebegin "Starting firewall"
      if [ -e "${FIREWALL}" ]; then
        restore
      else
        einfo "${FIREWALL} does not exists. Using default rules."
        rules
      fi
      eend $?
    }
    
    stop() {
      ebegin "Stopping firewall"
      $IPTABLES -F
      $IPTABLES -t nat -F
      $IPTABLES -X
      $IPTABLES -P FORWARD ACCEPT
      $IPTABLES -P INPUT   ACCEPT
      $IPTABLES -P OUTPUT  ACCEPT
      eend $?
    }
    
    showstatus() {
      ebegin "Status"
      $IPTABLES -L -n -v --line-numbers
      einfo "NAT status"
      $IPTABLES -L -n -v --line-numbers -t nat
      eend $?
    }
    
    panic() {
      ebegin "Setting panic rules"
      $IPTABLES -F
      $IPTABLES -X
      $IPTABLES -t nat -F
      $IPTABLES -P FORWARD DROP
      $IPTABLES -P INPUT   DROP
      $IPTABLES -P OUTPUT  DROP
      $IPTABLES -A INPUT -i lo -j ACCEPT
      $IPTABLES -A OUTPUT -o lo -j ACCEPT
      eend $?
    }
    
    save() {
      ebegin "Saving Firewall rules"
      $IPTABLESSAVE > $FIREWALL
      eend $?
    }
    
    restore() {
      ebegin "Restoring Firewall rules"
      $IPTABLESRESTORE < $FIREWALL
      eend $?
    }
    
    restart() {
      svc_stop; svc_start
    }
    
    showoptions() {
      echo "Usage: $0 {start|save|restore|panic|stop|restart|showstatus}"
      echo "start)      will restore setting if exists else force rules"
      echo "stop)       delete all rules and set all to accept"
      echo "rules)      force settings of new rules"
      echo "save)       will store settings in ${FIREWALL}"
      echo "restore)    will restore settings from ${FIREWALL}"
      echo "showstatus) Shows the status"
    }
    
    Здесь следует пояснить следующее:
    Подключения к межсетевому экрану разрешены только через SSH (порт 22)
    Локальная сеть должна иметь доступ к HTTP, HTTPS и SSH (также должен быть разрешен DNS)
    ICMP может содержать постороннюю информацию и не должен быть разрешен. Конечно же, мы разрешаем некоторые ICMP-сообщения.
    Сканирование портов должно быть определено и зарегистрировано
    SYN-flood атаки должны быть пресечены
    Весь остальной трафик должен быть отброшен и запротоколирован.

    Вот несколько советов при создании правил для межсетевого экрана:
    Создайте политику межсетевого экрана до того, как ее реализуете
    Сделайте ее простой
    Знайте принцип работы каждого протокола (прочитайте подходящий RFC)
    Всегда помните, что межсетевой экран — это просто программа, запускаемая с правами администратора.
    Проверьте свой межсетевой экран

    Если вам кажется, что iptables труден для понимания или нужно слишком много времени для настройки межсетевого экрана, то вы можете попробовать Shorewall. Для генерации правил межсетевого экрана он использует iptables, но акцентируется на правилах и не указывает протокол.

    А вот у HaOS'a я не понял зачем сначала было делать так:
    Code:
    # Устанавливаем политику по умолчанию ACCEPT
    $IPTABLES -P INPUT ACCEPT
    $IPTABLES -P OUTPUT ACCEPT
    $IPTABLES -P FORWARD ACCEPT
    
    Ставь сразу в DROP.

    А потом перебирать все модули. Поясни, pls =)
    А так я бы ему за работу "+" поставил, если б мог =)
     
    #4 ShadOS, 13 Feb 2007
    Last edited: 13 Feb 2007
    1 person likes this.
  5. L0rd_Ha0S

    L0rd_Ha0S Elder - Старейшина

    Joined:
    25 Jan 2006
    Messages:
    148
    Likes Received:
    102
    Reputations:
    64
    Так ты ж посмотри в какой функции все это делается - stop_firewall()
    Политики по умолчанию устанавливаются в ACCEPT, потому что если я этого не сделаю, то при остановке фаервола они остануться в DROP, тогда получается, что ты остановил фаер, а он все равно все дропает :)
    Она и стоит в DROP в соответствующей функции ;)
    И модули перебираются в той же функции.
    Тут проверяется, загружен ли указанный модуль, и если да, то он выгружается из оперативки. Этого конечно можно и не делать, просто мне вывод lsmod глаза мозолит(хоть и нечасто туда заглядываю :)), не люблю когда много буковок выводит =)
    Статью твою обязательно прочитаю в ближайшее время. А в скрипте, который ты привел я уже нашел несколько интересных для меня вещей. Tnx :)
     
  6. ShadOS

    ShadOS ы

    Joined:
    11 Feb 2007
    Messages:
    667
    Likes Received:
    351
    Reputations:
    413
    Спасибо, прояснил. Насчёт Accept я сразу что-то не заметил... невнимательность...
     
    1 person likes this.
  7. L0rd_Ha0S

    L0rd_Ha0S Elder - Старейшина

    Joined:
    25 Jan 2006
    Messages:
    148
    Likes Received:
    102
    Reputations:
    64
    Неужели больше никто не пользуется iptables?
     
    2 people like this.
  8. andy13

    andy13 Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    100
    Likes Received:
    15
    Reputations:
    3
    пользовался раньше, сейчас в этом нет необходимости.
    всё в policy ACCEPT.
     
  9. Stefun

    Stefun Elder - Старейшина

    Joined:
    19 Nov 2006
    Messages:
    48
    Likes Received:
    29
    Reputations:
    11
    Понравилось у ShadOS. Хотя у меня правила намного проще прописаны. Хотя за старания + обоим
     
    1 person likes this.
  10. BMaster

    BMaster Elder - Старейшина

    Joined:
    12 Jan 2006
    Messages:
    32
    Likes Received:
    34
    Reputations:
    7
    Кому интересно это то что у меня:
    Code:
    #!/bin/sh
    IPTABLES=/sbin/iptables
    $IPTABLES -F
    $IPTABLES -t nat -F
    $IPTABLES -X
    $IPTABLES -P INPUT DROP
    $IPTABLES -P OUTPUT ACCEPT
    $IPTABLES -P FORWARD DROP
    $IPTABLES -A FORWARD -i ! lo -j DROP
    
    #traffic count begin #правила для моей системы учета трафика состоящей из 2х скриптов.
    $IPTABLES -A INPUT -i ppp+ -j  LOG --log-prefix "count"
    $IPTABLES -A OUTPUT -o ppp+ -j  LOG --log-prefix "count"
    #traffic count end
    #разрешаю все коннекты на мой фтп в локальной сети
    $IPTABLES -A INPUT -i eth+ -p tcp -m multiport --dport 21 -j ACCEPT
    
    #устанавливаем в заголовке пакетов величину ttl (Time To Live): исходящие 64, входящие 128. Приведу цитату из мануала "Увеличение поля TTL может использоваться для того, чтобы сделать наш брандмауэр менее "заметным" для трассировщиков (traceroutes). Программы трассировки любят за ценную информацию при поиске проблемных участков сети, и ненавидят за это же, поскольку эта информация может использоваться крякерами в неблаговидных целях."
    $IPTABLES -t mangle -A OUTPUT -j TTL --ttl-set 64
    $IPTABLES -t mangle -A PREROUTING -m ttl --ttl-gt 128 -j TTL --ttl-set 128
    $IPTABLES -t mangle -A PREROUTING -m ttl --ttl-lt 128 -j TTL --ttl-set 128
    $IPTABLES -t mangle -A PREROUTING -p TCP --dport 33434:33542 -j TTL --ttl-inc 1
    
    #TV begin #Здесь специфические правила, разрешающие прием радио и теле передач в локальной сети.
    $IPTABLES -A INPUT -i eth+ -s 192.168.172.0/24 -j ACCEPT
    $IPTABLES -A INPUT -i eth+ -d 225.10.10.0/28 -j ACCEPT
    $IPTABLES -A INPUT -i eth+ -s 192.168.204.0/24 -j ACCEPT
    $IPTABLES -A INPUT -i eth+ -d 192.168.204.0/24 -j ACCEPT
    #TV end
    
    #Запретить все входящие на локальные интерфейсы источником назначения которых не является мой ip
    $IPTABLES -A INPUT -i eth+ -d ! 10.x.x.x -j DROP
    
    #Запретить все входящие на порт 80,21,4662 из интернета.
    $IPTABLES -A INPUT -i ppp+ -p tcp -m multiport --dport 80,21,4662 -j DROP
    
    #icmp security begin #Настройка безопасности протокола icmp
    #Эта строка блокирует  icmp пакеты (тип 8) т.е запрос, которые превышают установленное количество в единицу времени. Т.о это позволяет избежать атаки вида пинг-флуд. на лишние пакеты отсылается ответ Destination host administratively prohibited
    $IPTABLES -A INPUT -p icmp --icmp-type 8 -m limit --limit 30/minute --limit-burst 1 -j REJECT --reject-with icmp-host-prohibited
    $IPTABLES -A INPUT -p icmp --icmp-type 8 -j DROP
    #Эта строка блокирует icmp пакеты (тип 0) т.е ответ, эта нужно для того, чтобы когда я буду сам проводить атаку такого типа, ответы от атакуемого хоста не забивали мне канал :)
    $IPTABLES -A INPUT -p icmp --icmp-type 0 -m limit --limit 1/second --limit-burst 1 -j ACCEPT
    $IPTABLES -A INPUT -p icmp --icmp-type 0 -j DROP
    #Все остально пропускается тоже по принципу "количество в единицу времени"
    $IPTABLES -A INPUT -p icmp -m limit --limit 1/minute --limit-burst 1 -j ACCEPT
    $IPTABLES -A INPUT -p icmp -m limit --limit 1/second --limit-burst 1 -j REJECT --reject-with icmp-host-prohibited
    $IPTABLES -A INPUT -p icmp -j DROP
    #icmp security end
    
    #udp security begin# Настройка безопасности протокола udp
    $IPTABLES -A INPUT -i lo -j ACCEPT
    #Разрешаю все с адреса 10.y.y.y для игры в quake3 :) разрешаю все коннекты с адресов источником которых является 53й порт.
    $IPTABLES -A INPUT -i eth+ -s 10.y.y.y -j ACCEPT
    $IPTABLES -A INPUT -p udp --sport 53 -j ACCEPT
    #Лимит в единицу времени, чтобы не зафлудили.
    $IPTABLES -A INPUT -p udp -m limit --limit 1/second --limit-burst 1 -j REJECT --reject-with icmp-host-prohibited
    $IPTABLES -A INPUT -p udp -j DROP
    #udp security end
    
    #tcp security begin #настройка tcp
    #первые 2 строки логирование и сброс пакетов с флагами SYN,ACK SYN,ACK имеющими статус NEW
    $IPTABLES -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j  LOG --log-prefix "new_syn/ack " --log-ip-options --log-tcp-options
    $IPTABLES -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN,ACK -j ACCEPT
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL ACK -j ACCEPT
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL FIN,ACK -j ACCEPT
    
    #(sync secure bgin) #TARPIT сейчас не использую.
    #$IPTABLES -A INPUT -p tcp -m tcp --dport 22 -j TARPIT
    #$IPTABLES -A INPUT -p tcp -m tcp --dport 79 -j TARPIT
    #$IPTABLES -A INPUT -p tcp -m tcp --dport 81 -j TARPIT
    #$IPTABLES -A INPUT -p tcp -m tcp --dport 1 -j TARPIT
    #$IPTABLES -A INPUT -p tcp -m tcp --dport 8008 -j TARPIT
    #$IPTABLES -A INPUT -p tcp -m tcp --dport 8080 -j TARPIT
    #Защита от syn атак.
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN -m limit --limit 15/minute --limit-burst 1 -j ACCEPT
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN -m limit --limit 1/second --limit-burst 1 -j REJECT --reject-with icmp-host-prohibited
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN -j  LOG --log-prefix "left_syn " --log-ip-options --log-tcp-options
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL SYN -j DROP
    #(sync secure end)
    
    #Далее те состояния о которых я знаю, разрешены, те состояния которых быть не может запрещены.
    #(scan inherit secure begin)
    $IPTABLES -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST  RST -m limit --limit 15/minute --limit-burst 1 -j ACCEPT
    $IPTABLES -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST  RST -m limit --limit 1/second --limit-burst 1 -j REJECT --reject-with icmp-host-prohibited
    $IPTABLES -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST  RST -j  LOG --log-prefix "left_rst " --log-ip-options --log-tcp-options
    $IPTABLES -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST  RST -j DROP
    #(scan inherit secure end)
    
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL       FIN,URG,PSH           -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL       ALL                   -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL       SYN,RST,ACK,FIN,URG   -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags ALL       NONE                  -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags SYN,RST   SYN,RST               -j DROP
    $IPTABLES -A INPUT -p tcp --tcp-flags SYN,FIN   SYN,FIN               -j DROP
    
    $IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j  LOG --log-prefix "new_nesyn " --log-ip-options --log-tcp-options
    $IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
    $IPTABLES -A INPUT -m state --state INVALID -j DROP
    #$IPTABLES -A INPUT -p tcp -m tcp --dport 137:139 -j TARPIT
    $IPTABLES -A INPUT -m state --state  RELATED,ESTABLISHED -j ACCEPT
    $IPTABLES -A INPUT -p tcp -m limit --limit 1/second --limit-burst 1 -j REJECT --reject-with icmp-host-prohibited
    $IPTABLES -A INPUT -p tcp -j DROP
    #tcp security end
    #все что я упустил, записывается в лог, и блокируется.
    #$ipt -A FORWARD -p tcp --syn  -i eth1  -m connlimit --connlimit-above 15 -j  REJECT 
    $IPTABLES -A INPUT -p ALL -j  LOG --log-prefix "proto_left " --log-ip-options --log-tcp-options
    $IPTABLES -A INPUT -p ALL -j DROP
    $IPTABLES -A FORWARD -j DROP
    $IPTABLES -A INPUT -j DROP
    
    
    p.s про TARPIT почитать можно здесь: Скрытые возможности iptables
    Скачать патч можно здесь: patch-o-matic-ng
     
    #10 BMaster, 22 Feb 2007
    Last edited: 22 Feb 2007
    2 people like this.