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

mangling kvm iptables iptables delete postrouting

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

Таблицы iptables

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

Таблица filter

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

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

Таблица nat

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

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

Таблица mangle

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

Синтаксис 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

Управление цепочками

Отобразить список таблиц и цепочек правил:

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 выведет все правила на стандартный вывод(обычно это экран, потому необходимо использовать перенаправление).

Политика цепочки

Цепочки могут иметь политики 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 и потом разрешить определенным адресам с локальной сети получать доступ к Интернету.

Реальный случай использования

Проброс портов в виртуальную машину 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

Таблица соответствия IP-адресов в примере и по факту

  пример факт
  eth0 eth1 eth0 vboxnet0
interface 192.15.100.45 192.168.1.5 5.9.24.112 192.168.17.1
web server 203.0.113.2 192.0.2.2   192.168.17.19
router 111.111.111.111   5.9.24.97  
firewall 203.0.113.15 192.0.2.15   192.168.17.1

EOF