1. Iptables vvedenie

Введение в 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 -Xiptables -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
Важный нюанс! Существуют всего три типа NAT!  Один тип это NAT,  позволяющий получить доступ из Мира в вашу локальную сеть. Остальные два типа это NATы,  которые позволяют получить доступ из локальной сети в интернет. В одном случае используя статическую маршрутизацию(sNAT), в другом динамическую(dNAT)! Также чтобы работал NAT на машине нужно включить ipv4 форвординг!
dNAT указывается в цепочке prerouting
sNAT указывается в цепочке postrouting

Создаем правило разрешающее хосту в локальной сети доступ в интернет используя 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 используем:

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. 

 

  • Iptables
  • 0 Uživatelům pomohlo
Byla tato odpověď nápomocná?

Související články

0. Debian проброс одного или нескольких портов на другой хост / forwarding one or pool of ports to the another host

  Это технический шаблон заметки о CLI!    Данный опус является частью...