Настройка iptables для дома и локальных сетей с выходом в интернет

Материал из Kalina_LUG_Wiki
Перейти к: навигация, поиск

Когда только перешел на Линукс по привычке начал беспокоится о безопасности компьютера. А с учетом того, что на Диалоге и Интернет и локальная сеть, то тем более неспокойно стало:) В поисках файервола сначала пользовался guarddog, а потом узнал, что можно самому написать правила с помощью iptables. Перерыв кучу документации в Интернете по iptables нашел интересную ((http://www.nclug.ru/wiki/index.php?page=iptables-howto статью)) на nclug.ru. По аналогии с ней и строил дома файервол. Привожу текст этой статьи.

Все что нам нужно:

  • iptables (есть в каждом новом дистрибутиве Linux)

(http://linux.yaroslavl.ru/docs/gazette/lg/archive/iptables-tutorial-1.1.19.tar.bz2 Хорошая документация по iptables на русском.)

Итак, начнем разбор полетов:
Сначала читаем туториал из скачаного архива iptables-tutorial-1.1.19.tar.bz2 :)

Для начала о порядке прохождения цепочек:
Упрощенно это можно представить так:
Ipt-seq.JPG
Как видно, для домашней машины важны только цепочки INPUT и OUTPUT. Цепочка FORWARD обрабатывает транзитные пакеты(когда машина является шлюзом между 2-я или более сетями).

Чтобы разобраться как работает файрвол в линукс, опишем каждый параметр в скриптах.
1-й скрипт - для домашнего компьютера(без локальной сети).
2-й скрипт - для шлюзового сервера (между 2-мя сетями - например вашей локалкой и интернетом).

  • Листинг 1:
#!/bin/sh
INET_IP="0/0"
INET_IFACE="ppp0" #Это интерфейс, смотрящий в интернет (ppp,ippp,eth)
#Конфигурация localhost
LO_IFACE="lo"
LO_IP="127.0.0.1"
#Путь к iptables
IPTABLES="iptables"
#Грузим модули
/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state
#DROP по дефолту - Политика файрвола по умолчанию - что не разрешено, то запрещено.
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
#Создаем собственные цепочки
$IPTABLES -N bad_tcp_packets #Цепочка для фильтрования "плохих" TCP пакетов.
$IPTABLES -N allowed #Цепочка, разрешающая прохождение пакетов
$IPTABLES -N tcp_packets #Цепочка для tcp-пакетов, приходящих на Вашу машину(список портов TCP, открытых на Вашей машине)
$IPTABLES -N udp_packets #Цепочка для udp-пакетов, приходящих на Вашу машину(список портов UDP, открытых на Вашей машине)
$IPTABLES -N icmp_packets #Цепочка для фильтрования ICMP
#
# Цепочка bad_tcp_packets
#
$IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
#
# Цепочка allowed
#
$IPTABLES -A allowed -p TCP --syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed -p TCP -j DROP
#
# Порты TCP (для сервисов, запущенных на Вашей машине!)
#
#$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 21 -j allowed #Если на вашей машине есть сервер FTP
#$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 22 -j allowed #Если на вашей машине есть сервер SSH
#
#$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 80 -j allowed #Если на вашей машине есть сервер HTTP
#
# Порты UDP (для сервисов, запущенных на Вашей машине!)
#
#$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 53 -j ACCEPT #Если на вашей машине есть сервер DNS
#
# Правила ICMP
#
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT #Пропускаем на машину только icmp типа 8
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT #Пропускаем на машину только icmp типа 11
#Цепочка INPUT
$IPTABLES -A INPUT -p tcp -j bad_tcp_packets #Обрабатываем протокол tcp на цепочке bad_tcp_packets
$IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets #Обрабатываем входящие пакеты по цепочке tcp_packets
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets #Обрабатываем входящие пакеты по цепочке udp_packets
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets #Обрабатываем входящие пакеты по цепочке icmp_packets

#Цепочка OUTPUT
$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets
$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT
  • Листинг 2:
#!/bin/sh
#
# Для сервера локальной сети с выходом в интернет
#
#
# Конфигурация Интернет-интерфейса.
#
INET_IP="0/0" #Ваш внешний IP - если динамический - то 0/0
INET_IFACE="ppp0" #Ваш интерфейс в интернет (ppp,ippp,eth)
#INET_BROADCAST="212.96.100.255" #Броадкаст(нужен, если есть статический ip в интернет)
#
# Конфигурация LAN-интерфейса
#
LAN_IP="10.0.0.2"
LAN_IP_RANGE="10.0.0.0/8"
LAN_IFACE="eth0"
#
# Конфигурация localhost.
#
LO_IFACE="lo"
LO_IP="127.0.0.1"

#
# Конфигурация IPTables.
#
IPTABLES="iptables"
#Загрузка модулей
/sbin/depmod -a
#
# Необходимые модули
#
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state
#
# Дополнительные модули
#
#/sbin/modprobe ipt_owner
#/sbin/modprobe ipt_REJECT
/sbin/modprobe ipt_MASQUERADE
#/sbin/modprobe ip_conntrack_ftp
#/sbin/modprobe ip_conntrack_irc
#/sbin/modprobe ip_nat_ftp
#/sbin/modprobe ip_nat_irc
#
# Включаем FORWARDинг
#
echo "1" > /proc/sys/net/ipv4/ip_forward
#
# Политика по умолчанию
#
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
#
# Создание собственных цепочек
#
$IPTABLES -N bad_tcp_packets
$IPTABLES -N allowed
$IPTABLES -N tcp_packets
$IPTABLES -N udp_packets
$IPTABLES -N icmp_packets
#
# Заполнение собственных цепочек
#
#
# Цепочка bad_tcp_packets
#
$IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
#
# Цепочка allowed
#
$IPTABLES -A allowed -p TCP --syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed -p TCP -j DROP
#
# Порты TCP
#
#$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 21 -j allowed
#$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 22 -j allowed
#$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 80 -j allowed
#
# Порты UDP
#
#$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 53 -j ACCEPT
#
# Правила ICMP
#
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
#
# Цепочка INPUT
#
$IPTABLES -A INPUT -p tcp -j bad_tcp_packets
#
# Правила для LAN (разрешаем все)
#
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT
#
# Правила для пакетов из интернета
#
$IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
#
# Цепочка FORWARD
#
$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets
#
# FORWARDинг на всю локальную сеть.(Пользователи из локалки могут ходить в интернет)
#
$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#
# Цепочка OUTPUT
#
$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets
#
# Правила цепочки
#
$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT
#
# Включаем IP Forwarding и трансляцию адресов(или маскарадинг)
#
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE #если ip динамический
#$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_IP #если ip статический
#$IPTABLES -t nat -A PREROUTING -i $LAN_IFACE -d ! $LAN_IP_RANGE -p tcp --dport 80 -j REDIRECT --to-port 3128 #это нужно для #того случая, когда вы хотите сделать
transparent-прокси
#В конфиге squid надо добавить для этого:
#httpd_accel_host virtual
#httpd_accel_port 80
#httpd_accel_with_proxy on
#httpd_accel_uses_host_header on

http://kalina.lug.ru/e107_plugins/forum/forum_viewtopic.php?2421 Обсуждение