14.2. Управление доступом к хосту

14.2.1. iptables

iptables - это программа настройки фильтрации пакетов для Linux версий 2.4 и выше. Ядро 2.4 (если быть точнее, 2.4.5) впервые было представлено (в виде опции) в Slackware версии 8.0, а используемым по умолчанию было сделано в Slackware 8.1. В этом разделе раскрываются только основы использования этой программы, более полную информацию вы можете получить на сайте http://www.netfilter.org/. Эти команды могут быть вставлены в скрипт /etc/rc.d/rc.firewall, который необходимо сделать исполняемым, чтобы эти правила вступили в силу во время загрузки. Учтите, что неверные команды iptables могут заблокировать для вас вашу собственную машину. Если только вы не уверены на 100% в своих знаниях, всегда проверяйте, есть ли у вас локальный доступ к машине.

Первым делом следует установить политику по умолчанию на DROP во всех цепочках для входящих подключений:

# iptables -P INPUT DROP
# iptables -P FORWARD DROP

После того, как всё запрещено, вы можете начать назначать политики, разрешающие подключения. Первым делом разрешите любой трафик для уже установленных соединений:

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Чтобы не нарушить работу приложений, использующих адрес обратной связи, обычно рекомендуется добавить следующее правило:

# iptables -A INPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -i lo -j ACCEPT

Эти правила разрешают любой входящий и исходящий трафик для сети 127.0.0.0/8 (127.0.0.0 - 127.255.255.255) на интерфейсе обратной связи (lo). При создании правил неплохо было бы, чтобы правила были как можно более точными, дабы не разрешить по недосмотру какой-нибудь злоумышленный трафик. Другими словами, под правилами, разрешающими слишком мало, понимается больше правил и больше набора на клавиатуре.

Следующим делом следовало бы разрешить доступ к определённым службам, работающим на вашей машине. Если, к примеру, вам нужно использовать на своей машине веб-сервер, вам надо использовать примерно такое правило:

# iptables -A INPUT -p tcp --dport 80 -i ppp0 -j ACCEPT

Это правило разрешит доступ для любой машины на 80-й порт вашей машины через интерфейс ppp0. Вам может понадобиться ограничить доступ к этой службе только для определённых машин. Следующее правило разрешит доступ к вашему веб-серверу только для адреса 64.57.102.34:

# iptables -A INPUT -p tcp -s 64.57.102.34 --dport 80 -i ppp0 -j ACCEPT

Разрешение ICMP-трафика может быть полезным для задач диагностирования. Для этого вам следует использовать правило наподобие этого:

# iptables -A INPUT -p icmp -j ACCEPT

У большинства людей также есть необходимость настроить на своей шлюзовой машине трансляцию сетевых адресов (Network Address Translation, NAT), чтобы другие машины из локальной сети могли выходить через него в Интернет. Для этого вам нужно использовать следующее правило:

# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

Также вам понадобится включить IP-форвардинг. Для временного решения этой задачи вы можете воспользоваться следующей командой:

# echo 1 > /proc/sys/net/ipv4/ip_forward

Чтобы включить IP-форвардинг на постоянной основе (т.е. чтобы изменения оставались в силе после перезагрузки), вам понадобится открыть в своём любимом текстовом редакторе файл /etc/rc.d/rc.inet2 и изменить в нём следующую строку:

IPV4_FORWARD=0

...на следующую:

IPV4_FORWARD=1

Дополнительную информацию о NAT смотрите в NAT HOWTO.

14.2.2. tcpwrappers

tcpwrappers управляют доступом к демонам на уровне приложений, а не на уровне IP. Это даёт возможность создать дополнительный уровень защиты на тот случай, если управление доступом на уровне IP (Netfilter) работает некорректно. Например, если вы пересобрали ядро, но забыли включить в нём поддержку iptables, ваша защита на уровне IP сведётся на нет. Тогда защитить свою систему вам помогут tcpwrappers.

Управление доступом к службам, защищённым tcpwrappers'ами, осуществляется с помощью файлов /etc/hosts.allow и /etc/hosts.deny.

Основная часть людей использует лишь одну строку в файле /etc/hosts.deny, запрещающую по умолчанию доступ ко всем демонам. Вот эта строка:

ALL : ALL

После этого вы можете заняться предоставлением доступа к службам для определённых хостов, доменов или диапазонов IP-адресов. Это осуществляется с помощью файла /etc/hosts.allow, имеющего такой же формат.

Многие люди начинают с разрешения всех подключений от localhost. Этого можно достичь с помощью следующей строки:

ALL : 127.0.0.1

Чтобы разрешить доступ к SSHd для сети 192.168.0.0/24, можете использовать следующие правила:

sshd : 192.168.0.0/24
sshd : 192.168.0.

Также существует возможность ограничить доступ для хостов из определённых доменов. Это можно выполнить с помощью следующего правила (учтите, что оно основывается на обратной записи в DNS подключающегося хоста, которая не всегда соответствует действительности или может вообще отсутствовать, поэтому я бы не рекомендовал использовать её для хостов из Интернета):

sshd : .slackware.com