Инструменты пользователя

Инструменты сайта


iptables

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
iptables [2016/01/28 03:59]
sander
iptables [2016/01/29 02:41] (текущий)
sander
Строка 1: Строка 1:
 +====== iptables ======
 +===== Архитектура =====
 +==== Основные понятия ====
 +**
 +Ключевыми понятиями iptables являются:​**
  
 +  * **Правило** — состоит из критерия,​ действия и счетчика. Если пакет соответствует критерию,​ к нему применяется действие,​ и он учитывается счетчиком. Критерия может и не быть — тогда неявно предполагается критерий «все пакеты». Указывать действие тоже не обязательно — в отсутствие действия правило будет работать только как счетчик.
 +      * **Критерий** — логическое выражение,​ анализирующее свойства пакета и/или соединения и определяющее,​ подпадает ли данный конкретный пакет под действие текущего правила.
 +      * **Действие** — описание действия,​ которое нужно проделать с пакетом и/или соединением в том случае,​ если они подпадают под действие этого правила. О действиях более подробно будет рассказано ниже.
 +      * **Счетчик** — компонент правила,​ обеспечивающий учет количества пакетов,​ которые попали под критерий данного правила. Также счетчик учитывает суммарный объем таких пакетов в байтах.
 +  * **Цепочка** — упорядоченная последовательность правил. Цепочки можно разделить на пользовательские и базовые.
 +      * **Базовая цепочка** — цепочка,​ создаваемая по умолчанию при инициализации таблицы. Каждый пакет, в зависимости от того, предназначен ли он самому хосту, сгенерирован им или является транзитным,​ должен пройти положенный ему набор базовых цепочек различных таблиц. Схема следования пакетов приведена на рисунке. Кроме того, базовая цепочка отличается от пользовательской наличием «действия по умолчанию» (default policy). Это действие применяется к тем пакетам,​ которые не были обработаны другими правилами этой цепочки и вызванных из нее цепочек (см. переходы). Имена базовых цепочек всегда записываются в верхнем регистре (PREROUTING,​ INPUT, FORWARD, OUTPUT, POSTROUTING).
 +      * **Пользовательская цепочка** — цепочка,​ созданная пользователем. Может использоваться только в пределах своей таблицы. Рекомендуется не использовать для таких цепочек имена в верхнем регистре,​ чтобы избежать путаницы с базовыми цепочками и встроенными действиями.
 +  * **Таблица** — совокупность базовых и пользовательских цепочек,​ объединенных общим функциональным назначением. Имена таблиц (как и модулей критериев) записываются в нижнем регистре,​ так как в принципе не могут конфликтовать с именами пользовательских цепочек. При вызове команды iptables таблица указывается в формате -t имя_таблицы. При отсутствии явного указания,​ используется таблица filter. Более подробно таблицы будут рассмотрены ниже.
 +
 +{{ :​netfilter-diagram-rus.png?​410 |}}
 +
 +===== Критерии состояния соединения =====
 +
 +**conntrack**
 +<code bash>
 +-m conntrack --ctstate маска
 +</​code>​
 +Маска содержит перечисление через запятую список возможных состояний соединения. Пакет считается удовлетворяющим критерию,​ если соединение,​ по которому он проходит,​ находится в одном из перечисленных состояний.\\
 +
 +**Возможные состояния:​**
 +
 +  * **NEW** — соединение не открыто,​ то есть пакет является первым в соединении. Полезные примеры использования этого состояния приведены выше, в частности,​ при описании TCP-специфичных критериев.
 +  * **ESTABLISHED** — пакет относится к уже установленному соединению. Обычно такие пакеты принимаются без дополнительной фильтрации,​ как и в случае с RELATED.
 +  * **RELATED** — пакет открывает новое соединение,​ логически связанное с уже установленными,​ например,​ открытие канала данных в пассивном режиме FTP.
 +  * **INVALID** — пакет по смыслу должен принадлежать уже установленному соединению (например,​ ICMP-сообщение port-unreachable),​ однако такое соединение в системе не зарегистрировано. Обычно к таким пакетам применяют действие DROP.
 +  * **UNTRACKED** — отслеживание состояния соединения для данного пакета было отключено. Обычно оно отключается с помощью действия NOTRACK в таблице raw.
 +  * **DNAT** — показывает,​ что к данному соединению применена операция подмены адреса назначения.
 +  * **SNAT** — показывает,​ что к данному соединению применена операция подмены адреса источника.
 +
 +
 +
 +===== Действия =====
 +
 +===== Таблица nat =====
 +
 +==== Цепочки ====
 +
 +  * **PREROUTING** — в эту цепочку пакеты попадают до принятия решения о маршрутизации. По сути, термин «решение о маршрутизации» подразумевает деление трафика на входящий (предназначенный самому хосту) и транзитный (идущий через этот хост на другие хосты). Именно на данном этапе нужно проводить операции проброса (**DNAT**, **REDIRECT**,​ **NETMAP**).
 +  * **OUTPUT** — через эту цепочку проходят пакеты,​ сгенерированные процессами самого хоста. На данном этапе при необходимости можно повторить операции проброса,​ так локально сгенерированные пакеты не проходят цепочку **PREROUTING** и не обрабатываются ее правилами.
 +  * **POSTROUTING** — через эту цепочку проходят все исходящие пакеты,​ поэтому именно в ней целесообразно проводить операции маскарадинга (**SNAT** и **MASQUERADE**).
 +==== Действия ====
 +  * **MASQUERADE** — подменяет адрес источника для исходящих пакетов адресом того интерфейса,​ с которого они исходят,​ то есть осуществляет маскарадинг. Такая операция позволяет,​ например,​ предоставлять доступ в Интернет целым локальным сетям через один шлюз.
 +<code bash>
 +# Маскарадим весь трафик,​ идущий через eth0
 +iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
 +</​code>​
 +
 +  * **SNAT (Source Network Address Translation)** — работает аналогично MASQUERADE, однако позволяет указать адрес «внешнего» интерфейса (опция --to-source). Такой подход позволяет экономить процессорное время шлюза, так как в случае с MASQUERADE для каждого пакета адрес внешнего интерфейса определяется заново.
 +<code bash>
 +#Таким образом,​ если в предыдущем примере внешний адрес шлюза 208.77.188.166
 +# является статическим (то есть никогда не меняется),​ команду
 +iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
 +#​целесообразно заменить на
 +iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 208.77.188.166
 +</​code>​
 +
 +  * **DNAT (Destination Network Address Translation)** — подменяет адрес назначения для входящих пакетов,​ позволяя «пробрасывать» адреса или отдельные порты внутрь локальной сети.
 +<code bash>
 +# Пробрасываем 208.77.188.166 на 192.168.1.2
 +iptables -t nat -A PREROUTING -d 208.77.188.166 -j DNAT --to-destination 192.168.1.2
 +</​code>​
 +  * **REDIRECT** — подменяет номер порта в TCP- или UDP-пакете,​ а также подменяет адрес назначения на свой собственный. ​
 +<code bash>
 +iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 8080
 +</​code>​
 +
 +  * **SAME** —  зависимости от цепочки (PREROUTING или POSTROUTING) может работать как DNAT или SNAT. Однако,​ при указании (в параметре --to-ip) одного или нескольких диапазонов IP-адресов,​ определяет для каждого нового соединения подставляемый адрес не случайно,​ а базируясь на IP-адресе клиента. Таким образом,​ адрес для подмены остается постоянным для одного и того же клиента при повторных соединениях (что не выполняется для обычных DNAT/SNAT). В некоторых случаях это бывает важным.
 +  * **NETMAP** — позволяет «пробросить» целую сеть. Например,​ для шлюза, стоящего между сетями 192.168.1.0/​24 и 192.168.2.0/​24 можно организовать следующий проброс:​
 +
 +<code bash>
 +iptables -t nat -A PREROUTING -s 192.168.1.0/​24 -d 192.168.3.0/​24 -j NETMAP --to 192.168.2.2/​24
 +</​code>​
 +//​*Теперь,​ при обращении,​ например,​ хоста 192.168.1.3 на IP-адрес 192.168.3.2 он будет попадать на 192.168.2.2 (при условии,​ что такой транзитный трафик разрешен на шлюзе в цепочке FORWARD таблицы filter, а также на хостах сети 192.168.1.0/​24 наш шлюз прописан в качестве шлюза для подсети 192.168.3.0/​24).//​
 +
 +  * **MIRROR** — довольно интересная игрушка. Меняет местами адрес источника и назначения и высылает пакет обратно. Создано исключительно для демонстрационных целей. Однако,​ может, например,​ применяться для защиты от сканирования портов — в результате атакующий сканирует свои собственные порты. Однако наличие двух встречных MIRROR’ов на двух хостах может повлечь бесконечное блуждание одних и тех же пакетов,​ забивающее канал. Поэтому применяйте это действие с осторожностью.
 +
 +
 +
 +===== Таблица filter =====
 +
 +==== Цепочки ====
 +
 +Таблица **filter** содержит следующие цепочки:​
 +  * **INPUT** — эта цепочка обрабатывает трафик,​ поступающий непосредственно самому хосту.
 +  * **FORWARD** — позволяет фильтровать транзитный трафик.
 +  * **OUTPUT** — эта цепочка позволяет фильтровать трафик,​ исходящий от самого хоста.
 +
 +==== Действия ====
 +
 +Допустимыми действиями в таблице filter являются:​
 +
 +  * **ACCEPT** — пропуск пакета. Пакет покидает текущую базовую цепочку и следует дальше по потоковой диаграмме.
 +  * **REJECT** — заблокировать пакет и сообщить его источнику об отказе. По умолчанию об отказе сообщается отправкой ответного ICMP-пакета «icmp-port-unreachable». Однако,​ это действие поддерживает опцию --reject-with,​ позволяющую указать формулировку сообщения об отказе (возможные значения:​ icmp-net-unreachable,​ icmp-host-unreachable,​ icmp-proto-unreachable,​ icmp-net-prohibited,​ icmp-host-prohibited). Для протокола TCP поддерживается отказ в форме отправки RST-пакета (--reject-with tcp-reset).
 +  * **DROP** — заблокировать пакет, не сообщая источнику об отказе. Более предпочтительна при фильтрации трафика на интерфейсах,​ подключенных к интернету,​ так как понижает информативность сканирования портов хоста злоумышленниками.
 +
 +Также определенный интерес представляют действия,​ предоставляемые модулями xtables-addons (в настоящее время этот проект уже включен в Debian testing). Некоторые из них:
 +
 +  * **STEAL** — аналогично DROP, но в случае использования в цепочке OUTPUT при блокировании исходящего пакета не сообщает об ошибке приложению,​ пытавшемуся отправить этот пакет.
 +  * **TARPIT** — «подвесить» TCP-соединение. Используется лишь в самых крайних случаях,​ например,​ при борьбе с DoS-атаками. Отвечает на входящее соединение,​ после чего уменьшает размер фрейма до нуля, блокируя возможность передачи данных. Соединение будет «висеть» в таком состоянии пока не истечет тайм-аут на атакующей стороне (обычно 20—30 минут). При этом на такое соединение расходуются системные ресурсы атакующей стороны (процессорное время и оперативная память),​ что может быть весьма ощутимо при значительном количестве соединений. В случае правильного использования действия TARPIT ресурсы атакуемой стороны практически не расходуются.
 +Под правильным применением понимается предотвращение обработки таких соединений подсистемой conntrack, так как в противном случае будут расходоваться системные ресурсы самого атакуемого хоста. Например,​ перед добавлением правила блокирования порта
 +<code bash>
 +iptables -I INPUT -p tcp --dport 25 -j TARPIT
 +</​code>​
 +//​обязательно добавляйте в таблицу raw соответствующее правило//​
 +<code bash>
 +iptables -t raw -I PREROUTING -p tcp --dport 25 -j NOTRACK
 +</​code>​
 +//​предотвращающее обработку блокируемых соединений подсистемой conntrack.//​
 +
 +  * **DELUDE** — создать видимость открытого TCP-порта. На SYN-пакеты отвечает пакетами SYN/ACK, на все прочие пакеты отвечает RST. Очень полезно для введения в заблуждение злоумышленника,​ сканирующего порты вашего хоста.
 +  * **CHAOS** — для каждого нового TCP-соединения случайно выбрать одно из двух действий. Первое из них — REJECT, второе,​ в зависимости от выбранной опции, либо TARPIT (--tarpit), либо DELUDE (--delude). В частности,​ при использовании действия CHAOS --delude для всех неиспользуемых портов,​ сканирующий ваши порты злоумышленник получит совершенно неверную информацию о состоянии ваших портов. В случае с CHAOS --tarpit ситуация усугубится еще и «подвисающими» соединениями.
 +
 +
 +===== Таблица raw =====
 +Предназначена для выполнения действий с пакетами до их обработки системой **conntrack**.
 +
 +//​Обратите внимание,​ что в данной таблице не будут срабатывать критерии,​ которым для корректной работы необходим conntrack (это критерии conntrack, connmark, connlimit, connbytes).//​
 +==== Цепочки ====
 +  * **PREROUTING** — в эту цепочку входящие пакеты попадают раньше,​ чем в любую другую из цепочек iptables, и до обработки их системой conntrack.
 +  * **OUTPUT** — аналогично для пакетов,​ сгенерированных самим хостом.
 +==== Действия ====
 +  * **NOTRACK** — позволяет предотвратить обработку пакетов системой conntrack. Разумеется,​ применять его стоит не ко всем пакетам подряд,​ а только к тем, для которых такая обработка не нужна и даже вредна. Например,​ к пакетам,​ к которым впоследствии применяется действие TARPIT (см. выше).
 +  * **CT** — более функциональный инструмент,​ добавленный в версии Linux 2.6.34. Позволяет задать различные настройки conntrack, в соответствии с которыми будет обрабатываться соединение,​ открытое данным пакетом.
 +  * **RAWDNAT** — позволяет выполнять «проброс» адресов и портов «сырым» методом — без использования системы conntrack, то есть без учета состояний соединений. Это действие реализовано в рамках проекта xtables-addons. Применять его можно только в таблице raw. Имеет единственную опцию //​--to-destination адрес[/​маска]//,​ по смыслу аналогичную опции //--to// действия //NETMAP//, то есть при указании маски заменяются только те биты в адресе,​ которые соответствуют единичным битам маски. Биты адреса,​ соответствующие нулевым битам маски, остаются неизменными. При отсутствии маски изменяется весь адрес.
 +
 +//​Отметим,​ что в отличие от действий таблицы nat, которые работают только с соединениями в целом, операции «сырого» преобразования адресов работают только с отдельными пакетами,​ никак не учитывая контекст их передачи. Вышесказанное можно проиллюстрировать,​ скажем,​ таким простым примером:​ для элементарной операции «проброса» внешнего адреса на другой адрес при использовании обычных операций NAT достаточно одного правила//​
 +<code bash>
 +iptables -t nat -A PREROUTING -i eth0 -d 212.201.100.135 -j  DNAT --to-destination 199.181.132.250
 +</​code>​
 +//в то время как для той же операции при использовании «сырых» преобразований необходимо минимум два правила//​
 +<code bash>
 +iptables -t raw -A PREROUTING -i eth0 -d 212.201.100.135 -j  RAWDNAT --to-destination 199.181.132.250
 +iptables -t rawpost -A POSTROUTING -o eth0 -s 199.181.132.250 -j RAWSNAT --to-source 212.201.100.135
 +</​code>​
 +
 +
 +===== Таблица rawpost =====
 +Данная таблица предназначена для выполнения операций «сырого» преобразования адресов (без использования информации о соединениях),​ которые не могут быть реализованы в рамках таблицы **raw**, а именно,​ для операции «сырой» подмены исходного адреса.\\
 +
 +Как и в таблице **raw**, в **rawpost** отсутствует возможность обращения к conntrack, поэтому критерии,​ использующие эту подсистему (conntrack, connmark, connlimit, connbytes), в этой таблице работать не будут.\\
 +
 +Данная таблица реализована в рамках проекта **xtables-addons** и отсутствует в стандартном комплекте iptables/​netfilter.\\
 +
 +==== Цепочки ====
 +  * **POSTROUTING** — обрабатывает весь исходящий трафик.
 +==== Действия ====
 +В таблице rawpost можно использовать действие **RAWSNAT**,​ выполняющее операцию «сырой» подмены исходного адреса. Имеет единственную опцию **--to-source адрес[/​маска]**,​ позволяющую задать новый исходный адрес для обрабатываемых пакетов. Как обычно,​ при наличии маски, в обрабатываемых адресах изменяются только те биты, которые в маске установлены в единицу,​ при отсутствии маски адрес изменяется целиком. Например,​ если по правилу
 +<code bash>
 +iptables -t rawpost -A POSTROUTING -o eth0 -s 10.125.0.0/​16 -d 172.18.1.100 -j RAWSNAT --to-source 192.168.0.20/​16
 +</​code>​
 +будет обработан пакет с исходным адресом 10.125.32.28,​ то этот адрес будет заменен на 192.168.32.28.\\
 +
 +Если же при задании правила маску /16 в параметре **--to-source** опустить,​ адрес будет заменен на 192.168.0.20. Но так лучше не делать,​ потому что мы выполняем трансляцию для всех пакетов из подсети 10.125.0.0/​16,​ и без отслеживания соединений не сможем отличить,​ какие пакеты следует вернуть 10.125.32.28,​ а какие — другим хостам из этой подсети. Сама же операция «возвращения» пакетов требует отдельного RAWDNAT-правила:​
 +<code bash>
 +iptables -t raw -A PREROUTING -i eth0 -s 172.18.1.100 -d 192.168.0.0/​16 -j RAWDNAT --to-destination 10.125.0.0/​16
 +</​code>​
 +которое выполняет обратную подмену,​ заменяя адреса назначения в пакетах-ответах. Таким образом,​ хост 172.18.1.100 будет считать,​ что к нему обращаются хосты из подести 192.168.0.0/​16,​ а вовсе не из 10.125.0.0/​16.\\
 +
 +Для сравнения,​ с использованием stateful-преобразования достаточно одного правила
 +<code bash>
 +iptables -t nat -A POSTROUTING -o eth0 -s 10.125.0.0/​16 -d 172.18.1.100 -j NETMAP --to 192.168.0.0/​16
 +</​code>​
 +которое будет обеспечивать все необходимые преобразования адресов.
 +
 +
 +===== Критерии =====
 +
 +Напоминаем,​ критерий — это логическое выражение,​ определяющее,​ соответствует ли пакет или соединение данному конкретному правилу.\\
 +
 +В одном правиле можно указать несколько критериев. Для того, чтобы пакет был обработан правилом,​ должны выполняться все критерии,​ то есть критерии неявно объединяются логическим AND.\\
 +
 +Также многие критерии и параметры критериев можно инвертировать,​ поставив перед ними восклицательный знак. \\
 +
 +==== Универсальные критерии ====
 +//Под этим термином понимаются критерии,​ применимые ко все пакетам и соединениям,​ независимо от протокола транспортного уровня,​ и не требующие подключения внешних модулей (-m).//\\
 +
 +  * [!] **-p**, ** %%--protocol %%** протокол
 +Позволяет указать протокол транспортного уровня. Наиболее часто употребляются tcp, udp, icmp и all. Протокол также можно указать с помощью номера или названия согласно перечню,​ приведенному в /​etc/​protocols. Значение «любой протокол» можно указать с помощью слова all или числа 0. Если протокол не указан,​ подразумевается «любой протокол».\\
 +
 +При указании протокола становится возможным использовать специфичные для него критерии. Например,​ для TCP и UDP доступны критерии --sport и  %%--dport %%, для ICMP —  %%--icmp-type %%. \\
 +
 +  * [!] **-s**, ** %%--src %%**, ** %%--source %%** //​адрес[/​маска][,​адрес[/​маска]...]//​
 +Определяет адрес отправителя. В качестве адреса может выступать IP-адрес (возможно с маской),​ имя хоста из /etc/hosts, или доменное имя (в последних двух случаях перед добавлением правила в цепочку имя резольвится в IP-адрес). Маска подсети может быть указана в классическом формате (например,​ 255.255.0.0) либо в формате CIDR (например,​ 16)\\
 +
 +//​Начиная с версии iptables 1.4.6, в одном параметре -s можно указывать более одного адреса,​ разделяя адреса запятой. При этом для каждого адреса будет добавлено отдельное правило.//​\\
 +
 +  * [!] **-d**, **%%--dst%%**,​ **%%--destination%%** //​адрес[/​маска][,​адрес[/​маска]...]//​
 +Определяет адрес получателя. Синтаксис аналогичен -s.
 +
 +  * [!] **-i**, **%%---in-interface%%-** //​имя_интерфейса//​
 +Определяет входящий сетевой интерфейс. Если указанное имя интерфейса заканчивается знаком «+» (например,​ tun+), то критерию соответствуют все интерфейсы,​ чьи названия начинаются на указанное имя (для нашего примера tun0, tun1, …). Данный критерий можно использовать в цепочках PREROUTING, INPUT и FORWARD.\\
 +
 +  * [!] **-o**, **%%--out-interface%%** имя_интерфейса
 +Определяет исходящий сетевой интерфейс. Синтаксис аналогичен -i. Критерий можно использовать в цепочках FORWARD, OUTPUT и POSTROUTING. ​
 +
 +==== Критерии,​ специфичные для протоколов ====
 +
 +=== Протоколы транспортного уровня ===
 +
 +== TCP ==
 +
 +  * [!] **%%--sport%%**,​ **%%--source-port%%** //​порт[:​порт]//​ Позволяет указать исходящий порт (или их диапазон). Например,​
 +<code bash>
 +iptables -I INPUT -m conntrack --ctstate NEW -p tcp --sport 0:1023 -j DROP
 +</​code>​
 +
 +  * [!] **%%--dport%%**,​ **%%--destination-port%%** //​порт[:​порт]//​ Позволяет указать порт назначения (или их диапазон). Синтаксис аналогичен %%--sport%%. Например,​
 +<code bash>
 +iptables -I INPUT -p tcp --dport 80 -j ACCEPT
 +</​code>​
 +
 +  * [!] **%%--tcp-flags%%** //​маска установленные_флаги//​ Позволяет указать список установленных и снятых TCP-флагов. В маске перечисляются (через запятую,​ без пробелов) все проверяемые флаги, далее, после пробела,​ перечисляются (также через запятую) те из них, которые должны быть установлены. Все остальные перечисленные в маске флаги должны быть сняты. Возможные флаги: **SYN ACK FIN RST URG PSH**. Также можно использовать псевдофлаги **ALL** и **NONE**, обозначающие «все флаги» и «ни одного флага» соответственно.\\
 +
 +Пример:​
 +<code bash>
 +iptables -I INPUT -p tcp --tcp-flags SYN,​RST,​ACK,​FIN SYN -j LOG --log-level DEBUG --log-prefix "TCP SYN: "
 +</​code>​
 +будет заносить в лог все входящие TCP SYN-пакеты. У обычного SYN-пакета всегда установлен флаг SYN и сняты флаги RST, ACK и FIN.\\
 +
 +Другой пример:​
 +<code bash>
 +iptables -I INPUT -m conntrack --ctstate NEW,INVALID -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT --reject-with tcp-reset
 +</​code>​
 +будет препятствовать спуфингу от нашего имени.
 +
 +  * [!] **%%--syn%%** Позволяет отлавливать **TCP SYN-пакеты** (сокращение для **%%--tcp-flags%% SYN,​RST,​ACK,​FIN SYN**). Так что приведенный выше пример про логгирование SYN-пакетов можно записать в виде
 +<code bash>
 +iptables -I INPUT -p tcp --syn -j LOG --log-level DEBUG --log-prefix "TCP SYN: "
 +</​code>​
 +Более интересный пример:​
 +<code bash>
 +iptables -I INPUT -m conntrack --ctstate NEW -p tcp ! --syn -j DROP
 +</​code>​
 +будет блокировать все попытки открыть входящее TCP-соединение не SYN-пакетом. Попытка установить соединение таким образом может быть либо ошибкой,​ либо атакой.
 +
 +== UDP ==
 +
 +  * [!] **%%--sport%%,​ %%--source-port%%** //​порт[:​порт]//​ Позволяет указать исходящий порт (или их диапазон). Синтаксис и принцип работы аналогичен описанной выше одноименной опции TCP.
 +
 +  * [!] **%%--dport%%,​ %%--destination-port%%** //​порт[:​порт]//​ Позволяет указать входящий порт (или их диапазон). Синтаксис и принцип работы аналогичен описанной выше одноименной опции TCP.
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +**Фрагмент**
 +<code bash>
 +#!/bin/sh
 +
 +IPT=/​sbin/​iptables
 +
 +echo 1 > /​proc/​sys/​net/​ipv4/​conf/​default/​rp_filter
 +echo 1 > /​proc/​sys/​net/​ipv4/​ip_forward
 +
 +$IPT -F -t nat
 +$IPT -X -t nat
 +$IPT -F -t mangle
 +$IPT -X -t mangle
 +$IPT -F -t filter
 +$IPT -X -t filter
 +
 +modprobe ip_conntrack
 +modprobe ip_conntrack_ftp
 +modprobe nf_nat_pptp
 +modprobe nf_conntrack_pptp
 +modprobe nf_conntrack_proto_gre
 +modprobe nf_nat_proto_gre
 +modprobe iptable_nat
 +modprobe ip_nat_ftp
 +modprobe ipt_LOG
 +
 +################################​
 +##         ​Переменные ​        ##
 +################################​
 +
 +IF_P=eth0
 +IF_B=eth1
 +IP_P=10.1.3.164
 +IP_B=10.10.10.1
 +
 +################################​
 +##          Правила ​          ##
 +################################​
 +
 +# Разрешаем всё для интерфейсов обратной связи
 +$IPT -t filter -A INPUT -i lo -j ACCEPT
 +$IPT -t filter -A OUTPUT -o lo -j ACCEPT
 +
 +$IPT -t filter -A INPUT --protocol ​ icmp -j REJECT
 +$IPT -t filter -A OUTPUT --protocol icmp -j ACCEPT
 +
 +$IPT -A OUTPUT -j ACCEPT
 +
 +$IPT -t filter -A INPUT -p tcp -i $IF_P -s 10.1.3.1 -d $IP_P -j ACCEPT
 +
 +$IPT -t nat -A POSTROUTING -p tcp -s 10.10.10.2 -o $IF_P -m multiport --dport 80,443 -j SNAT --to-source $IP_P
 +$IPT -t nat -A POSTROUTING -p udp -s 10.10.10.2 -d 8.8.8.8 -o $IF_P --dport 53 -j SNAT --to-source $IP_P
 +
 +
 +#​Разрешаем установленные сессии
 +$IPT -t filter -A INPUT -m state --state RELATED,​ESTABLISHED -j ACCEPT
 +$IPT -t filter -A OUTPUT -m state --state RELATED,​ESTABLISHED -j ACCEPT
 +
 +#​Запрещаем все что не разрешено
 +$IPT -t filter -A INPUT -p all -j DROP
 +$IPT -t filter -A OUTPUT -p all -j DROP
 +</​code>​
 +
 +http://​151.217.171.219:​6080/​vnc.html?​autoconnect=true&​token=216.26.230.163-5900-vnc
iptables.txt · Последние изменения: 2016/01/29 02:41 — sander