iptables+RHEL5+локалка (перестаёт работать)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

Аватара пользователя
Bear
Сообщения: 112

iptables+RHEL5+локалка

Сообщение Bear »

Вообщем настроена машина шлюзом в интернет под RedHat Enterprise 5 - iptables фаервол
Разрешенно определённым машинам (по мак адресам) по определённым портам (80,81,110,25) доступ в интернет
Всё работает, но проявляется неприятная ситуация
через промежуток времени перестают на клиентских машинах открываться странички и получаться почта
В чём может быть проблема? И ещё может конфиг как то усовершенствовать? Зарание благодарен за помощь!
Вот конфиг iptables:
# Generated by iptables-save v1.3.5 on Mon Sep 22 11:05:08 2008
*nat
:PREROUTING ACCEPT [160:17336]
:POSTROUTING ACCEPT [126:7719]
:OUTPUT ACCEPT [139:10053]
-A POSTROUTING -o eth0 -j MASQUERADE
-A POSTROUTING -o 192.168.2.3 -j MASQUERADE
COMMIT
# Completed on Mon Sep 22 11:05:08 2008
# Generated by iptables-save v1.3.5 on Mon Sep 22 11:05:08 2008
*filter
:INPUT DROP [196:22233]
:FORWARD DROP [3:136]
:OUTPUT DROP [0:0]
:allowed - [0:0]
:bad_tcp_packets - [0:0]
:icmp_packets - [0:0]
:tcp_packets - [0:0]
:udp_packets - [0:0]
-A INPUT -s 192.168.0.0/255.255.0.0 -i eth1 -j ACCEPT
-A INPUT -s 127.0.0.1 -i lo -j ACCEPT
-A INPUT -s 192.168.2.88 -i lo -j ACCEPT
-A INPUT -s 192.168.2.3 -i lo -j ACCEPT
-A INPUT -i eth1 -p udp -m udp --sport 68 --dport 67 -j ACCEPT
-A INPUT -d 192.168.2.3 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -j tcp_packets
-A INPUT -i eth0 -p udp -j udp_packets
-A INPUT -i eth0 -p icmp -j icmp_packets
-A INPUT -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix "IPT_INPUT_packet_died:" --log-level 7
-A FORWARD -i eth1 -m mac --mac-source 00:04:4B:80:80:03 -j ACCEPT
-A FORWARD -i eth1 -j DROP
-A FORWARD -o eth1 -j DROP
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix "IPT_FORWARD_packet_died:" --log-level 7
-A OUTPUT -p tcp -j bad_tcp_packets
-A OUTPUT -s 127.0.0.1 -j ACCEPT
-A OUTPUT -s 192.168.2.88 -j ACCEPT
-A OUTPUT -s 192.168.2.3 -j ACCEPT
-A OUTPUT -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix "IPT_INPUT_packet_died:" --log-level 7
-A allowed -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
-A allowed -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A allowed -p tcp -j DROP
-A bad_tcp_packets -p tcp -m tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
-A bad_tcp_packets -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j LOG --log-prefix "NEW_NOT_SYN:"
-A bad_tcp_packets -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
-A icmp_packets -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A icmp_packets -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A tcp_packets -p tcp -m tcp --dport 25 -j allowed
-A tcp_packets -p tcp -m tcp --dport 110 -j allowed
-A tcp_packets -p tcp -m tcp --dport 53 -j allowed
-A tcp_packets -p tcp -m tcp --dport 80 -j allowed
-A tcp_packets -p tcp -m tcp --dport 81 -j allowed
COMMIT
# Completed on Mon Sep 22 11:05:08 2008
Такова жизнь!
Спасибо сказали:
Аватара пользователя
nacmyx
Сообщения: 101
ОС: centos

Re: iptables+RHEL5+локалка

Сообщение nacmyx »

Скажу просто - конфиг весьма странный. Похоже составлен из кусков без понимания работы таблеса.
Не совсем понял как могут быть быть
-A OUTPUT -p tcp -j bad_tcp_packets

с
-A OUTPUT -p tcp -j bad_tcp_packets

вашего же хоста? Не верим собственной машинке?

UPD:

Перечитал и понял что сморозил.

Новая версия вопроса - ниже.
1. -A OUTPUT -p tcp -j bad_tcp_packets < не верите собственной машине

2. -A bad_tcp_packets -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP

!!!!! а что делать с пакетами которые не прошли bad_tcp_packets ?

-A icmp_packets -p icmp -m icmp --icmp-type 8 -j ACCEPT

3. При политике :OUTPUT DROP [0:0] как выпускаются пакеты?
4. Трудно написать скрипт таблеса + каменты что делает то или иное правило?
Например, вот таким макаром:

Код: Выделить всё

[root@maingw init.d]# cat iptables | more
#!/bin/bash
#
# iptables      Start iptables firewall
#
# chkconfig: 2345 08 92
# description:  Starts, stops and saves iptables firewall
#
# config: /etc/sysconfig/iptables
# config: /etc/sysconfig/iptables-config
#
# Handmade by nacmyx
#
# з0бацан0 для Gейта локальной сети в мир
#
################################################################################
################
# где живет иптаблес
IPT="/sbin/iptables"

#локалхост
LO_IFACE="lo"
LO_IP="127.0.0.1"

# внутренний интерфейс
LOCAL_IP="192.168.10.8"
LOCAL_NET="192.168.10.0/24"
LOCAL_IFACE="eth0"
LOCAL_BROADCAST="192.168.10.255"

# внешний интерфейс
СКИПНУТО
################################################################################
################
start_fw()
{
# загружаем то шо якобы надо
echo "Loading modules:"
/sbin/modprobe ip_tables
    if [ $? -eq 0 ]; then
        echo "load ip_tables................... OK "
    else
        echo "load ip_tables ERROR!"
    fi

/sbin/modprobe ip_conntrack
    if [ $? -eq 0 ]; then
        echo "load ip_conntrack................ OK "
    else
        echo "load ip_conntrack ERROR!"
    fi

/sbin/modprobe iptable_filter
    if [ $? -eq 0 ]; then
        echo "load iptable_filter.............. OK "
    else
        echo "load iptable_filter ERROR!"
    fi

/sbin/modprobe iptable_mangle
    if [ $? -eq 0 ]; then
        echo "load iptable_mangle.............. OK "
    else
        echo "load iptable_mangle ERROR!"
    fi

/sbin/modprobe iptable_nat
    if [ $? -eq 0 ]; then
        echo "load iptable_nat................. OK "
    else
        echo "load iptable_nat ERROR!"
    fi

/sbin/modprobe ipt_ULOG
    if [ $? -eq 0 ]; then
        echo "load ipt_ULOG.................... OK "
    else
        echo "load ipt_ULOG ERROR!"
    fi

/sbin/modprobe ipt_limit
    if [ $? -eq 0 ]; then
        echo "load ipt_limit................... OK "
    else
        echo "load ipt_limit ERROR!"
    fi

/sbin/modprobe ipt_state
    if [ $? -eq 0 ]; then
        echo "load ipt_state................... OK "
    else
        echo "load ipt_state ERROR!"
    fi

# Удаляем напрочь все правила что были изо всех цепочек - так надо
$IPT -F
$IPT -F -t nat
$IPT -F -t mangle

# Ну и говорим  что все дропать - на всякий случай
# (политики по умолчанию)
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT

# Удаляем возможные цепочки что админ накрутил :)
$IPT -X
$IPT -X -t nat
$IPT -X -t mangle

############## Подкручиваем в ядре #############################################################
# йенабле форвардинх
echo 1 >/proc/sys/net/ipv4/ip_forward

#not to accept redirect messages
#echo 0 > /proc/sys/net/ipv4/conf/eth1/accept_redirects

#длина очереди ожыдающих сина SYN
echo 2048 > /proc/sys/net/ipv4/tcp_max_syn_backlog

# игнорировать очередь ожиданий из предыдущего правила
#echo 1 > /proc/sys/net/ipv4/tcp_syncookies

############## Конец подкрутки в ядре ##########################################################

############## ICMP цепочки ####################################################################
$IPT -N icmp_packets
$IPT -A icmp_packets -p ICMP --icmp-type 0  -j ACCEPT
$IPT -A icmp_packets -p ICMP --icmp-type 3  -j ACCEPT
$IPT -A icmp_packets -p ICMP --icmp-type 8  -j ACCEPT
$IPT -A icmp_packets -p ICMP --icmp-type 11 -j ACCEPT
$IPT -A icmp_packets -p ICMP --icmp-type 30 -j ACCEPT
$IPT -A icmp_packets -p ICMP  -j DROP

############## Конец цепочки ICMP ##############################################################

############## TCP цепочки #####################################################################
$IPT -N tcp_packets
$IPT -A tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
$IPT -A tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
$IPT -A tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
$IPT -A tcp_packets -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
$IPT -A tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j DROP
$IPT -A tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
$IPT -A tcp_packets -p tcp -j RETURN

############## Конец цепочки TCP ###############################################################

############## UDP цепочки #####################################################################
$IPT -N udp_packets
$IPT -A udp_packets -p udp -j RETURN

############## Конец цепочки UDP ###############################################################

# Из localhost можна делать всё
$IPT  -A INPUT  -p ALL  -i $LO_IFACE   -j  ACCEPT
$IPT -A OUTPUT  -p ALL -o $LO_IFACE  -j ACCEPT

# гре разрешаем сразу
$IPT -A INPUT -p 47 -j ACCEPT
$IPT -A OUTPUT -p 47 -j ACCEPT

# Горбатые инвалидные пакеты убивать молча
$IPT -A INPUT   -m state --state INVALID -j DROP
$IPT -A FORWARD -m state --state INVALID -j DROP


# В самом начале - если соединение эстаблишед то быстренько
# пропускаем его и не нагружаем машинку
$IPT -A INPUT   -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# все IСMP заворачиваем в нашу хитрую цепочку icmp_packets
$IPT -A INPUT -p ICMP  -j icmp_packets
$IPT -A FORWARD -p ICMP  -j icmp_packets

# все TCP заворачиваем в нашу хитрую цепочку tcp_packets
$IPT -A INPUT -p TCP -i $INET_IFACE -j tcp_packets
$IPT -A FORWARD -p TCP -i $INET_IFACE -j tcp_packets

# все UDP заворачиваем в нашу хитрую цепочку udp_packets
$IPT -A INPUT -p UDP -i $INET_IFACE -j udp_packets
$IPT -A FORWARD -p UDP -i $INET_IFACE -j udp_packets

############## Правила мутим тут ###############################################################

# ДНС может работать внутри
# НЕ контролируем кто инициировал соединение
$IPT -A INPUT -p tcp -m tcp -i $LOCAL_IFACE --dport 53 -j ACCEPT
$IPT -A INPUT -p udp -m udp -i $LOCAL_IFACE --dport 53 -j ACCEPT

# тут разришаем входящие на наш мыллер
$IPT -A INPUT -p tcp -m tcp --dport 25 -i $INET_IFACE -j ACCEPT

# ssh из любого места
$IPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
$IPT -A INPUT -p udp -m udp --dport 22 -j ACCEPT

# тут мы разрешаем воркать  еще один мыллер в мире СКИПНУТО
# pop3 tcp port 110
# smtp tcp port 25
$IPT -A FORWARD -i $LOCAL_IFACE -o $INET_IFACE -p tcp -m tcp --dport 110 -d СКИПНУТО  -j ACCEPT
$IPT -t nat -A POSTROUTING -o $INET_IFACE -p tcp -m tcp  --dport 110  -d СКИПНУТО -j SNAT --to-source $INET_IP
$IPT -A FORWARD -i $LOCAL_IFACE -o $INET_IFACE -p tcp -m tcp --dport 25 -d СКИПНУТО  -j ACCEPT
$IPT -t nat -A POSTROUTING -o $INET_IFACE -p tcp -m tcp --dport 25  -d СКИПНУТО -j SNAT --to-source $INET_IP

ОЧЕНЬ МНОГО ПОСКИПАНО

############## КОНЕЦ ВСЕХ ПРАВИЛ ###############################################################
}

################################################################################
################
case "$1" in
start)  echo  "Starting iptables"
    start_fw
    echo "."
   ;;
################################################################################
################
stop)   echo  "Stopping firewall: iptables"
# фактически останов файрвола на самом деле обрезанный вариант рабочего - только пинги
    $IPT -F

# Удаляем возможные цепочки что админ накрутил :)
    $IPT -X

# чистим в таблице filter
    $IPT -t filter -P INPUT DROP
    $IPT -t filter -P OUTPUT DROP
    $IPT -t filter -P FORWARD DROP

    $IPT  -A INPUT  -p ALL  -i $LO_IFACE   -j  ACCEPT
    $IPT -A OUTPUT  -p ALL -o $LO_IFACE  -j ACCEPT

    $IPT -A INPUT  -p ICMP --icmp-type 0 -j ACCEPT # echo reply
    $IPT -A OUTPUT -p ICMP --icmp-type 0 -j ACCEPT # echo reply

    $IPT -A INPUT  -p ICMP --icmp-type 8 -j ACCEPT # echo request
    $IPT -A OUTPUT -p ICMP --icmp-type 8 -j ACCEPT # echo request

    $IPT -A INPUT -p tcp -i $LOCAL_IFACE --dport 22 -j ACCEPT
    $IPT -A INPUT -p udp -i $LOCAL_IFACE --dport 22 -j ACCEPT

    $IPT -A OUTPUT -p tcp -o $LOCAL_IFACE --sport $SSHD_PORT  -j ACCEPT
    $IPT -A OUTPUT -p udp -o $LOCAL_IFACE --sport $SSHD_PORT  -j ACCEPT

    echo "done."
   ;;
################################################################################
################
*)      echo "Usage: /etc/init.d/rc.iptables start|stop"
    exit 1
   ;;
esac
exit 0


Скрипт хитрый, ежели кто захочет попробовать - потренируйтесь предварительно. Рестарт вырезал, оставляю в качестве домашнего задания. :tongue:
от бабусь есть польза - они иногда умирают
Спасибо сказали: