Технический форум
Вернуться   Технический форум > Дневники > Hirurg


Оценить эту запись

Огненная стена: iptables

Запись от Hirurg размещена 13.02.2012 в 21:56

Настраиваем файрвол iptables.
ОС: Debian 6


В интернете огромное количество вариантов настройки файрвола....предлагаю свою...

Для начала создадим файл iptables

$ touch iptables /etc/init.d/if-pre-up.d/

Даем ему права...

$ chmod 711 /etc/init.d/if-pre-up.d/iptables

и так......у нас:

eth0 - интерфейс WAN

eth1 - интерфейс LAN

eth2 - интерфейс DMZ

10.10.10.1/24 - ip интерфейса WAN

192.168.1.1/24 - ip интерфейса LAN

192.168.5.1/28 - ip интерфейса DMZ

пишем в файл:
#!/bin/sh

Разрешаем форвардинг:
echo "1" > /proc/sys/net/ipv4/ip_forward

Сбрасываем все правила:
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -t nat -F PREROUTING
iptables -t nat -F POSTROUTING
iptables -t mangle -F
Политики по-умолчанию

т.е. если пакет не попадает ни под одно из правил - то он попадает сюда:

ну тут все просто.....баним все и вся...а потом уже начинаем разрешать:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

И так....для начала, что бы не писать по 20-100 раз одни и теже адреса, заведем переменные:
# IP адрес сервера в сети Интернет
WAN_IP="10.10.10.1"
# Интерфейс сети Интернет
WAN_FA="eth0"

# IP адрес сервера в локальной сети
LAN1_IP="192.168.1.1"
# Интерфейс локальной сети
LAN1_FA="eth1"
# Локальная сеть ДИТ
LAN1="192.168.1.0/24"

# IP адрес сервера в локальной сети DMZ
LAN2_IP="192.168.5.1"
# Интерфейс локальной сети DMZ
LAN2_FA="eth2"
# Локальная сеть DMZ
LAN2="192.168.5.0/28"

# DNS сервера
DNS1="8.8.8.8"
DNS2="208.67.220.220"
Разрешаем lo

Все на интерфейсе lo можно разрешать:
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

Давайте разберемся что где...

A - устанавливаем правило в конец цепочки

i - указываем с какого интерфейса должен приходить пакет

o - указываем в какой интерфейс пакет уходит

Соответственно если сервер обращается сам к себе, например по порту 3306, то...он проверяет сначала правило OUTPUT...смотрит, что действительно правило "уходит" в интерфейс lo (-o lo), т.к. больше других критериев нету и пакет удовлетворил всем критериям - файрвол разрешает пакеты.....Затем сервер смотрит правила в INPUT....и проверяет что действительно, правило "пришло" с интерфейса lo (-i lo) и т.к. больше других критериев нету - iptables разрешает пакетам "идти" на сервер.
Разрешаем доступ демонам сервера и другим демонам и службам в нашей сети

И так....для начала разрешим нашим DNS-серверам выполнять свою функцию, а что-бы это сделать - им необходимо "посоветоваться" с другими серверами в сети....и так:

Для начала разрешим самому нашему серверу "общаться" с DNS-серверами
# DNS for server
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --sport 53 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT

-p - протокол (в данном случае у нас протоколы tcp и udp)

--dport и --sport - указываем для какого порта у нас работает правило (в данном случае порт 53)

-m - подключаем доп.функционал (в данном случае это state)

--state ESTABLISHED,RELATED - данной строчкой мы разрешаем только те пакеты, которые уже получили флаги ESTABLISHED или RELATED...

И так.....давайте разбираться.....dns-клиент отправляет пакет на DNS-сервер.....тем самым попав под правила №1 и №3 пакет с успехом отправляется к DNS-серверу....DNS-сервер отвечает и ответный пакет приходит на интерфейс (здесь мы не указывали на какой и с какого интерфейса будут приходить или отсылаться пакеты) и попадает под правило №2....т.к. наши пакеты уже имеют флаги ESTABLIDHED и RELATED - то сервер увидев что это так и увидев что порт используемый пакетами - 53ий - пропускают ответ к DNS-клиенту.

Мы могли написать и так:

iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT

iptables -A INPUT -p tcp --sport 53 -j ACCEPT

НО!!! В таком случае пакеты на наш сервер по 53му порту могли приходить и без участия нашего DNS-клиента...что недопустимо.

Далее нам необходимо разрешить локальному DNS-серверу "общаться" с DNS-серверами
# DNS1
iptables -A FORWARD -p tcp -s $LAN1 -d $DNS1 --dport 53 -j ACCEPT
iptables -A FORWARD -p tcp -s $DNS1 -d $LAN1 --sport 53 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p udp -s $LAN1 -d $DNS1 --dport 53 -j ACCEPT
iptables -A FORWARD -p udp -s $DNS1 -d $LAN1 --sport 53 -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -p tcp -s $LAN2 -d $DNS1 --dport 53 -j ACCEPT
iptables -A FORWARD -p tcp -s $DNS1 -d $LAN2 --sport 53 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p udp -s $LAN2 -d $DNS1 --dport 53 -j ACCEPT
iptables -A FORWARD -p udp -s $DNS1 -d $LAN2 --sport 53 -m state --state ESTABLISHED -j ACCEPT

-s - IP адрес или сеть откуда пришел пакет

-d - IP адрес или сеть куда пойдет пакет

И так....допустим сервер с Ip 192.168.1.10 отправляет запрос к серверу DNS1 (IP для этого DNS-сервера мы должны были указать выше)

Пакет приходит на маршрутизатор и попадает в цепочку FORWARD (т.к. пакет предназначается не серверу)...далее проверяется...откуда пришел пакет...в нашем правиле пакет должен был прийти с сети LAN1 - т.к. 192.168.1.0/24....наш сервер имеет адрес 192.168.1.10...это означает что требование удовлетворено и мы проверяем дальше. А дальше - проверяем куда идут пакеты - а идут они на адрес DNS1....что опять же удовлетворяет требованием правила (-d $DNS1). Проверяем что используется порт 53 и пропускаем пакет.

DNS-сервер получив "просьбу", отправляет ответ на наш сервер, который, посмотрев, что ответ пришел по 53 порты, от DNS-сервера (-s $DNS1), увидев что пакет дожен быть отправлен в сеть LAN1 (-d $LAN1) и что пакет имеет флаги ESTABLISHED или RELATED - пропускает ответ к нашему локальному DNS-серверу.

Точно так же --state позволяет нам запрещать пакеты которые не были востребованы нашими демонами или службами.

Точно так же мы прописываем правила и для остальных серверов, DNS-серверов, обслуживающих нашу локальную сеть не должно быть меньше 3х.

Не забываем что у нас есть еще и DMZ - и им тоже нужен DNS!!!

Если у нас сервер является еще и прокси-сервером, то мы должны разрешить прокси-серверу доступ (в данном случае у нас прокси-сервер SQUID)
# SQUID
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --sport 80 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --sport 443 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

Данными равилами мы разрешаем прокси-серверу "работать" по 80 и 443 порту.
Разрешаем доступ к локальным демонам сервера из локальной сети
# ssh
acs_p="22"
iptables -A INPUT -i $LAN1_FA -s $LAN1 -p tcp --dport $acs_p -j ACCEPT
iptables -A OUTPUT -o $LAN1_FA -d $LAN1 -p tcp --sport $acs_p -m state --state ESTABLISHED,RELATED -j ACCEPT

# SQUID
acs_p="3128"
iptables -A INPUT -i $LAN1_FA -p tcp --dport $acs_p -j ACCEPT
iptables -A OUTPUT -o $LAN1_FA -p tcp --sport $acs_p -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# ftp
acs_p="21"
iptables -A INPUT -i $LAN1_FA -s $LAN1 -p tcp --dport $acs_p -j ACCEPT
iptables -A OUTPUT -o $LAN1_FA -d $LAN1 -p tcp --sport $acs_p -m state --state RSTABLISHED,RELATED -j ACCEPT всей сетки LAN1

Можно указывать не всю сетку, а определенные ПК.

Например, ssh для ПК с IP 25:
# ssh
acs_p="22"
pc="192.168.1.25"
iptables -A INPUT -i $LAN1_FA -s $pc -p tcp --dport $acs_p -j ACCEPT
iptables -A OUTPUT -o $LAN1_FA -d $pc -p tcp --sport $acs_p -m state --state ESTABLISHED,RELATED -j ACCEPT
Разрешаем доступ к локальным демонам сервера из интернета

Какие службы нам нужны?

Нам нужен только VPN

по ssh мы будем подключаться только с помощью VPN

и так...
# vpn
acs_p="2000"
iptables -A INPUT -i $WAN_FA -p udp --dport $acs_p -j ACCEPT
iptables -A OUTPUT -o $WAN_FA -p udp --sport $acs_p -m state --state ESTABLISHED -j ACCEPT
Разрешаем доступ клиентам из локальной сети в интернет

Разрешаем клиентам работать с VPN (у нас доступ разрешен всем..т.к. клиенты пользуется VPN, но допустим через VPN можно обходить прокси-сервер (да и любые запреты), поэтому надо с осторожностью разрешать данные демоны и службы)
# vpn
acs_p="1723"
iptables -A FORWARD -i $LAN1_FA -o $WAN_FA -p tcp --dport $acs_p -j ACCEPT
iptables -A FORWARD -i $WAN_FA -o $LAN1_FA -p tcp --sport $acs_p -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p 47 -j ACCEPT

acs_p="2000"
iptables -A FORWARD -i $LAN1_FA -o $WAN_FA -p udp --dport $acs_p -j ACCEPT
iptables -A FORWARD -i $WAN_FA -o $LAN1_FA -p udp --sport $acs_p -m state --state ESTABLISHED -j ACCEPT

acs_p="1194"
iptables -A FORWARD -i $LAN1_FA -o $WAN_FA -p udp --dport $acs_p -j ACCEPT
iptables -A FORWARD -i $WAN_FA -o $LAN1_FA -p udp --sport $acs_p -m state --state ESTABLISHED -j ACCEPT

Разрешаем различные демоны и службы
# ssh
acs_p="22"
iptables -A FORWARD -s $LAN1 -p tcp --dport $acs_p -j ACCEPT
iptables -A FORWARD -d $LAN1 -p tcp --sport $acs_p -m state --state ESTABLISHED,RELATED -j ACCEPT

# mail
acs_p="25"
iptables -A FORWARD -s $LAN1 -p tcp --dport $acs_p -j ACCEPT
iptables -A FORWARD -d $LAN1 -p tcp --sport $acs_p -m state --state ESTABLISHED,RELATED -j ACCEPT
acs_p="110"
iptables -A FORWARD -s $LAN1 -p tcp --dport $acs_p -j ACCEPT
iptables -A FORWARD -d $LAN1 -p tcp --sport $acs_p -m state --state ESTABLISHED,RELATED -j ACCEPT

# SMB
acs_p="445"
iptables -A FORWARD -s $LAN1 -p tcp --dport $acs_p -j ACCEPT
iptables -A FORWARD -d $LAN1 -p tcp --sport $acs_p -m state --state ESTABLISHED,RELATED -j ACCEPT

# RDP
acs_p="3389"
iptables -A FORWARD -s $LAN1 -p tcp --dport $acs_p -j ACCEPT
iptables -A FORWARD -d $LAN1 -p tcp --sport $acs_p -m state --state ESTABLISHED,RELATED -j ACCEPT
Разрешаем доступ из локальной сети в DMZ

И так..у нас в DMZ "стоят" 3 сервера, и к ним нам тоже нужен доступ
$acs_p="3389"
iptables -A FORWARD -s $LAN1 -d $LAN2 -p tcp --dport $acs_p -j ACCEPT
iptables -A FORWARD -s $LAN2 -d $LAN1 -p tcp --sport $acs_p -m state --state ESTABLISHED,RELATED -j ACCEPT

$acs_p="22"
iptables -A FORWARD -s $LAN1 -d LAN2 -p tcp --dport $acs_p -j ACCEPT
iptables -A FORWARD -s $LAN2 -d LAN1 -p tcp --dport $acs_p -m state --state ESTABLISHED,RELATED -j ACCEPT

Обратите внимание, что благодаря 2ому правилу - мы из сети имеем доступ до служб и демонов в DMZ, а они в нашу сетку не имеют)))
Пробрасываем порты в DMZ

И так...у нас в DMZ "стоят" сервера и нам нужен к ним доступ из сети интернет (собственно для этого они там и стоят). Мы будем сразу пробрасывать порты и разрешать их.

$ forw_IP - IP адрес необходимого сервера
# ftp
forw_p="21"
forw_IP="192.168.5.2"
iptables -A FORWARD -p tcp --dport $forw_p -d $forw_IP -j ACCEPT
iptables -A FORWARD -p tcp --sport $forw_p -s $forw_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport $forw_p -d $WAN_IP -j DNAT --to-destination $forw_IP
iptables -t nat -A POSTROUTING -p tcp --dport $forw_p -s $WAN_IP -j SNAT --to-source $LAN2_IP

# web
forw_p="80"
forw_IP="192.168.5.4"
iptables -A FORWARD -p tcp --dport $forw_p -d $forw_IP -j ACCEPT
iptables -A FORWARD -p tcp --sport $forw_p -s $forw_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport $forw_p -d $WAN_IP -j DNAT --to-destination $forw_IP
iptables -t nat -A POSTROUTING -p tcp --dport $forw_p -s $WAN_IP -j SNAT --to-source $LAN2_IP

# SQL
forw_p="3306"
forw_IP="192.168.5.4"
iptables -A FORWARD -p tcp --dport $forw_p -d $forw_IP -j ACCEPT
iptables -A FORWARD -p tcp --sport $forw_p -s $forw_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport $forw_p -d $WAN_IP -j DNAT --to-destination $forw_IP
iptables -t nat -A POSTROUTING -p tcp --dport $forw_p -s $WAN_IP -j SNAT --to-source $LAN2_IP
Пробрасываем порты для прозрачного прокси-сервера

Если у нас используется прозрачный прокси-сервер, то можно пробросить на него весь трафик следующей строчкой:
iptables -t nat -A PREROUTING -i $LAN1_FA -s $LAN1 -p tcp -m tcp --dport 80 --sport 1024:65535 -j REDIRECT --to-ports 3128
TTL

Можно ради интереса изменить данный параметр

Вообще по этому параметру в интернете очень много бреда, например:

iptables -t mangle -I PREROUTING -o eth0 -j TTL --ttl-inc 1
iptables -t mangle -I PREROUTING -o eth0 -j TTL --ttl-dec 1
iptables -t mangle -I PREROUTING -o eth0 -j TTL --ttl-set 128

К примеру у нас TTL=64

первой строчкой мы добавляем 1, 64+1=65, второй уменьшаем на 1, 65-1=64 (какой смысл от этих действий - непонятно), третьей ставим жесткое занчение 128, а после, т.к. мы находимся в цепочке PREROUTING, то значение это после попадание в POSTROUTING уменьшится на 1 (что логично - для этого TTL и существует),т.е. 128-1=127

Следующая строчка назначает TTL правильно:
iptables -t mangle -I POSTROUTING -o $WAN_FA -j TTL --ttl-set 128

Есть ли смысл от этого - не знаю, возможно и есть, раньше вроде-как этим "скрывали" наличии маршрутизатора от провайдера, хотя если задатся целью - вычислить начилие маршрутизатора довольно просто.
NAT

Собственно поднимаем сам NAT
iptables -t nat -A POSTROUTING -o $WAN_FA -j SNAT --to-source $WAN_IP

Если по каким-то причинам адрес WAN_IP вы получаете от DHCP (не обязательно он будет серым), то необходимо несколько иное правило:
iptables -t nat -A POSTROUTING -o $WAN_FA -j MASQUERADE

Но данная схема несколько больше "грузит" систему, поэтому если у вас IP прописан жестко - применяем первое правило
Ну вот собственно и все....

Надеюсь данная конфигурация позволит защитить вашу локальную сеть от посягательств из вне.

Самое главное не открывать в глобал такие службы как ssh и rdp - боты не спят)))))
Размещено в Без категории
Просмотров 2294 Комментарии 1 Редактировать метки
Всего комментариев 1

Комментарии

  1. Старый комментарий
    Аватар для Matrix
    отличная статья. Молодец!
    permalink
    Запись от Matrix размещена 05.11.2013 в 16:21 Matrix вне форума
 


Часовой пояс GMT +4, время: 04:04.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.