Вообщем настроена машина шлюзом в интернет под 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
iptables+RHEL5+локалка (перестаёт работать)
Модераторы: SLEDopit, Модераторы разделов
-
nacmyx
- Сообщения: 101
- ОС: centos
Re: iptables+RHEL5+локалка
Скажу просто - конфиг весьма странный. Похоже составлен из кусков без понимания работы таблеса.
Не совсем понял как могут быть быть
с
вашего же хоста? Не верим собственной машинке?
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. Трудно написать скрипт таблеса + каменты что делает то или иное правило?
Например, вот таким макаром:
Скрипт хитрый, ежели кто захочет попробовать - потренируйтесь предварительно. Рестарт вырезал, оставляю в качестве домашнего задания.
Не совсем понял как могут быть быть
-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Скрипт хитрый, ежели кто захочет попробовать - потренируйтесь предварительно. Рестарт вырезал, оставляю в качестве домашнего задания.
от бабусь есть польза - они иногда умирают