Докучаев Дмитрий aka Forb (Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.)
Несмотря на столь широкие возможности iptables не превосходит OpenBSD’шный pf по функциональности. Его конкурент умеет различать операционные системы по хитрому fingerprinting’у, защищать сервер от скана портов и т.д. Пришло время нанести ответный удар. Итак, встречаем новый патч для iptables под названием Patch-o-Matic. Набор POM создан для админов, которым мало стандартных возможностей фаервола. Он включает в себя набор модулей, позволяющих творить невероятные вещи. Правда, чтобы пропатчить брандмауэр, придется пройти через семь кругов ада. Сперва убедись, что твое ядро собрано из исходников. Сорцы ядра понадобятся инсталлятору POM, ведь все таблицы и цепочки создаются именно в кернеле. Если твоя система построена на RPM-пакетах, тебе придется перекомпилить ядрышко, предварительно стянув его с ftp.kernel.com (либо с диска). Не забудь включить в ядро поддержку ipfiltering и прочих сетевых вещей. После того как отмучаешься с кернелом, скачивай свежий iptables (http://netfilter.org/files/iptables-1.2.11.tar.bz2), а также прилагающийся к нему патч (http://netfilter.org/files/patch-o-matic-ng-20040621.tar.bz2). Теперь распаковывай фаервол и компилируй его. Когда ты сделаешь все эти шаги, наступит время для установки патча.
Новичку — Основы работы в iptables
Основы работы с iptables.
Думаю многие администраторы Linux сталкивались хотя бы раз с такой утилитой как iptables, не важно что это было: ограничение доступа извне, порт-форвардинг или маскарад. Но найдя руководство для конкретной задачи были разочарованы, примеры просто не работали. В этой статье я попробую рассказать суть работы этой утилиты и основы для ее успешного применения.
Введение.
Все пакеты приходящие на сетевую карту проходят все 5(7) уровней модели OSI, iptables начинает обработку пакетов с 3-го(сетевого) уровня, после того как пакет по кабелю попал на сетевую карту, он передается в ядро ОС, а именно в netfilter, далее пакет проходит ряд таблиц и только после этого попадает в приложение(или не попадает, если пакет шел транзитом), которому он был адресован. Именно таблицами и правилами netfilter`а управляет утилита iptables.
Таблицы и цепочки.
В iptables существуют 3 таблицы:
filter — Используется для фильтрации входящего, транзитного и исходящего трафика, имеет 3 цепочки
INPUT — сюда попадает все входящие пакеты
FORWARD — сюда попадают пакеты предназначенные другой машине в сети
OUTPUT — все исходящие пакеты
Над пакетамми проходящими в таблице filter можно делать следующие действия:
DROP — блокировать пакет
ACCEPT — разрешить(пропустить далее) пакет.
Это таблица используется по умолчанию.
nat — Используется для трансляции сетевых адресов(NAT)
PREROUTING — используется для DNAT(трансляция адреса назначения)
POSTROUTING — тут происходит SNAT(Изменение Сетевого Адреса Отправителя)
OUTPUT — Все исходящие из этой цепочки пакеты
Действия, используемые в этой цепочке:
DNAT — как уже упоминалось, используется для трансляции адреса назначения, использую это действие, мы можем пробросить порт, либо целую машину в другую сеть.
SNAT — изменяет исходные адреса пакетов, используется для того, чтобы машины в локальной сети имели доступ в интернет(в случае если наш компьютер — роутер)
MASQUERADE — по сути тоже самое, что и SNAT, только считается что больше нагружает систему. Если у вас выделенный ip — динамический, то нужно использовать именно его, если не хотите каждый раз переписывать правила SNAT.
mangle — Таблица для изменения заголовков пакетов. Имеет цепочки: PREROUTING, FORWARD, OUTPUT, POSTROUTING. У всех цепочек роль одна — вносить изменения в заголовок пакета на различных стадиях движения этого пакета через цепочки iptables. Над этими пакетами можно проводить действия TOS, TTL, MARK.
С точки зрения iptables трафик бывает 3х типов:
Входящий
Транзитный
Исходящий
Движение пакета происходит в следующей последовательности:
После прохождения nat(PREROUTING), основываясь на записях в mangle(PREROUTING) и nat(PREROUTING), ядро принимает решение какой будет трафик, входящим или транзитным. Если трафик оказался транзитным, то идем в цепочку mangle(FORWARD),
если входящим, то в mangle(INPUT).
1. Входящий трафик — данные, которые принимает приложение запущенное на компьютере
2. Исходящий трафик — трафик, который передает приложение через сеть
3. Транзитный трафик — трафик, который проходит через наш компьютер другим(в случае если наш компьютер работает как маршрутизатор)
Работа с iptables.
Теперь после того, как мы имеем представление как течет через нас трафик, мы можем что-нибудь с ним сделать.
Основные ключи iptables:
-t (--table) <таблица> — правило указывает таблицу, в которую будут вноситься изменения, без указания этого ключа используется таблица filter
-A (--append) <цепочка> — добавление новой записи в конец цепочки
-D (--delete) <цепочка> — удаление правила
-I (--insert) <цепочка> <номер> — вставляет правило над цепочкой с указанным номером
-R (--replace) <цепочка> <номер> — заменяет определенные критерии цепочки с номером <номер>
-L (--list) <цепочка> — листинг правил цепочки
-F (--flush) <цепочка> — удаление всех правил из цепочки
-P (--policy) <цепочка> — задать действие по умолчанию, действие будет выполняться на все пакеты, которые не подошли по каким-либо параметрам в другие правила.
Ключи классификации и выделения пакетов
-p (--protocol) — используется для указания конкретного протокола для обработки, список всех протоколов можно посмотреть в /etc/protocols/
-s(--src, --source) — адрес исходящих пакетов для фильтрации.
-d (--dst, --destination) — адрес назначения пакетов для фильтрации.
-i (--in-interface) — интерфейс с которого приходит пакет
-o (--out-interface) — интерфейс на который уходит пакет
--sport (--source-port) (может использоваться с ключами -p tcp и -p udp) — порт с которого был отправлен пакет
--dport (--destination-port) (может использоваться с ключами -p tcp и -p udp) — порт на который отправляется пакет
Так же есть ключ, который указывается, когда мы работаем с протоколом icmp (-p icmp):
--icmp-type <тип icmp пакета> — указывается над каким конкретно типом ICMP пакета проводить операцию. Типы ICMP описаны в RFC 792.
На всех ключах классификации возможно применения специального символа !, который буквально означает “кроме”, например:
правило
1
iptables -A -p tcp -s 192.168.1.7/32 --dport 80 -j DROP
указывает, что все пакеты поступающие с IP-адреса 192.168.1.7 на 80 TCP порт(обычно веб-сервер) необходимо блокировать. А правило:
1
iptables -A -p tcp -s 192.168.1.7/32 --dport !80 -j DROP
указывает, что все пакеты поступающие с IP-адреса 192.168.1.7 кроме 80 TCP порта необходимо блокировать.
Строим свои правила iptables.
С теорией покончено, переходим к практике. Попробуем настроить фаерволл(цепочка filter) Первым делом, когда вы настраиваете фаервол с нуля, необходимо убедиться, что все правила пусты, сделать это можно командой:
iptables -L
Если картина примерно следующая, то можно приступать к написанию своих правил фильтрации:
1
2
3
4
5
6
7
8
9
10
debian:~# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
debian:~#
Если в какой-то из цепочек присутствуют правило, удалим их по одной или воспользуемся ключом -F и очистим цепочку полностью
пример:
1
iptables -F INPUT
РАЗДЕЛИТЕЛЬ
http://sites.google.com/site/debianschool/2-servers/sluz-iptables
Перед настройкой iptables
#часто в интернет есть совет по включению форвардинга, но работает он только до перезагрузки
echo "1" > /proc/sys/net/ipv4/ip_forward
# а вот так это надо делать правильно
/etc/sysctl.conf
net.ipv4.ip_forward=1 #раскоментировать эту строчку
sysctl -p
Начало
iptables -F #очищаем все предыдущее правила
iptables -F -t nat #очищаем все предыдущее правила таблици NAT
iptables -P INPUT DROP #входящие пакеты отбрасывает
iptables -P OUTPUT ACCEPT #исходящие пакеты разрешаем
iptables -P FORWARD DROP #форвардинг пакетов запрещаем
Проброс порта до компьютера
# Разрешить 192.168.0.2(локальный компьютер) доступ по порту 25 172.16.32.14 (интернет-шлюз)
iptables -I FORWARD -s 192.168.0.2 -p tcp --dport 25 -j ACCEPT
#- I — вставка правила в начало цепочки
# FORWARD — цепочка через которую ходят проходящие пакеты
# -s — адрес источника (компьютера который обращается по данному порту в интернет)
# -p tcp -- тип протокола
# --dport — указать порт назначения
# 25 номер порта
# -j — выполнить действие с правилом
# ACCEPT-разрешить или DROP-запретить
#разрешить пакеты по порту 2106 из инета 172.16.32.14 (интернет-шлюз0 к 192.168.0.2(локальный компьютер)
$IP_LOCAL=192.168.0.2
$IP_INET=172.16.32.14
# 1 правило — пробрасывает пакет по порту во внутреннею сеть на конкретный айпи
iptables -t nat -A PREROUTING -p tcp --dport 2106 -d $IP_INET -j DNAT --to-destination $IP_LOCAL
2 правило -- возврат пакета отправителю
iptables -t nat -A POSTROUTING -p tcp --dport 2106 -d $IP_LOCAL -j SNAT --to $IP_INET
# -t nat указать таблицу nat
# -A — добавить правила в конец цепочки
# PREROUTING --указать цепочку
# -p tcp --dport 2106 пример указывания порта на который будет обращение к серверу
# -d IP_INET — ваш внешний айпи
# -j DNAT транслировать адреса во внутреннюю сеть
# --to-destination -- указывать куда
Примеры
вариант №1: пример настройки iptables:
iptables -F #очищаем все предыдущее правила
iptables -F -t nat #очищаем все предыдущее правила таблици NAT
iptables -P INPUT ACCEPT #входящие пакеты отбрасывает
iptables -P OUTPUT ACCEPT #исходящие пакеты разрешаем
iptables -P FORWARD ACCEPT #форвардинг пакетов запрещаем
iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -j MASQUERADE
вариант №2:открыть почту к конкретному почтовому серверу для всей локальной сети 192.168.0.0
LOCALNET=192.168.0.0/24
iptables -A FORWARD -p tcp -s $LOCALNET -d smtp.mail.ru --dport 25 -j ACCEPT
iptables -A FORWARD -p tcp -s smtp.mail.ru -d $LOCALNET --sport 25 -j ACCEPT
iptables -A FORWARD -p tcp -s $LOCALNET -d pop.mail.ru --dport 110 -j ACCEPT
iptables -A FORWARD -p tcp -s pop.mail.ru -d $LOCALNET --sport 110 -j ACCEPT
iptables -t nat -A POSTROUTING -p tcp -s $LOCALNET --dport 110 -j MASQUERADE
iptables -t nat -A POSTROUTING -p tcp -s $LOCALNET --dport 25 -j MASQUERADE
Диагностика
iptables -L
route
ifconfig
cat /proc/sys/net/ipv4/ip_forward
Шлюз на базе Debian для начинающих или что где куда.......и как у меня…
Исходные данные
1)Комп
2)два сетевых интерфейса
3)eth0 — смотрит наружу, в интернет, через выделенную линию
4)eth1 — смотрит в локальную сеть
5)на шлюзе установлен и настроен прокси сервер squid(правда не знаю хорошо это или плохо, что на шлюзе поднят squid, но вот так в общем)
6)$ uname -a
Linux 2.6.26-....-686 #1 SMP Thu Dec 18 23:55:11 UTC 2008 i686 GNU/Linux
(Debian)
//--------все ниже перечисленные команды следует вводить под sudo,или root
Iptables в системе debian, устанавливается по умолчанию и лежит в директории /usr/sbin/iptables
Все началось с того .... В общем поставил я Debian и решил что он буде в роле шлюза, сам я пользователем linux являюсь с 2003 в этом мне помог то есть показал всю прелесть Сергей а записал на образа мой первый Debian — Дима. А вот Администратором наверно месяца три с конца 2008 года.
Дак вот прочитал много доки, ни чего не понял конечно и сразу за помощью к Диме — он подсказал, даже скрипт выслал, но вот о чудо у меня опять ничего не работает то есть интернет как бы ходит в локалку через проксю а почта нет,вот хоть убей --- что делать ???
С разу оговорюсь я тоже за то чтоб ребята сами старались особенно начинающие без помощи обходиться, но вот беда шлюз должен быть настроен еще вчера и вокруг тебя бегает много usverei и говорят тебе кто ты есть и как тебя звать и что ты на самом деле — верить им коне что не стоит, но вид у них сурьезный.
Ну так вот благодаря Сереже, Pac-Man,chemtech,sssg и Диме, Я что-то начал понимать в iptables.
А шлюз мне помогал настраивать на прямую через ssh Дима За что ему Огромное СПАСИБО и благодаря этому я решил написать эту статью.
Значит вот сам скрип по настройки Шлюза чтоб
1)Инет в локалки Был
2)Чтоб почта в локалке была
3)Чтоб можно было порт открыть какой нибуть
#!/bin/sh
INET_IP="x.x.x.x" #внешний ip
UUCP_IP="x.x.x.x" # ip на который пробрасывать порт
echo "1" > /proc/sys/net/ipv4/ip_forward # включаем форвардинг в ядре
iptables -F #очищаем все предыдущее правила
iptables -F -t nat #очищаем все предыдущее правила таблици NAT
iptables -P INPUT DROP #входящие пакеты отбрасывает
iptables -P OUTPUT ACCEPT #исходящие пакеты разрешаем
iptables -P FORWARD DROP #форвардинг пакетов запрещаем
#MOE probros port 540 # проброс 540 порт напрямую на компьютер в локальной сети
iptables -t nat -A PREROUTING -p tcp -d $INET_IP --dport 540 -j DNAT --to-destination $UUCP_IP:540 # пакеты входящие на интерфейс eth0 и на порт 540 перенаправляем на ip машины в локалке на порт 540
iptables -A FORWARD -i eth0 -d $UUCP_IP -p tcp --dport 540 -j ACCEPT # разрешаем проброс пакетов по порту 540
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source $INET_IP # делаем маскарадинг- подмену адреса в заголовках исходящих пакетах чтоб в заголовках был прописан ip внешний (что смотрит в инет ) а не локальный скажем 192.168.0.50
iptables -A INPUT -p icmp -j ACCEPT #разрешаем входящие icmp
iptables -A INPUT -i lo -j ACCEPT #разрешаем входящие на localhost
iptables -A INPUT -i eth1 -j ACCEPT #пропускаем входящие в локалку
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT # принимаем из инета пакеты нормальные со статусом -state ESTABLISHED,RELATED
iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT # разрешаем пропускать пакеты со статусом --state ESTABLISHED,RELATED из инета
iptables -A FORWARD -i eth1 -p tcp -m multiport --dport smtp,pop3,aol,540 -j ACCEPT # пропускаем почту и наш 540
iptables -A FORWARD -i eth1 -p udp -m multiport --dport domain -j ACCEPT #
# Logs: # Это логи
iptables -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT FORWARD packet died: "
iptables -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT OUTPUT packet died: "
iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT INPUT packet died: "
!!!!!!! Добавление скрипта в автозагрузку!!!!!(Это нужно чтоб после перезагрузки скрипт автоматом прописывал правила в фаирволе iptables!!!!
Не забудьте сделать скрипт исполняемым
sudo chmod +x /path/to/your/file
или sudo chmod 777 /path/to/your/file
-------Добавить скрипт в автозагрузку--------
Пишем скрипт и помещаем его в каталог /etc/init.d Находясь в нем, набираем
# sudo update-rc.d НАЗВАНИЕ_СКРИПТА defaults 99
-defaults запускать на уровнях выполнения по умолчанию (2 — 5)
-99 порядок загрузки
И обязательно проверьте состояние портов с помощью утилиты nmap
или
sudo netstat -lnp
В общем и даже после этого шлюз нормально не работал, а проблема оказалась банально проста — дело было в DNS
я на сервере DNS в настройках сетевого интерфейса указал старый адрес шлюза, а не реального на данный момент.
P.S Шлюз Это не только IPTABLES — надо много еще
Для таких задач лучше ставить LTS дистрибутив (8.04 сервер в твоем случае)
Снести нахрен ipmasq. Раздача интернета осуществляется одной строкой
iptables -t nat -A POSTROUTING -o eth1 -m state --state NEW -j SNAT --to-source <IP eth1>
при явном неделании держать локальную DNS зону для локальной сети, dnsmasq можно оставить. Но я бы предложил поставить bind9. Настраивается с полпинка, работает без вопросов, и в таблицах нетфильтра намного чище.
WebMin кстати поммогает.
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE