Iptables tutorial и проброс портов в виртуальную машину KVM


Утилита Iptables используется в различных дистрибутивах Линукс как сетевой фильтр и брандмауэр. iptables содержит 3 таблицы, каждая их таблиц содержит цепочки правил. Пользователи могут самостоятельно редактировать уже существующие цепочки, создавать новые, удалять. Как всегда пишу себе заметку в ввиде краткого руководства с одним конкретным примером, чтобы не забывать всё это дело.

1. Таблицы iptables
———-

iptables содержит 3 таблицы:
a) filter table
b) nat table
c) mangling table

a) таблица filter
Эта таблица предназначена для фильтрования пакетов проходящие через брандмауэр. Задача этой таблицы только фильтровать, фильтрует только входящие пакеты на машину, выходящие пакеты из машины и проходящие пакеты между сетями — сетевыми платами (если их несколько).

Содержит 3 цепочки правил:
INPUT — используется для фильтрации входящих пакетов
OUTPUT — используется для фильтрации выходящих пакетов
FORWARD — используется для фильтрации проходящих пакетов (между сетями)

b) таблица nat.
Используется для изменения IP адреса источника.

Цепочки правил:
PREROUTING — для изменения IP адреса перед перенаправлением
POSTROUTING — для изменения IP адреса после перенаправления
OUTPUT — используется для фильтрации исходящих пакетов

c) таблица mangle
Используется для модификации пакетов.

2. Синтаксис iptables таблиц
———-

iptables name_of_table name_of_chain layer3_object layer4_object jump_target
Заметки:
— по умолчанию если имя таблицы не указано («-t nat» к примеру для таблицы nat) используется таблица filter;
— layer4_object — не обязательно;

Примеры использования:
iptables -A INPUT -s 192.168.0.1 -j DROP       # сбросит все пакеты приходящие с адреса  IP 192.168.0.1

3. Управление цепочками
———-

Отобразить список таблиц и цепочек правил:
iptables -L                                   # отобразит список — все цепочки правил со всех таблиц
iptables -L INPUT                        # will show all rules from INPUT chain from filter table
iptables -L -t nat                          # отобразит все правила в таблице nat
iptables -t nat -L PREROUTING   # отобразит все правила в цепочки правил PREROUTING в таблице nat.

Добавление правил в цепочку:
iptables -A INPUT -s 192.168.0.1 -j ACCEPT     # разрешает входящий трафик с 192.168.0.1
iptables -A INPUT -p tcp —dport 22 -j DROP      # запрещает входящий трафик с 22 порта

iptables -A — добавляет правила в конец списка правил определённой цепочки. Если вы хотите вставить правило в определённую позицию вашей цепочки используйте параметр -I место.
iptables -I INPUT 10 -p tcp —dport 22 -j DROP   # добавляет правило на 10 позицию цепочки INPUT.
Правила в цепочках оцениваются от первой к последней.

Заметка 1: Если вы хотите блокировать входящий трафик работайте с цепочкой правил INPUT, если исходящий — работайте с цепочкой OUTPUT.

Заметка 2: Каждая цепочка имеет политику по умолчанию, по умолчанию для всех цепочек используется политика ACCEPT.

Заметка 3: Когда вы добавляете правило с параметром -j (jump), необходимо указать один из вариантов значений: ACCEPT, DROP, REJECT, DENY, LOG.

Удаление всех правил из цепочек:
iptables -F                              # удалит все правила из таблицы filter
iptables -F -t nat                       # удалит все правила из таблицы nat
iptables -F -t mangle                   # удалит все правила из таблицы mangle

Удаление отдельного правила из цепочки:
Есть два варианта удаления правил из цепочек: удаление по позиции в цепочке, удаление по синтаксису, которым правило было добавлено.
iptables -D INPUT 10                         # удалит правило 10 с цепочки INPUT
iptables -D PREROUTING 10 -t nat     # удалит правило 10 с цепочки PREROUTING в таблице nat
iptables -D INPUT -s 192.168.0.1 -j ACCEPT      # удалит правило которое было добавлено следующим синтаксисом (iptables -A INPUT -s 192.168.0.1 -j ACCEPT)

Заметка: В нашем предыдущем примере будет удалено первое правило подходящие по синтаксису. Если в цепочке несколько одинаковых правил, команду удаления необходимо провести несколько раз пока не удалите все необходимые правила.

Сохранение / Восстановление правил:
iptables-save > rules.txt
iptables-restore < rules.txt

(Если iptables не определён в вашем окружении, можно использовать абсолютный путь : /sbin/iptables-save, и /sbin/iptables-restore). Запуск iptables-save выведет все правила на стандартный вывод(обычно это экран, потому необходимо использовать перенаправление).

4. Политика цепочки
———-

Цепочки могут иметь политики ACCEPT, или DROP. По умолчанию для всех цепочек установлена политика ACCEPT. Для изменения политики используйте следующие команды.
iptables -P INPUT DROP

Заметка 1: Если вы работаете на машине удалённо через SSH, будьте осторожны с политиками, что бы не заблокировать всё(самого себя). Хорошая практика когда администратор организует автоматическое открытие доступа к машине каждые 15 минут используя сервис CRON.

Заметка 2: Когда вы разрабатываете правила доступа к вашей машине имейте в виду, что трафик проходит в две стороны . Если вы откроете весь входящий трафик INPUT, но закроете всё в OUTPUT исходящий трафик — сеть не будет работать. Для того, что бы защитить сеть, хорошей практикой считается заблокировать все входящие INPUT , для соединений которые не были созданы вашей машиной и разрешить все исходящие (OUTPUT). Если ваша машина выступает в роли сервера на которой работаю такие сетевые сервисы как: интернет сервер, почтовый сервер — необходимо разрешить подключаться из вне, добавить правила в цепочку INPUT, только те порты, которые используют сервисы (к примеру 80 — http, 25 — smtp, 110 — pop3 и 143 -imap). Как вывод, когда вы настраиваете брандмауэр необходимо закрыть все входящие, а исходящие оставить по умолчанию, для того что б продолжить настройку. Не забудьте про SSH.

Заметка 3: Если не только ваша машина подключена к интернету, но и перенаправляет клиентов с локальной сети, тогда необходимо фильтровать соединения с локальной сети. Рекомендуется на цепочку FORWARD установить политику DROP и потом разрешить определенным адресам с локальной сети получать доступ к Интернету.

add. Реальный случай использования -> Проброс портов в виртуальную машину KVM
———-

Сетевой интерфейс хоста eth0 подключен к сети интернет по DHCP от роутера со статическим выделенным IP 192.168.1.19. В хост системе создан виртуальный коммутатор virbr0 с IP адресом в виртуальной сети 192.168.122.1. Виртуальный сетевой интерфейс виртуальной машины подключен в виртуальную сеть и получил IP адрес 192.168.122.4. На виртуальной машине установлен ssh-сервер и нам необходимо получить к нему доступ из сети интернет (порт ssh в данном случае 1816).

Поставленная задача решается двумя командами, выполненными в терминале хоста:
sudo iptables -t nat -A PREROUTING —dst 192.168.1.19 -p tcp —dport 1816 -j DNAT —to-destination 192.168.122.4
sudo iptables -I FORWARD 1 -i eth0 -o virbr0 -d 192.168.122.4 -p tcp -m tcp —dport 1816 -j ACCEPT

Не забыть также пробросить из сети интернет порт на роутере до 192.168.1.19

После перезагрузки хоста, правила будут слетать, чтобы этого избежать, в debian и ubuntu добавили пакет iptables-persistent, который использует iptables-save/iptables-restore

Устанавливаем:
sudo aptitude install iptables-persistent

Использование:
#service iptables-persistent
/etc/init.d/iptables-persistent {start|restart|reload|force-reload|save|flush}

После настройки правил как нужно, сделать service iptables-persistent save и при следующей загрузке они будут применены

Теперь подключаемся в виртуальную машину из интернета:
ssh -p 1816 user@domain_or_ip