Глава 5
Таблица 5.5
(окончание)
Параметр
Описание
--source-port
(или
--sport
)
Определяет порт отправителя. Эта опция может использоваться
только вместе с параметром
-p
.
Например:
iptables -A FORWARD -p tcp -source-port 23 ...
--destination-port
(или
--dport
)
Задает порт-назначение. Опция возможна только с параметром
-p
.
Синтаксис такой же, как и в случае с
-source-port
-state
Позволяет отфильтровать пакеты по состоянию. Параметр
-state
доступен только при загрузке модуля state с помощью другого
параметра:
-m state
. Состояния пакета:
•
NEW
— новое соединение (еще неустановленное);
•
ESTABLISHED
— установленное соединение;
•
RELATED
— пакеты, которые не принадлежат соединению,
но связаны с ним;
•
INVALID
— неопознанные пакеты.
Пример:
iptables -A FORWARD -m state -state RELATED,INVALID
-in-interface
(или
-i
)
Определяет интерфейс, по которому прибыл пакет.
Пример:
iptables -A FORWARD -i eth1
-out-interface
(или
-o
)
Определяет интерфейс, по которому будет отправлен пакет:
iptables -A FORWARD -o ppp0
-tcp-flags
Производит фильтрацию по TCP-флагам (см. man iptables)
Ранее мы познакомились с основными действиями iptables. В табл. 5.6 представле-
ны все действия iptables (цели iptables). Действие задается параметром
-j
.
Таблица 5.6.
Цели iptables
Действие Описание
ACCEPT
Принять пакет. При этом пакет уходит из этой цепочки и передается дальше
DROP
Уничтожить пакет
REJECT
Уничтожает пакет и сообщает об этом отправителю с помощью
ICMP-сообщения. Параметр
-reject-with
позволяет уточнить тип
ICMP-сообщения:
•
icmp-host-unreachable — узел недоступен;
•
icmp-net-unreachable — сеть недоступна;
•
icmp-port-unreachable — порт недоступен;
•
icmp-proto-unreachable — протокол недоступен.
Работа в глобальной сети
211
Таблица 5.6
(окончание)
Действие Описание
По умолчанию отправляет сообщение о недоступности порта. Но, используя
сообщение icmp-host-unreachable, можно сбить злоумышленника с толку.
Предположим, что вы просто решили отбрасывать неугодные вам пакеты
(действие
DROP
). Но злоумышленник будет посылать и посылать вам эти па-
кеты, чтобы брандмауэр только бы и делал, что занимался фильтрацией и
удалением этих пакетов (один из видов атаки на отказ). А если вы ответите
сообщением icmp-host-unreachable, то злоумышленник будет думать, что узел
недоступен, т. е. компьютер выключен, либо он уже достиг своей цели — до-
бился отказа компьютера. С другой стороны, помните, что это действие поро-
ждает ответный ICMP-пакет, нагружающий исходящий канал, который в неко-
торых случаях (например, одностороннее спутниковое соединение) очень
«узкий». Если злоумышленник пришлет вам 1 миллион пакетов, то вы должны
будете отправить 1 миллион сообщений в ответ. Подумайте, готовы ли вы
к такой нагрузке на исходящий канал
LOG
Заносит информацию о пакете в протокол. Полезно использовать для прото-
колирования возможных атак — если вы подозреваете, что ваш узел кем-то
атакуется. Также полезно при отладке настроек брандмауэра
RETURN
Возвращает пакет в цепочку, откуда он прибыл. Действие возможно, но лучше
его не использовать, т. к. легко ошибиться и создать непрерывный цикл:
вы отправляете пакет обратно, а он опять следует на правило, содержащее
цель
RETURN
SNAT
Выполняет подмену IP-адреса отправителя (Source NAT). Используется
в цепочках
POSTROUTING
и
OUTPUT
таблицы
nat
(см. рис. 5.10)
DNAT
Выполняет подмену адреса получателя (Destination NAT). Используется
только в цепочке
POSTROUTING
таблицы
nat
MASQUERADE
Похож на
SNAT
, но «забывает» про все активные соединения при потере
интерфейса. Используется при работе с динамическими IP-адресами, когда
происходит потеря интерфейса при изменении IP-адреса. Применяется
в цепочке
POSTROUTING
таблицы
nat
Пример настройки брандмауэра
Создать шлюз в Linux очень просто, и сейчас вы сами в этом убедитесь. Гораздо
сложнее правильно его настроить — чтобы шлюз не только выполнял свою непо-
средственную функцию (т. е. передачу пакетов из локальной сети в Интернет и об-
ратно), но и защищал сеть.
В последнее время очень популярны DSL-соединения, поэтому будем считать, что
для подключения к Интернету используется именно оно. Хотя вся разница только
в названии интерфейса — ppp0. Вполне может быть, что у вас иная конфигурация.
Например, у вас может быть два сетевых интерфейса: eth0 и eth1. Первый «смот-
рит» в локальную сеть, а второй — подключен к Интернету. Тогда и правила вы
будете формировать исходя из того, что соединение с Интернетом происходит по
интерфейсу eth1.
При DSL-соединении у нас тоже будет два сетевых адаптера: первый (eth0) соеди-
нен с локальной сетью, а к второму (eth1) подключен DSL-модем. Перед настрой-
212
Глава 5
кой шлюза проверьте, действительно ли это так. Вполне может оказаться, что сете-
вая плата, к которой подключен DSL-модем, — это интерфейс eth0, а не eth1. Тогда
вам придется или изменить названия интерфейсов при формировании правил, или
просто подключить модем к другому сетевому адаптеру.
IP-адрес DSL-соединения будет динамическим (обычно так оно и есть), а вот
IP-адрес сетевого адаптера, обращенного к локальной сети, назначим такой:
192.168.1.1. Вы можете использовать и другой адрес (адрес должен быть локаль-
ным, если только у вас нет подсети с реальными IP-адресами).
Итак, мы настроили локальную сеть, узнали имена сетевых адаптеров, включили
IP-переадресацию. Осталось только ввести команду:
sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
Установите на всех компьютерах вашей сети IP-адрес 192.168.1.1 в качестве шлюза
по умолчанию (можно настроить DHCP-сервер, чтобы не настраивать все компью-
теры вручную) и попробуйте пропинговать с любого узла какой-нибудь сайт.
Оказывается, вы прочитали всю эту главу ради одной строчки. Так и есть. Но, сами
понимаете, на этом настройка шлюза не заканчивается. Надо еще защитить вашу
сеть. Как минимум, требуется установить следующие действия по умолчанию:
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT DROP
Разрешим входящие соединения на шлюз только от узлов нашей внутренней сети
192.168.1.0:
sudo iptables –A INPUT –i
eth0
–-source
192.168.1.0/24
–-match state –-state
NEW,ESTABLISHED –j ACCEPT
Надо также установить правило для цепочки
OUTPUT
— оно разрешает шлюзу отве-
чать компьютерам нашей локальной сети:
sudo iptables –A OUTPUT –o
eth0
–-destination
192.168.1.0/24
–-match state –-
state NEW,ESTABLISHED –j ACCEPT
Будьте внимательны при указании имен интерфейсов и IP-адресов. Очень легко
запутаться, а потом полчаса разбираться, почему шлюз не работает.
Нам осталось только запретить соединения из Интернета (компьютеры нашей сети
смогут устанавливать соединения с серверами Интернета, зато внешние интернет-
пользователи не смогут установить соединения с компьютерами нашей сети):
sudo iptables –A FORWARD –i
eth0
–-destination
192.168.1.0/24
–-match state –-
state ESTABLISHED –j ACCEPT
У нас получилась вполне приличная конфигурация: компьютеры нашей сети могут
выступать инициаторами соединения, а интернет-узлы могут передавать данные
в нашу сеть только в том случае, если инициатором соединения выступил локаль-
ный компьютер.
Но и это еще не все. Как вы уже догадались, поскольку мы не сохранили правила
брандмауэра, при перезагрузке компьютера его придется настраивать заново. Нам
Работа в глобальной сети
213
нет резона описывать настройку брандмауэра (сохранение и восстановление пра-
вил) в каждом дистрибутиве (пусть это будет вашим домашним заданием), так что
рассмотрим универсальный способ. Он заключается в создании bash-сценария, вы-
зывающего необходимые нам команды настройки iptables. Такой сценарий вам ос-
танется только вызывать при загрузке системы. А для этого придется изучить
строение системы инициализации в вашем дистрибутиве.
Вместо того чтобы объяснять вам, как вызвать сценарий, загружающий правила
брандмауэра (с этим вы и сами разберетесь), мы лучше приведем здесь сценарий
(понятно, с комментариями), реализующий более сложную конфигурацию iptables.
Этот сценарий (листинг 5.1) будет не только выполнять все функции шлюза, но и
защищать сеть от разного рода атак. Сценарий лучше сразу поместить в каталог
/etc/init.d
(это наша вам подсказка) и сделать исполняемым:
# touch /etc/init.d/firewall_start
# chmod +x /etc/init.d/firewall_start
Листинг 5.1. Сценарий firewall_start
# Путь к iptables
IPT="/sbin/iptables"
# Сетевой интерфейс, подключенный к Интернету
INET="ppp0"
# Номера непривилегированных портов
UPORTS="1024:65535"
# Включаем IPv4-forwarding (чтобы не думать, почему шлюз не работает)
echo 1 > /proc/sys/net/ipv4/ip_forward
# Удаляем все цепочки и правила
$IPT -F
$IPT -X
# Действия по умолчанию.
$IPT -P INPUT DROP
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT DROP
# Разрешаем все пакеты по интерфейсу lo (обратная петля)
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
# Запрещаем любые новые соединения с любых интерфейсов, кроме lo,
# с нашим компьютером
$IPT -A INPUT -m state ! -i lo --state NEW -j DROP
$IPT -A INPUT -s 127.0.0.1/255.0.0.0 ! -i lo -j DROP
214
Do'stlaringiz bilan baham: |