Минимальный набор правил Iptables для типовых задач

Автор: Admin | 11.09.2015
3 комментария | 25 393 views

Минимальный набор правил Iptables для типовых задач или iptables для чайников и начинающих
The minimum set of rules Iptables for typical tasks

IptablesЛикбез

Не смотря на то, что в интернете полно статей об Iptables, довольно часто вижу просьбы подсказать набор правил для конкретной ситуации. Так как ситуации довольно типичные, то можно давать ссылку на данную заметку без объяснений. Повторяю, это не пересказ туториала, который обязателен к прочтению. Он и так достаточно хорош, а только наборы правил для начинающих с минимальными комментариями.
Кое-что, конечно, стоит сказать для понимания:
Policy, ключ -P. Цитата из туториала:

Задает политику по-умолчанию для заданной цепочки. Политика по-умолчанию определяет действие, применяемое к пакетам не попавшим под действие ни одного из правил в цепочке. В качестве политики по умолчанию допускается использовать DROP и ACCEPT.

Другими словами, если пакет, пришедший на сетевой интерфейс, не описан ни одним правилом, то он обрабатывается политикой по умолчанию. Из этого следует, что настраивать Iptables (да и любой фаервол) можно двумя путями\политиками:
1. Разрешено все, что не запрещено. Т.е. разрешено вообще все.
2. Запрещено все, кроме того, что разрешено явно.
Очевидно, второй подход правильней, что и будет рассматриваться далее. Полиси для OUTPUT предлагаю оставить ACCEPT, иначе придется огрести много глюков. Когда ты будешь знать Iptables достаточно хорошо - сам поймешь почему и сможешь настроить в DROP.
И еще важное замечание. Подразумевается, что правила применяются скриптом, а не вводятся с консоли по очереди. В последнем случае, после команды iptable -P INPUT DROP потеряется коннект установленной SSH сессии. При применении правил скриптом сессия не разорвется, т.к. далее идет правило разрешения принимать уже установленные соединения.

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

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X

Минимальный набор правил iptables для десктопа

Задача: запретить все входящие подключения. Исходящие не ограничены.

# Правила по умолчанию
iptable -P INPUT DROP
iptable -P FORWARD DROP
iptable -P OUTPUT ACCEPT
# Разрешить входящие соединения с локалхоста
iptables -A INPUT -i lo -j ACCEPT
# Разрешить уже установленные входящие соединения
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Минимальный набор правил iptables для сервера с приложением

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

# Правила по умолчанию
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Разрешить входящие соединения с локалхоста
iptables -A INPUT -i lo -j ACCEPT
# Разрешить уже установленные входящие соединения
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Разрешить SSH
iptables -A INPUT -p TCP --dport 22 -j ACCEPT
# Разрешить HTTP порт
iptables -A INPUT -p TCP --dport 80 -j ACCEPT

Минимальный набор правил iptables для шлюза

Задача: 1. Раздать интернет в локальную сеть при помощи NAT'а. 2. Разрешить обращение машин из локальной сети к внешним HTTP, HTTPS и DNS серверам 3. Пробросить порт на веб сервер, находящийся в этой локальной сети.

### Переменные
# Интерфейс, смотрящий в интернет
INET_IF="eth0"
# Белый IP адрес, принадлежащий $INET_IF
INET_IP="x.x.x.x"
# TCP порты, по которым разрешено ходить в интернет машинам из локальной сети
FORWARD_TCP_PORTS="53,80,443"
# UDP порты, по которым разрешено ходить в интернет машинам из локальной сети
FORWARD_UDP_PORTS="53"
# Локальная сеть
LOCAL_NET="192.168.0.0/24"
# IP адрес локального веб сервера
WEB_SERVER="192.168.0.10"
# Путь до sysctl
SYSCTL="/sbin/sysctl -w"
# Включить в ядре форвард IPv4 пакетов
if [ "$SYSCTL" = "" ]
then
    echo "1" > /proc/sys/net/ipv4/ip_forward
else
    $SYSCTL net.ipv4.ip_forward="1"
fi

### Правила по умолчанию
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

### INPUT 
# Разрешить входящие соединения с локалхоста
iptables -A INPUT -i lo -j ACCEPT
# Разрешить принимать уже установленные соединения
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Разрешить SSH
iptables -A INPUT -p TCP --dport 22 -j ACCEPT

### FORWARD
# Разрешить уже установленные пересылаемые соединения
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# Разрешить машинам локальной сети ходить в интернет по указанным TCP портам
iptables -A FORWARD -p TCP -s $LOCAL_NET -m multiport --dport $FORWARD_TCP_PORTS -j ACCEPT
iptables -A FORWARD -p TCP -d $LOCAL_NET -m multiport --dport $FORWARD_TCP_PORTS -j ACCEPT
# Разрешить машинам локальной сети ходить в интернет по указанным UDP портам
iptables -A FORWARD -p UDP -s $LOCAL_NET -m multiport --dport $FORWARD_UDP_PORTS -j ACCEPT
iptables -A FORWARD -p UDP -d $LOCAL_NET -m multiport --dport $FORWARD_UDP_PORTS -j ACCEPT

### NAT
# Включить NAT для локальной подсети
iptables -t nat -A POSTROUTING -s $LOCAL_NET -o $INET_IF -j SNAT --to-source $INET_IP
# Пробросить порт на локальный веб сервер
iptables -t nat -A PREROUTING -p TCP -d $INET_IP --dport 80 -j DNAT --to-destination $WEB_SERVER:80

Надо отметить, что если пробрасывается порт, отличный от списка $FORWARD_TCP_PORTS, то необходимо его туда добавить, т.к. он будет дропаться политикой по умолчанию.
В итоге, скрипт iptables для шлюза будет выглядеть следующим образом. Отличается от предыдущих правил.

#!/bin/sh
# Очистить все правила
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X

### Переменные
# Интерфейс, смотрящий в интернет
INET_IF="eth0"
# Белый IP адрес, принадлежащий $INET_IF
INET_IP="x.x.x.x"
# Локальная сеть
LOCAL_NET="192.168.0.0/24"
# IP адрес локального веб сервера
WEB_SERVER="192.168.0.10"

# Включить в ядре форвард IPv4 пакетов
# Путь до sysctl
SYSCTL="/sbin/sysctl -w"
if [ "$SYSCTL" = "" ]
then
    echo "1" > /proc/sys/net/ipv4/ip_forward
else
    $SYSCTL net.ipv4.ip_forward="1"
fi

### Правила по умолчанию
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

### INPUT 
# Разрешить входящие соединения с локалхоста
iptables -A INPUT -i lo -j ACCEPT
# Разрешить принимать уже установленные соединения
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Разрешить SSH только из локальной сети
iptables -A INPUT -p TCP -s $LOCAL_NET --dport 22 -j ACCEPT
# Разрешить запросы к кэширующему DNS серверу только из локальной сети
iptables -A INPUT -p TCP -s $LOCAL_NET --dport 53 -j ACCEPT
iptables -A INPUT -p UDP -s $LOCAL_NET --dport 53 -j ACCEPT

### FORWARD
# Разрешить уже установленные пересылаемые соединения
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# TCP порты, по которым разрешено ходить в интернет машинам из локальной сети
FORWARD_TCP_PORTS="80,443"
# Разрешить машинам локальной сети ходить в интернет по указанным TCP портам
iptables -A FORWARD -p TCP -s $LOCAL_NET -m multiport --dport $FORWARD_TCP_PORTS -j ACCEPT
iptables -A FORWARD -p TCP -d $LOCAL_NET -m multiport --dport $FORWARD_TCP_PORTS -j ACCEPT

### NAT
# Включить NAT для локальной подсети
iptables -t nat -A POSTROUTING -s $LOCAL_NET -o $INET_IF -j SNAT --to-source $INET_IP
# Пробросить порт на локальный веб сервер на нестандартный порт
iptables -t nat -A PREROUTING -p TCP -d $INET_IP --dport 80 -j DNAT --to-destination $WEB_SERVER:8090

Вывод текущих правил

Посмотреть правила для таблицы filter, т.е. команда покажет основные правила iptables:

iptables -L -n

Для конкретной таблицы, например nat и mangle:

iptables -t nat -L -n
iptables -t mangle -L -n

Комментарии к посту “Минимальный набор правил Iptables для типовых задач

  1. Виктор

    Здравствуйте.
    Настроил все по «Минимальный набор правил iptables для шлюза». Не работает DNS:
    DNS request timed out.
    timeout was 2 seconds.
    *** Can’t find server name for address 192.168.1.1: Timed out
    *** Default servers are not available
    Server: UnKnown
    Address: 192.168.1.1

    DNS request timed out.
    timeout was 2 seconds.
    DNS request timed out.
    timeout was 2 seconds.

    iptables
    Chain INPUT (policy DROP 23 packets, 1600 bytes)
    pkts bytes target prot opt in out source destination
    10 2460 ACCEPT all — lo * 0.0.0.0/0 0.0.0.0/0
    4 1212 ACCEPT all — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
    0 0 ACCEPT tcp — * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22

    Chain FORWARD (policy DROP 0 packets, 0 bytes)
    pkts bytes target prot opt in out source destination
    0 0 ACCEPT all — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
    0 0 ACCEPT tcp — * * 192.168.1.0/24 0.0.0.0/0 multiport dports 53,80,8080
    0 0 ACCEPT tcp — * * 0.0.0.0/0 192.168.1.0/24 multiport dports 53,80,8080
    0 0 ACCEPT udp — * * 192.168.1.0/24 0.0.0.0/0 multiport dports 53
    0 0 ACCEPT udp — * * 0.0.0.0/0 192.168.1.0/24 multiport dports 53

    Chain OUTPUT (policy ACCEPT 37 packets, 4332 bytes)
    pkts bytes target prot opt in out source destination

  2. Виктор

    Заработало после добавления
    iptables -A INPUT -p udp —dport 53 -j ACCEPT

    1. admin Автор записи

      В разделе «Минимальный набор правил iptables для шлюза» указано, что для работы DNS надо надо разрешить форвардить 53 порт по tcp и udp. Естественно, если DNS сервер находится на настраиваемом сервере, то надо разрешить входящие подключения к нему. Поэтому сделали все правильно.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *