Введение в Iptables
Данный материал является частью единого цикла заметок o CLI. Для его написания использовалось множество различных источников (статьи, тех. документация, видео различных авторов, комментарии и т. д и т. п.). К сожалению, указать все источники точно не представляется возможным! По этому, в конце заметки, будет указана ссылка только на основной источник. Материалы, использованные для написания заметки, изменялись автором под конкретную задачу! Вам, скорее всего, тоже придется поступить аналогичным образом для получения желаемого результата)
Основные команды
Всего в iptables 5 стандартных цепочек(prerouting postrouting input output forvard) Могут быть также созданы пользовательские цепочки, для более тонкой настройки сервисов)
В цепочках присутствуют некоторые таблицы, которые могут содержать в себе правила различного вида. Например, в таблице MANGL можно изменять для пакета такой параметр, как ТТL (тоесть время жизни, или другими словами, какое количество роутеров пройдет пакет, пока не будет терминирован.) Или таблица ТОS - применяется для изменения приоритетов для различных видов трафика! Для разрешения или ограничения доступа используется таблица FILTER. Самая сложная таблица, скорее всего, это NAT - она служит для изменения IP-адреса.
Просмотр всех правил для таблиц по умолчанию :
iptables -L
Просмотр всех правил для таблицы nat :
iptables -L -t nat
Для того чтобы полностью очистить таблицу от правил(по умолчанию применяется к таблице filter) используются ключи -X и -F:
iptables -X
iptables -F
Для того чтобы очистить любую другую таблицу ( для примера очистим nat) ее название нужно указать в команде после ключа -t
iptables -t nat -X
iptables -t nat -F
Просмотр всех правил c использованием возможности вывести больше параметров(pkts bytes target prot opt in out source destination ) возможен с помощью ключа -v:
iptables -L -v
Еще больше информации о правилах с помощью ключа -vv :
iptables -L -vv
Внимание!
При работе в iptables важно понимать значение термина - политика по умолчанию! (policy DROP) Это как правило означает, что запрещено все, что не разрешено! Либо (policy ACCEPT) - разрешено все, что не запрещено!
Изменение политики по умолчанию для любой цепочки (для примера возьмем цепочку INPUT) можно выполнить командой:
iptables -L INPUT DROP // Запрещаем
iptables -L INPUT ACCEPT // Разрешаем
В случае если задать запрещающую политику по умолчанию для цепочки INPUT, то перестанут проходить все ICMP-запросы, как из Мира в локалку, так и наоборот:
iptables -L INPUT DROP
Поскольку, такая политика запрещает в том числе и эхо-ответы необходимые для корректной работы PING. То по этой причине, нам необходимо добавить в цепочке INPUT дополнительное правило, которое позволяет получать эхо-ответы необходимые для работы пинга из локальной сети наружу:
iptables -А INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
После ключа -j указывается само действие (в данном случае, разрешаем все пакеты с состоянием RELATED,ESTABLISHED). Этим не хитрым способом мы создали правило разрешающее нашим локальным приложениям посылать ICMP-пакеты на сетевые интерфейсы, но пакеты приходящие к нам из Мира на сетевые интерфейсы будут блокироваться!
Запретить пинг локального интерфейса можно, указав его с помощью ключа -i, команда выглядит так:
iptables -А INPUT -i lo -j DROP
Разрешаем пинг lo так:
iptables -А INPUT -i lo -j ACCEPT
Для удаления правил : Применяем к правилу которое хотим удалить ключ -D
iptables -D INPUT -i lo -j DROP
Для того что бы добавить правило открытия порта, нужно указать интерфейс, протокол, номер порта:
iptables -А INPUT -i eth0@if755 -m tcp -p tcp --dport 80 -j ACCEPT
Для того что бы добавить правило открытия диапазона портов, нужно указать интерфейс, протокол, номер порта:
iptables -А INPUT -i eth0@if755 -m multiport -p tcp --dports 80:8080 -j ACCEPTeth0@if755 -m tcp -p tcp --dport 80 -j ACCEPT
Для того что бы открыть порт только для определенного подсети нужно, также указать интерфейс, протокол, номер порта и ключём -s разрешенную подсеть:
iptables -А INPUT -i eth0@if755 -s 10.8.0.0/24 -m tcp -p tcp --dport 80 -j ACCEPTeth0@if755 -m tcp -p tcp --dport 80 -j ACCEPT
Для того что бы открыть порт только для определенного подсети нужно, также указать интерфейс, протокол, номер порта и ключём -d разрешенную подсеть:
iptables -А INPUT -i eth0@if755 -d 10.8.0.0/24 -m tcp -p tcp --dport 80 -j ACCEPTeth0@if755 -m tcp -p tcp --dport 80 -j ACCEPT
Создаем правило разрешающее хосту в локальной сети доступ в интернет используя sNAT :
iptables -A POSTROUTING -t nat -s 192.168.1.0/24 -o eth0@if755 -j MASQUERADE #В этом режиме определенные ресурсы ПК затрачиваются на сопоставление IP адресов!
Создаем правило разрешающее хосту в локальной сети доступ в интернет используя sNAT:
iptables -A POSTROUTING -t nat -s 192.168.1.0/24 -o eth0@if755 -j SNAT --to-sourse 192.168.1.159 #В этом случае мы четко указываем IP!
После применения правил необходимо флапнуть интерфейсы:
ifconfig eth0@if755 down
ifconfig eth0@if755 up
Создаем правило разрешающее хосту в локальной сети доступ в интернет используя dNAT:
iptables -A PREROUTING -t nat -i eth0@if755 -m tcp -p tcp --dport 9000 -j DNAT --to-destinationn 192.168.1.159 #Проверяем проброс!
Просмотр всех правил :
iptables -L
Либо можете воспользоваться готовым проектом, где все собрано в одном месте - winbox-installer.
Для сохранения всех правил iptables используем:
iptables-save > /root/iptables-rules
Его содержимое может быть таким:
# Generated by iptables-save v1.8.4 on Sun Jan 17 22:13:59 2021
*nat
:PREROUTING ACCEPT [1941:244083]
:INPUT ACCEPT [6:408]
:OUTPUT ACCEPT [16:1115]
:POSTROUTING ACCEPT [16:1115]
COMMIT
# Completed on Sun Jan 17 22:13:59 2021
# Generated by iptables-save v1.8.4 on Sun Jan 17 22:13:59 2021
*filter
:INPUT DROP [4259:183904]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:ufw-after-forward - [0:0]
:ufw-after-input - [0:0]
:ufw-after-logging-forward - [0:0]
:ufw-after-logging-input - [0:0]
:ufw-after-logging-output - [0:0]
:ufw-after-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-before-input - [0:0]
:ufw-before-logging-forward - [0:0]
:ufw-before-logging-input - [0:0]
:ufw-before-logging-output - [0:0]
:ufw-before-output - [0:0]
:ufw-logging-allow - [0:0]
:ufw-logging-deny - [0:0]
:ufw-not-local - [0:0]
:ufw-reject-forward - [0:0]
:ufw-reject-input - [0:0]
:ufw-reject-output - [0:0]
:ufw-skip-to-policy-forward - [0:0]
:ufw-skip-to-policy-input - [0:0]
:ufw-skip-to-policy-output - [0:0]
:ufw-track-forward - [0:0]
:ufw-track-input - [0:0]
:ufw-track-output - [0:0]
:ufw-user-forward - [0:0]
:ufw-user-input - [0:0]
:ufw-user-limit - [0:0]
:ufw-user-limit-accept - [0:0]
:ufw-user-logging-forward - [0:0]
:ufw-user-logging-input - [0:0]
:ufw-user-logging-output - [0:0]
:ufw-user-output - [0:0]
-A INPUT -j ufw-before-logging-input
-A INPUT -j ufw-before-input
-A INPUT -j ufw-after-input
-A INPUT -j ufw-after-logging-input
-A INPUT -j ufw-reject-input
-A INPUT -j ufw-track-input
-A FORWARD -j ufw-before-logging-forward
-A FORWARD -j ufw-before-forward
-A FORWARD -j ufw-after-forward
-A FORWARD -j ufw-after-logging-forward
-A FORWARD -j ufw-reject-forward
-A FORWARD -j ufw-track-forward
-A OUTPUT -j ufw-before-logging-output
-A OUTPUT -j ufw-before-output
-A OUTPUT -j ufw-after-output
-A OUTPUT -j ufw-after-logging-output
-A OUTPUT -j ufw-reject-output
-A OUTPUT -j ufw-track-output
-A ufw-after-input -p udp -m udp --dport 137 -j ufw-skip-to-policy-input
-A ufw-after-input -p udp -m udp --dport 138 -j ufw-skip-to-policy-input
-A ufw-after-input -p tcp -m tcp --dport 139 -j ufw-skip-to-policy-input
-A ufw-after-input -p tcp -m tcp --dport 445 -j ufw-skip-to-policy-input
-A ufw-after-input -p udp -m udp --dport 67 -j ufw-skip-to-policy-input
-A ufw-after-input -p udp -m udp --dport 68 -j ufw-skip-to-policy-input
-A ufw-after-input -m addrtype --dst-type BROADCAST -j ufw-skip-to-policy-input
-A ufw-after-logging-forward -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW BLOCK] "
-A ufw-after-logging-input -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW BLOCK] "
-A ufw-before-forward -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-forward -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A ufw-before-forward -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A ufw-before-forward -p icmp -m icmp --icmp-type 12 -j ACCEPT
-A ufw-before-forward -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A ufw-before-forward -j ufw-user-forward
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-input -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-input -m conntrack --ctstate INVALID -j ufw-logging-deny
-A ufw-before-input -m conntrack --ctstate INVALID -j DROP
-A ufw-before-input -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A ufw-before-input -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A ufw-before-input -p icmp -m icmp --icmp-type 12 -j ACCEPT
-A ufw-before-input -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A ufw-before-input -p udp -m udp --sport 67 --dport 68 -j ACCEPT
-A ufw-before-input -j ufw-not-local
-A ufw-before-input -d 224.0.0.251/32 -p udp -m udp --dport 5353 -j ACCEPT
-A ufw-before-input -d 239.255.255.250/32 -p udp -m udp --dport 1900 -j ACCEPT
-A ufw-before-input -j ufw-user-input
-A ufw-before-output -o lo -j ACCEPT
-A ufw-before-output -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-output -j ufw-user-output
-A ufw-logging-allow -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW ALLOW] "
-A ufw-logging-deny -m conntrack --ctstate INVALID -m limit --limit 3/min --limit-burst 10 -j RETURN
-A ufw-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW BLOCK] "
-A ufw-not-local -m addrtype --dst-type LOCAL -j RETURN
-A ufw-not-local -m addrtype --dst-type MULTICAST -j RETURN
-A ufw-not-local -m addrtype --dst-type BROADCAST -j RETURN
-A ufw-not-local -m limit --limit 3/min --limit-burst 10 -j ufw-logging-deny
-A ufw-not-local -j DROP
-A ufw-skip-to-policy-forward -j DROP
-A ufw-skip-to-policy-input -j DROP
-A ufw-skip-to-policy-output -j ACCEPT
-A ufw-track-output -p tcp -m conntrack --ctstate NEW -j ACCEPT
-A ufw-track-output -p udp -m conntrack --ctstate NEW -j ACCEPT
-A ufw-user-input -p tcp -m tcp --dport 888 -j ACCEPT
-A ufw-user-input -p tcp -m tcp --dport 20 -j ACCEPT
-A ufw-user-input -p tcp -m tcp --dport 21 -j ACCEPT
-A ufw-user-input -p tcp -m tcp --dport 22 -j ACCEPT
-A ufw-user-input -p tcp -m tcp --dport 80 -j ACCEPT
-A ufw-user-input -p tcp -m tcp --dport 8888 -j ACCEPT
-A ufw-user-input -p tcp -m multiport --dports 39000:40000 -j ACCEPT
-A ufw-user-limit -m limit --limit 3/min -j LOG --log-prefix "[UFW LIMIT BLOCK] "
-A ufw-user-limit -j REJECT --reject-with icmp-port-unreachable
-A ufw-user-limit-accept -j ACCEPT
COMMIT
# Completed on Sun Jan 17 22:13:59 2021
Для загрузки правил из файла :
iptables-restore < /root/iptables-rules
Источник:
G. I.