Iptables p forward drop: Настройка iptables для чайников | Losst
Настройка iptables для чайников | Losst
Каждый компьютер, подключенный к сети, находится в потенциальной опасности. В сети очень много угроз начиная от программ, которые будут пытаться любым способом проникнуть в систему и заканчивая хакерами, которые хотят получить доступ к нужному им компьютеру. А программное обеспечение, установленное на компьютере, может содержать еще не известные и неисправленные уязвимости, которые и могут стать дырой в безопасности.
Если для домашних компьютеров это не очень актуально, так как они подключены к сети через роутеры и NAT, которые скрывают их от внешней сети, то для серверов это актуально как никогда. В операционной системе Linux в ядро встроен очень гибкий и надежный фаервол iptables.
Именно с помощью этой программы выполняется защита системы от внешних вторжений, перенаправление портов, а также еще очень много действий с трафиком. Но ее минус в том, что она немного сложна в настройке. В этой статье будет рассмотрена настройка iptables для чайников. Я надеюсь, что после нее вы сможете уверенно пользоваться базовыми возможностями iptables.
Содержание статьи:
Что такое Iptables?
Подсистема iptables и Netfilter уже достаточно давно встроена в ядро Linux. Все сетевые пакеты, которые проходят через компьютер, отправляются компьютером или предназначены компьютеру, ядро направляет через фильтр iptables. Там эти пакеты поддаются проверкам и затем для каждой проверки, если она пройдена выполняется указанное в ней действие. Например, пакет передается дальше ядру для отправки целевой программе, или отбрасывается.
Виды пакетов
Все пакеты делятся на три типа: входящие, исходящие и проходящие. Входящие — это те, которые были отправлены на этот компьютер, исходящие — отправленные из этого компьютера в сеть. А проходящие — это пакеты, которые просто должны быть пересланы дальше, например, если ваш компьютер выступает в качестве маршрутизатора.
Соответственно в фильтре iptables все пакеты делятся на три аналогичные цепочки:
- Input — обрабатывает входящие пакеты и подключения. Например, если какой-либо внешний пользователь пытается подключиться к вашему компьютеру по ssh или любой веб-сайт отправит вам свой контент по запросу браузера. Все эти пакеты попадут в эту цепочку;
- forward — эта цепочка применяется для проходящих соединений. Сюда попадают пакеты, которые отправлены на ваш компьютер, но не предназначены ему, они просто пересылаются по сети к своей цели. Как я уже говорил, такое наблюдается на маршрутизаторах или, например, если ваш компьютер раздает wifi;
- output — эта цепочка используется для исходящих пакетов и соединений. Сюда попадают пакеты, которые были созданы при попытке выполнить ping losst.ru или когда вы запускаете браузер и пытаетесь открыть любой сайт.
Но если вы думаете что можно просто полностью закрыть цепочку Input для увеличения безопасности, то вы очень сильно ошибаетесь. При работе сети используются обе цепочки input и output. Например, вы пытаетесь выполнить ping, данные отправляются через output, но ответ приходит через input. То же самое происходит при просмотре сайтов и других действиях. А вот цепочка forward может вообще не использоваться если ваш компьютер не является маршрутизатором. Так что настройка iptables должна выполняться очень аккуратно.
Правила и действия
Перед тем как перейти к созданию списка правил iptables нужно рассмотреть как они работают и какие бывают. Для каждого типа пакетов можно установить набор правил, которые по очереди будут проверяться на соответствие с пакетом и если пакет соответствует, то применять к нему указанное в правиле действие. Правила образуют цепочку, поэтому input, output и forward называют цепочками, цепочками правил. Действий может быть несколько:
- ACCEPT — разрешить прохождение пакета дальше по цепочке правил;
- DROP — удалить пакет;
- REJECT — отклонить пакет, отправителю будет отправлено сообщение, что пакет был отклонен;
- LOG — сделать запись о пакете в лог файл;
- QUEUE — отправить пакет пользовательскому приложению.
Правила могут проверять любые соответствия, например, по ip, по порту получателя или отправителя, заголовкам пакета и многому другому. Если пакет не подходит ни одному из правил, то к нему применяется действие по умолчанию, обычно ACCEPT.
Когда мы разобрались с правилами, можно вернутся обратно к цепочкам. Кроме перечисленных выше, есть еще две дополнительные цепочки правил:
- prerouting — в эту цепочку пакет попадает перед обработкой iptables, система еще не знает куда он будет отправлен, в input, output или forward;
- postrouting — сюда попадают все проходящие пакеты, которые уже прошли цепочку forward.
Но это еще не все. У нас еще есть таблицы iptables, с которыми тоже желательно разобраться.
Таблицы ipatables
Над цепочками правил в iptables есть еще один уровень абстракции, и это таблицы. В системе есть несколько таблиц, и все они имеют стандартный набор цепочек input, forward и output. Таблицы предназначены для выполнения разных действий над пакетами, например для модификации или фильтрации. Сейчас это для вас не так важно и будет достаточно знать что фильтрация пакетов iptables осуществляется в таблице filter. Но мы рассмотрим их все:
- raw — предназначена для работы с сырыми пакетами, пока они еще не прошли обработку;
- mangle — предназначена для модификации пакетов;
- nat — обеспечивает работу nat, если вы хотите использовать компьютер в качестве маршрутизатора;
- filter — основная таблица для фильтрации пакетов, используется по умолчанию.
С теорией почти все, теперь давайте рассмотрим утилиту командной строки iptables, с помощью которой и выполняется управление системой iptables.
Утилита Iptables
Подсистема iptables и netfilter встроены в ядро, но вот набор утилит для управления всем этим не всегда поставляется вместе с системой. Для установки утилиты в Ubuntu наберите:
sudo apt install iptables
А в дистрибутивах, основанных на Fedora, установка iptables выполняется немного по-другому:
sudo yum install iptables
Когда установка iptables будет завершена, можно переходить к настройке, но давайте сначала рассмотрим синтаксис утилиты. Обычно команда имеет такой общий вид:
$ iptables -t таблица действие цепочка дополнительные_параметры
Теперь давайте рассмотрим параметры iptables, таблица указывает таблицу, с которой нужно работать, этот параметр можно упустить, действие — нужное действие, например, создать или удалить правило, а дополнительные параметры описывают действие и правило, которое нужно выполнить.
Осталось рассмотреть основные действия, которые позволяет выполнить iptables:
- -A — добавить правило в цепочку;
- -С — проверить все правила;
- -D — удалить правило;
- -I — вставить правило с нужным номером;
- -L — вывести все правила в текущей цепочке;
- -S — вывести все правила;
- -F — очистить все правила;
- -N — создать цепочку;
- -X — удалить цепочку;
- -P — установить действие по умолчанию.
Дополнительные опции для правил:
- -p — указать протокол, один из tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp,
mh; - -s — указать ip адрес устройства-отправителя пакета;
- -d — указать ip адрес получателя;
- -i — входной сетевой интерфейс;
- -o — исходящий сетевой интерфейс;
- -j — выбрать действие, если правило подошло.
Теперь вы можем перейти рассмотрению примеров того как выполняется настройка iptables.
Примеры настройки Iptables
Мы рассмотрим несколько основных примеров, чтобы вы смогли закрепить все прочитанное выше.
Список правил
Сначала давайте рассмотрим как выполняется просмотр правил iptables, для этого достаточно опции -L:
iptables -L
Также вы можете указать нужную цепочку, чтобы вывести правила только для нее:
iptables -L INPUT
Очистка правил
Вы не можете просто так отключить iptables остановив сервис обновления правил iptables через systemd или даже удалив набор утилит для настройки. Подсистема работает на уровне ядра и не зависит от того, что там у вас установлено. Поэтому если сделаете что-то не так, то нужно будет очистить правила. Для этого выполните:
sudo iptables -F
Или только для определенной цепочки:
sudo iptables -F Input
Напоминаю, что все эти действия выполняются для таблицы по умолчанию — filter.
Правила по умолчанию
Как я уже говорил, если для пакета не подходит ни одно правило, то для него применяется действие по умолчанию. Его можно задать с помощью опции -p:
sudo iptables -p INPUT ACCEPT
$ sudo iptables -p OUTPUT ACCEPT
$ sudo iptables -p FORWARD DROP
В этом примере мы разрешаем цепочки INPUT и OUTPUT, но запрещаем FORWARD.
sudo iptables -L
Блокировка пакетов
Для блокировки пакетов мы можем использовать действие DROP, фильтровать пакеты, которые нужно заблокировать мы можем по множеству критериев, например, протоколу, ip адресу, маске сети, порту и многому другому.
Вот так будет выглядеть команда, которая позволяет добавить правило iptables для блокировки всех входящих пакетов от 10.10.10.10:
sudo iptables -A INPUT -s 10.10.10.10 -j DROP
А теперь исходящие пакеты на этот же адрес:
sudo iptables -A OUTPUT -s 10.10.10.10 -j DROP
Блокировка диапазона ip выполняется подобным образом. Для этого нужно использовать маску сети 10.10.10.0/24. Это будут все адреса начиная от 10.10.10.0 до 10.10.10.255:
sudo iptables -A INPUT -s 10.10.10.0/24 -j DROP
Или расширенный вариант маски:
sudo iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP
Также вы можете заблокировать все входящие соединения ssh:
sudo iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP
Как видите, добавить правило iptables очень просто.
Удаление правил
Удаление правил iptables выполняется точно так же, как и создание новых, только вместо опции A нужно использовать опцию D. Сначала смотрим список правил:
sudo iptables -L
Например, вот так можно удалить правило iptables, которое было создано вторым:
sudo iptables -A OUTPUT -s 10.10.10.10 -j DROP
Также вы можете полностью очистить iptables выполнив команду с опцией -F:
sudo iptables -F
Сохранить правила Iptables
Все настройки iptables, которые вы указали с помощью этих команд сохранятся только до перезагрузки. После перезагрузки компьютера все изменения будут стерты. Поэтому чтобы сохранить правила iptables, нужно выполнить специальную команду. Только в разных дистрибутивах она отличается. В Ubuntu выполните:
sudo /sbin/iptables-save
А в Red Hat или CentOS:
sudo /sbin/service iptables save
Выводы
Вот и все. Наша статья о том, как выполняется настройка iptables для чайников подошла к концу. Эта система действительно сложна, на первый взгляд, но если разобраться, то с помощью нее возможно делать очень интересные вещи. В этой статье была рассмотрены основы использования iptables, в следующих статьях мы более подробно остановимся на практическом применении.
На завершение видео о том, как увеличить безопасность вашего сервера:
Оцените статью:
Загрузка…
Основы iptables на примере Debian глазами младенца / Песочница / Хабр
О чем же пойдёт речь
Всё очень просто, в очередной раз объясняя на форуме новичкам в мире Linux, что да как я понял, что на просторах интернет не найти собранную воедино статью с объяснением не только настройки iptables, но и некоторых сетевых основ.
Так что вашему вниманию я представляю небольшой экскурс по настройке firewall в Linux. Углубимся лишь в настройку netfilter/iptables, остальных прикладных вопросов мы несомненно тоже коснёмся, ведь нам не хватает именно комплексных ответов на наши вопросы… И я постараюсь ка можно более доходчиво здесь все изложить.
Как это выглядит
Мы будем рассматривать типичную схему для офисов и для квартир, да-да именно квартир! Мало у кого есть собственный маленький сервачок дома под столом, но у большинства интернет дома раздается через роутер и в большинстве своём они тоже прошиты Linux.
Это типичная схема малого офиса. Когда к интернет подключен 1 компьютер(сервер), а остальные подключаются к интернет уже через этот сервер.
Поехали, потихонечку…
И так что же мы имеем:
- сервер с 2мя сетевыми картами и установленным на нём Debian Lenny
- имеющийся по умолчанию в Debian Lenny firewall — netfilter/iptables
- локальную сеть из N компьютеров, все соединены через коммутатор, в том числе и сервер
что такое NAT
Для начала нам нужно понять, что настраивать мы будем самый обыкновенный NAT(Network Address Translation). Для жаждущих, я в конце упомяну и о проксе сервере на примере squid. Как я уже сказал разжёвывать будем практически всё.
Что же такое NAT? На самом деле все просто, все компьютеры имеют физический (MAC) и сетевой (IP) адреса. Нас в данный момент интересуют IP адреса. IP адрес в пределах одной сети должен быть уникальным! А при нынешнем стандарте IPv4 уникальными могут быть всего-то 4 294 967 296 (232), что совсем не много и они практически кончились. но не переживайте вот вот вступит в широкое распространение IPv6, а там адресов навалом!
Но тут вы можете заметить, компьютеров значительно больше того числа, что позволяет IPv4 или скажете, что у друга дома такой же адрес как и у вас! И вот тут-то и заходит речь о NAT — он позволяет соединять компьютерные сети между собой используя единственный, свой IP адрес, действия фаервола при этом называется SNAT(Source NAT или подмена адреса источника). Т.е. в 99% случаев вся ваша контора выходит в интернет под 1 IP адресом, при этом внутри офиса у каждого он свой. О классах IP адресов вы сможете прочесть в интерне.
Теперь, когда мы знаем что такое NAT и для чего он нужен, можно приступать непосредственно к настройке сервера.
транзитный трафик
Все команды выполняются от имени root(суперпользователь). В Debian по умолчанию отключен так называемый транзитный трафик, т.е. по умолчанию предусмотрена работа только как единичная машина. Как вы уже догадались, без транзитного трафика нету и NAT. Для его включения достаточно изменить 1 цифру — $ echo 1 > /proc/sys/net/ipv4/ip_forward, но данная настройка слетит после перезагрузки, так что лучше поправить конфиг — $ nano /etc/sysctl.conf далее ищем строчку #net.ipv4.ip_forward=1 и убираем «решётку»(символ комментария) в начале строки и проверяем что значения равно 1! Теперь можно приступать непосредственно к конфигурированию iptables.
настраиваем iptables
В интернет, есть много статей о том как писать правила в iptables и что с их помощью можно творить, наиболее полным и приятным для чтения мне показалась статья на wikipedia.org.
И так приступим. Для начала очистим таблицы от лишних правил, вдруг там что было лишнего…
$ iptables -F
$ iptables -t nat -F
$ iptables -t mangle -F
Лишнее почистили. Очень важно понять и помнить, что правила в iptables применяются иерархически, т.е. правило стоящее выше выполнится раньше. Все цепочки по умолчанию имеют политику ACCEPT — разрешают всё. что не попало под правила данной цепочки.
Условимся, что интерфейс смотрящий в локальную сеть — eth0, а в интернет — eth2, локальная сеть имеет адреса 192.168.0.0/24, а провайдер выдал нам статический адрес 10.188.106.33(пускай и не «белый» — о типах ip адресов вы также можете посмотреть в интернет). И так пишем:
$ iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -j ACCEPT
$ iptables -A FORWARD -i eth2 -o eth0 -d 192.168.0.0/24 -j ACCEPT
$ iptables -P FORWARD DROP
тем самым разрешили ходить транзитным пакетам через firewall для нашего диапазона ip адресов, а всё остальное запрещаем.
Теперь сам NAT:
$ iptables -A POSTROUTING -s 192.168.0.0/24 -o eth2 -j SNAT —to-source 10.188.106.33
Этого достаточно для того что бы у вас заработал NAT.
по мелочам…
На клиентах указываем ip из выбранного диапазона и указываем в качестве шлюза ip адрес нашего сервера(обычно его назначают первым из подсети — я оставлю это на ваше усмотрение). Все сетевые настройки на сервере можно провести так:
$ nano /etc/network/interfaces в нём указываются настройки ваших сетевых интерфейсов.
доступ в недры сети через шлюз или DNAT
И тут вы поняли, что в сети у вас есть Windows Server к которому у вас всегда был простой доступ по RDP, а тут вылез это назойливый шлюз на Debian! Всё очень просто — надо всего лишь добавить DNAT правило в наш iptables.
Что за зверь DNAT? DNAT (Destination NAT или подмена адреса получателя) — сетевые карты работают в таком режиме, что они принимают только пакеты адресованные именно им, а зайти на наш сервер если ip под которым он выходит в интернет сидят еще десяток машин в вашем офисе? Как запрос дойдёт именного до него? На самом деле все запросы такого рода упираются в наш шлюз. И всё что нам надо сделать это задать правила для работы с такими пакетами.
$ iptables -A PREROUTING -i eth2 -p tcp -m tcp —dport 3389 -j DNAT —to-destination 192.168.0.2
Это простое правило будет переадресовывать все пакеты приходящие на шлюз из интернет на порт TCP 3389(именно его использует RDP протокол) на ваш внутренний Windows Server. И, вуаля, у вас все работает.
итак что там с любимым squid
И хотя сейчас все работает, у всех есть интернет и все работает, некоторым всё же нужен прокси сервер. Я не буду рассказывать о настройке squid, я покажу правило которое позволит сделать его «прозрачным». В сквид надо лишь прописать волшебное слово transparent в нужном месте и он начнём корректно обрабатывать свалившееся на него запросы.
Пишем $ iptables -A PREROUTING -d! 192.168.0.0/24 -i eth0 -p tcp -m multiport —dports 80,443 -j REDIRECT —to-ports 3128 .
И что же нам это даёт? Теперь все запросы на web страницы с ваших рабочих мест по http((80) и https(443) протоколам будут перенаправляться на порт который слушает squid. Вы получает контентную фильтрацию, информацию о том кто где был и что делал в интернет, пользователь ни чего не подозревая работает как и раньше…
немного безопасности
Следует хоть минимально защитить свой шлюз поэтому добавим еще пару правил
$ iptables -A INPUT -i lo -j ACCEPT
$ iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j ACCEPT
$ iptables -A INPUT -i eth2 -m conntrack —ctstate RELATED,ESTABLISHED -j ACCEPT
$ iptables -P INPUT DROP
Тем самым запретили любое общение непосредственно с шлюзом, кроме уже установленных соединений, т.е. те что были инициированы вами и вы просто получаете на них ответы. Не бойтесь наш DNAT до этих правил просто не доходит…
почему так мало?
Статья не резиновая и обо всем все-равно не расскажешь… Я привел минимальный набор действий и понятий что бы вы могли начать осваивать такую махину как шлюз на Linux. Здесь можно говорить очень и очень долго, обсуждая многие аспекты и возможности netfilter.
Итого
Как мы видим все действительно просто! Главное это понять принцип функционирования сети и не боятся настраивать и читать большие мануалы.
Надеюсь мне удалось собрать воедино информацию достаточную для начала вашей дружбы с программными маршрутизаторами на основе Linux.
Настройка iptables в примерах | Блог любителя экспериментов
Приветствую всех! В продолжении теории iptables публикую данную практическую статью о сетевом фильтре Linux. В статье рассмотрю типовые примеры реализации правил iptables в Linux, а так же рассмотрим способы сохранения созданной конфигурации iptables.
Настройка netfilter/iptables для рабочей станции
Давайте начнем с элементарной задачи — реализация сетевого экрана Linux на десктопе. В большинстве случаев на десктопных дистрибутивах линукса нет острой необходимости использовать файервол, т.к. на таких дистрибутивах не запущены какие-либо сервисы, слушающие сетевые порты, но ради профилактики организовать защиту не будет лишним. Ибо ядро тоже не застраховано от дыр. Итак, мы имеем Linux, с настроенным сетевым интерфейсом eth0, не важно по DHCP или статически…
Для настройки сетевого экрана я стараюсь придерживаться следующей политики: запретить все, а потом то, что нужно разрешить. Так и поступим в данном случае. Если у вас свежеустановленная система и вы не пытались настроить на ней сетевой фильтр, то правила будут иметь примерно следующую картину:
netfilter:~# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Это значит, что политика по умолчанию для таблицы filter во всех цепочках — ACCEPT и нет никаких других правил, что-либо запрещающих. Поэтому давайте сначала запретим ВСЁ входящие, исходящие и проходящие пакеты (не вздумайте это делать удаленно-тут же потеряете доступ):
netfilter:~# iptables -P INPUT DROP netfilter:~# iptables -P OUTPUT DROP netfilter:~# iptables -P FORWARD DROP
Этими командами мы устанавливаем политику DROP по умолчанию. Это значит, что любой пакет, для которого явно не задано правило, которое его разрешает, автоматически отбрасывается. Поскольку пока еще у нас не задано ни одно правило — будут отвергнуты все пакеты, которые придут на ваш компьютер, равно как и те, которые вы попытаетесь отправить в сеть. В качестве демонстрации можно попробовать пропинговать свой компьютер через интерфейс обратной петли:
netfilter:~# ping -c2 127.0.0.1 PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. ping: sendmsg: Operation not permitted ping: sendmsg: Operation not permitted --- localhost ping statistics --- 2 packets transmitted, 0 received, 100% packet loss, time 1004ms
На самом деле это полностью не функционирующая сеть и это не очень хорошо, т.к. некоторые демоны используют для обмена между собой петлевой интерфейс, который после проделанных действий более не функционирует. Это может нарушить работу подобных сервисов. Поэтому в первую очередь в обязательно разрешим передачу пакетов через входящий петлевой интерфейс и исходящий петлевой интерфейс в таблицах INPUT (для возможности получения отправленных пакетов) и OUTPUT (для возможности отправки пакетов) соответственно. Итак, обязательно выполняем:
netfilter:~# iptables -A INPUT -i lo -j ACCEPT netfilter:~# iptables -A OUTPUT -o lo -j ACCEPT
После этого пинг на локалхост заработает:
netfilter:~# ping -c1 127.0.0.1 PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1 (127.0.0.1): icmp_seq=1 ttl=64 time=0.116 ms --- 127.0.0.1 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 116ms rtt min/avg/max/mdev = 0.116/0.116/0.116/0.116 ms
Если подходить к настройке файервола не шибко фанатично, то можно разрешить работу протокола ICMP:
netfilter:~# iptables -A INPUT -p icmp -j ACCEPT netfilter:~# iptables -A OUTPUT -p icmp -j ACCEPT
Более безопасно будет указать следующую аналогичную команду iptables:
netfilter:~# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT netfilter:~# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT netfilter:~# iptables -A OUTPUT -p icmp -j ACCEPT
Данная команда разрешит типы ICMP пакета эхо-запрос и эхо-ответ, что повысит безопасность.
Зная, что наш комп не заражен (ведь это так?) и он устанавливает только безопасные исходящие соединения. А так же, зная, что безопасные соединения — это соединения из т.н. эфимерного диапазона портов, который задается ядром в файле /proc/sys/net/ipv4/ip_local_port_range, можно разрешить исходящие соединения с этих безопасных портов:
netfilter:~# cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000 netfilter:~# iptables -A OUTPUT -p TCP --sport 32768:61000 -j ACCEPT netfilter:~# iptables -A OUTPUT -p UDP --sport 32768:61000 -j ACCEPT
Если подходить к ограничению исходящих пакетов не параноидально, то можно было ограничиться одной командой iptables, разрешающей все исхолящие соединения оп всем протоколам и портам:
netfilter:~# iptables -A OUTPUT -j ACCEPT netfilter:~# # или просто задать политику по умолчанию ACCEPT для цепочки OUTPUT netfilter:~# iptables -P OUTPUT ACCEPT
Далее, зная что в netfilter сетевые соединения имеют 4 состояния (NEW, ESTABLISHED, RELATED и INVALID) и новые исходящие соединения с локального компьютера (с состоянием NEW) у нас разрешены в прошлых двух командах iptables, что уже установленные соединения и дополнительные имеют состояния ESTABLISHED и RELATED, соответственно, а так же зная, что входящие соединения к локальной системе приходят через цепочку INPUT, можно разрешить попадание на наш компьютер только тех TCP- и UDP-пакетов, которые были запрошены локальными приложениями:
netfilter:~# iptables -A INPUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT netfilter:~# iptables -A INPUT -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT
Это собственно, все! Если на десктопе все же работает какая-то сетевая служба, то необходимо добавить соответствующие правила для входящих соединений и для исходящих. Например, для работы ssh-сервера, который принимает и отправляет запросы на 22 TCP-порту, необходимо добавить следующие iptables-правила:
netfilter:~# iptables -A INPUT -i eth0 -p TCP --dport 22 -j ACCEPT netfilter:~# iptables -A OUTPUT -o eth0 -p TCP --sport 22 -j ACCEPT
Т.е. для любого сервиса нужно добавить по одному правилу в цепочки INPUT и OUTPUT, разрешающему соответственно прием и отправку пакетов с использованием этого порта для конкретного сетевого интерфейса (если интерфейс не указывать, то будет разрешено принимать/отправлять пакеты по любому интерфейсу).
Настройка netfilter/iptables для подключения нескольких клиентов к одному соединению.
Давайте теперь рассмотрим наш Linux в качестве шлюза для локальной сети во внешнюю сеть Internet. Предположим, что интерфейс eth0 подключен к интернету и имеет IP 198.166.0.200, а интерфейс eth2 подключен к локальной сети и имеет IP 10.0.0.1. По умолчанию, в ядре Linux пересылка пакетов через цепочку FORWARD (пакетов, не предназначенных локальной системе) отключена. Чтобы включить данную функцию, необходимо задать значение 1 в файле /proc/sys/net/ipv4/ip_forward:
netfilter:~# echo 1 > /proc/sys/net/ipv4/ip_forward
Чтобы форвардинг пакетов сохранился после перезагрузки, необходимо в файле /etc/sysctl.conf раскомментировать (или просто добавить) строку net.ipv4.ip_forward=1.
Итак, у нас есть внешний адрес (198.166.0.200), в локальной сети имеется некоторое количество гипотетических клиентов, которые имеют адреса из диапазона локальной сети и посылают запросы во внешнюю сеть. Если эти клиенты будут отправлять во внешнюю сеть запросы через шлюз «как есть», без преобразования, то удаленный сервер не сможет на них ответить, т.к. обратным адресом будет получатель из «локальной сети». Для того, чтобы эта схема корректно работала, необходимо подменять адрес отправителя, на внешний адрес шлюза Linux. Это достигается за счет действия MASQUERADE (маскарадинг) в цепочке POSTROUTING, в таблице nat.
netfilter:~# iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT netfilter:~# iptables -A FORWARD -m conntrack --ctstate NEW -i eth2 -s 10.0.0.1/24 -j ACCEPT netfilter:~# iptables -P FORWARD DROP netfilter:~# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Итак, по порядку сверху-вниз мы разрешаем уже установленные соединения в цепочке FORWARD, таблице filter, далее мы разрешаем устанавливать новые соединения в цепочке FORWARD, таблице filter, которые пришли с интерфейса eth2 и из сети 10.0.0.1/24. Все остальные пакеты, которые проходят через цепочку FORWARD — отбрасывать. Далее, выполняем маскирование (подмену адреса отправителя пакета в заголовках) всех пакетов, исходящих с интерфейса eth0.
Примечание. Есть некая общая рекомендация: использовать правило -j MASQUERADE для интерфейсов с динамически получаемым IP (например, по DHCP от провайдера). При статическом IP, -j MASQUERADE можно заменить на аналогичное -j SNAT —to-source IP_интерфейса_eth0. Кроме того, SNAT умеет «помнить» об установленных соединениях при кратковременной недоступности интерфейса. Сравнение MASQUERADE и SNAT в таблице:
Кроме указанных правил так же можно нужно добавить правила для фильтрации пакетов, предназначенных локальному хосту — как описано в прошлом разделе. То есть добавить запрещающие и разрешающие правила для входящих и исходящих соединений:
netfilter:~# iptables -P INPUT DROP netfilter:~# iptables -P OUTPUT DROP netfilter:~# iptables -A INPUT -i lo -j ACCEPT netfilter:~# iptables -A OUTPUT -o lo -j ACCEPT netfilter:~# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT netfilter:~# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT netfilter:~# iptables -A OUTPUT -p icmp -j ACCEPT netfilter:~# cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000 netfilter:~# iptables -A OUTPUT -p TCP --sport 32768:61000 -j ACCEPT netfilter:~# iptables -A OUTPUT -p UDP --sport 32768:61000 -j ACCEPT netfilter:~# iptables -A INPUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT netfilter:~# iptables -A INPUT -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT
В результате, если один из хостов локальной сети, например 10.0.0.2, попытается связаться с одним из интернет-хостов, например, 93.158.134.3 (ya.ru), при проходе его пакетов через шлюз, их исходный адрес будет подменяться на внешний адрес шлюза в цепочке POSTROUTING таблице nat, то есть исходящий IP 10.0.0.2 будет заменен на 198.166.0.200. С точки зрения удаленного хоста (ya.ru), это будет выглядеть, как будто с ним связывается непосредственно сам шлюз. Когда же удаленный хост начнет ответную передачу данных, он будет адресовать их именно шлюзу, то есть 198.166.0.200. Однако, на шлюзе адрес назначения этих пакетов будет подменяться на 10.0.0.2, после чего пакеты будут передаваться настоящему получателю в локальной сети. Для такого обратного преобразования никаких дополнительных правил указывать не нужно — это будет делать все та же операция MASQUERADE, которая помнит какой хост из локальной сети отправил запрос и какому хосту необходимо вернуть пришедший ответ.
Примечание: желательно негласно принято, перед всеми командами iptables очищать цепочки, в которые будут добавляться правила:
netfilter:~# iptables -F ИМЯ_ЦЕПОЧКИ
Предоставление доступа к сервисам на шлюзе
Предположим, что на нашем шлюзе запущен некий сервис, который должен отвечать на запросы поступающие из сети интернет. Допустим он работает на некотором TCP порту nn. Чтобы предоставить доступ к данной службе, необходимо модифицировать таблицу filter в цепочке INPUT (для возможности получения сетевых пакетов, адресованных локальному сервису) и таблицу filter в цепочке OUTPUT (для разрешения ответов на пришедшие запросы).
Итак, мы имеем настроенный шлюз, который маскарадит (заменяет адрес отправителя на врешний) пакеты во внешнюю сеть. И разрешает принимать все установленные соединения. Предоставление доступа к сервису будет осуществляться с помощью следующих разрешающих правил:
netfilter:~# iptables -A INPUT -p TCP --dport nn -j ACCEPT netfilter:~# iptables -A OUTPUT -p TCP --sport nn -j ACCEPT
Данные правила разрешают входящие соединения по протоколу tcp на порт nn и исходящие соединения по протоколу tcp с порта nn. Кроме этого, можно добавить дополнительные ограничивающие параметры, например разрешить входящие соединения только с внешнего интерфейса eth0 (ключ -i eth0) и т.п.
Предоставление доступа к сервисам в локальной сети
Предположим, что в нашей локальной сети имеется какой-то хост с IP X.Y.Z.1, который должен отвечать на сетевые запросы из внешней сети на TCP-порту xxx. Для того чтобы при обращении удаленного клиента ко внешнему IP на порт xxx происходил корректный ответ сервиса из локальной сети, необходимо направить запросы, приходящие на внешний IP порт xxx на соответствующий хост в локальной сети. Это достигается модификацией адреса получателя в пакете, приходящем на указанный порт. Это действие называется DNAT и применяется в цепочке PREROUTING в таблице nat. А так же разрешить прохождение данный пакетов в цепочке FORWARD в таблице filter.
Опять же, пойдем по пути прошлого раздела. Итак, мы имеем настроенный шлюз, который маскарадит (заменяет адрес отправителя на врешний) пакеты во внешнюю сеть. И разрешает принимать все установленные соединения. Предоставление доступа к сервису будет осуществляться с помощью следующих разрешающих правил:
netfilter:~# iptables -t nat -A PREROUTING -p tcp -d 198.166.0.200 --dport xxx -j DNAT --to-destination X.Y.Z.1 netfilter:~# iptables -A FORWARD -i eth0 -p tcp -d X.Y.Z.1 --dport xxx -j ACCEPT
Сохранение введенных правил при перезагрузке
Все введенные в консоли правила — после перезагрузки ОС будут сброшены в первоначальное состояние (читай — удалены). Для того чтобы сохранить все введенные команды iptables, существует несколько путей. Например, один из них — задать все правила брандмауэра в файле инициализации rc.local. Но у данного способа есть существенный недостаток: весь промежуток времени с запуска сетевой подсистемы, до запуска последней службы и далее скрипта rc.local из SystemV операционная система будет не защищена. Представьте ситуацию, например, если какая-нибудь служба (например NFS) стартует последней и при ее запуске произойдет какой-либо сбой и до запуска скрипта rc.local. Соответственно, rc.local так и не запуститься, а наша система превращается в одну большую дыру.
Поэтому самой лучшей идеей будет инициализировать правила netfilter/iptables при загрузке сетевой подсистемы. Для этого в Debian есть отличный инструмент — каталог /etc/network/if-up.d/, в который можно поместить скрипты, которые будут запускаться при старте сети. А так же есть команды iptables-save и iptables-restore, которые сохраняют создают дамп правил netfilter из ядра на стандартный вывод и восстанавливают в ядро правила со стандартного ввода соответственно.
Итак, алгоритм сохранения iptables примерно следующий:
- Настраиваем сетевой экран под свои нужны с помощью команды iptables
- создаем дамп созданный правил с помощью команды iptables-save > /etc/iptables.rules
- создаем скрипт импорта созданного дампа при старте сети (в каталоге /etc/network/if-up.d/) и не забываем его сделать исполняемым:
# cat /etc/network/if-up.d/firewall #!/bin/bash /sbin/iptables-restore < /etc/iptables.rules exit 0 # chmod +x /etc/network/if-up.d/firewall
Дамп правил, полученный командой iptables-save имеет текстовый формат, соответственно пригоден для редактирования. Синтаксис вывода команды iptables-save следующий:
# Generated by iptables-save v1.4.5 on Sat Dec 24 22:35:13 2011 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] ....... # комментарий -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT ........... -A FORWARD -j REJECT COMMIT # Completed on Sat Dec 24 22:35:13 2011 # Generated by iptables-save v1.4.5 on Sat Dec 24 22:35:13 2011 *raw ...... COMMIT
Строки, начинающиеся на # — комментарии, строки на * — это название таблиц, между названием таблицы и словом COMMIT содержатся параметры, передаваемые команде iptables. Параметр COMMIT — указывает на завершение параметров для вышеназванной таблицы. Строки, начинающиеся на двоеточие задают цепочки, в которых содержится данная таблица в формате:
:цепочка политика [пакеты:байты]
где цепочка — имя цепочки, политика — политика цепочки по-умолчанию для данной таблицы, а далее счетчики пакетов и байтов на момент выполнения команды.
В RedHat функции хранения команд iptables выполняемых при старте и останове сети выполняет файл /etc/sysconfig/iptables. А управление данным файлом лежит на демоне iptables.
Как еще один вариант сохранения правил, можно рассмотреть использование параметра up в файле /etc/network/interfaces с аргументом в виде файла, хранящего команды iptables, задающие необходимые правила.
Итог
На сегодня будет достаточно. Более сложные реализации межсетевого экрана я обязательно будут публиковаться в следующих статьях.
С Уважением, Mc.Sim!
Другие материалы в категории Linux
Теги: ip, Linux, netfilter, network, UNIX
21 пример использования iptables для администраторов.
Файрвол в системе linux контролируется программой iptables (для ipv4) и ip6tables (для ipv6). В данной шпаргалке рассмотрены самые распространённые способы использования iptables для тех, кто хочет защитить свою систему от взломщиков или просто разобраться в настройке.
Знак # означает, что команда выполняется от root. Откройте заранее консоль с рутовыми правами — sudo -i
в Debian-based системах или su
в остальных.
1. Показать статус.
# iptables -L -n -v
Примерный вывод команды для неактивного файрвола:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Для активного файрвола:
Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID 394 43586 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 93 17292 ACCEPT all -- br0 * 0.0.0.0/0 0.0.0.0/0 1 142 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- br0 br0 0.0.0.0/0 0.0.0.0/0 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID 0 0 TCPMSS tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x06/0x02 TCPMSS clamp to PMTU 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 wanin all -- vlan2 * 0.0.0.0/0 0.0.0.0/0 0 0 wanout all -- * vlan2 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- br0 * 0.0.0.0/0 0.0.0.0/0 Chain OUTPUT (policy ACCEPT 425 packets, 113K bytes) pkts bytes target prot opt in out source destination Chain wanin (1 references) pkts bytes target prot opt in out source destination Chain wanout (1 references) pkts bytes target prot opt in out source destination
Где:
-L : Показать список правил.
-v : Отображать дополнительную информацию. Эта опция показывает имя интерфейса, опции, TOS маски. Также отображает суффиксы ‘K’, ‘M’ or ‘G’.
-n : Отображать IP адрес и порт числами (не используя DNS сервера для определения имен. Это ускорит отображение).
2. Отобразить список правил с номерами строк.
# iptables -n -L -v --line-numbers
Примерный вывод:
Chain INPUT (policy DROP) num target prot opt source destination 1 DROP all -- 0.0.0.0/0 0.0.0.0/0 state INVALID 2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 4 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy DROP) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 2 DROP all -- 0.0.0.0/0 0.0.0.0/0 state INVALID 3 TCPMSS tcp -- 0.0.0.0/0 0.0.0.0/0 tcp flags:0x06/0x02 TCPMSS clamp to PMTU 4 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 5 wanin all -- 0.0.0.0/0 0.0.0.0/0 6 wanout all -- 0.0.0.0/0 0.0.0.0/0 7 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 Chain OUTPUT (policy ACCEPT) num target prot opt source destination Chain wanin (1 references) num target prot opt source destination Chain wanout (1 references) num target prot opt source destination
Вы можете использовать номера строк для того, чтобы добавлять новые правила.
3. Отобразить INPUT или OUTPUT цепочки правил.
# iptables -L INPUT -n -v
# iptables -L OUTPUT -n -v --line-numbers
4. Остановить, запустить, перезапустить файрвол.
Силами самой системы:# service ufw stop
# service ufw start
Можно также использовать команды iptables для того, чтобы остановить файрвол и удалить все правила:# iptables -F
# iptables -X
# iptables -t nat -F
# iptables -t nat -X
# iptables -t mangle -F
# iptables -t mangle -X
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT
Где:
-F : Удалить (flush) все правила.
-X : Удалить цепочку.
-t table_name : Выбрать таблицу (nat или mangle) и удалить все правила.
-P : Выбрать действия по умолчанию (такие, как DROP, REJECT, или ACCEPT).
5. Удалить правила файрвола.
Чтобы отобразить номер строки с существующими правилами:# iptables -L INPUT -n --line-numbers
# iptables -L OUTPUT -n --line-numbers
# iptables -L OUTPUT -n --line-numbers | less
# iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1
Получим список IP адресов. Просто посмотрим на номер слева и удалим соответствующую строку. К примеру для номера 3:# iptables -D INPUT 3
Или найдем IP адрес источника (202.54.1.1) и удалим из правила:# iptables -D INPUT -s 202.54.1.1 -j DROP
Где:
-D : Удалить одно или несколько правил из цепочки.
6. Добавить правило в файрвол.
Чтобы добавить одно или несколько правил в цепочку, для начала отобразим список с использованием номеров строк:# iptables -L INPUT -n --line-numbers
Примерный вывод:
Chain INPUT (policy DROP) num target prot opt source destination 1 DROP all -- 202.54.1.1 0.0.0.0/0 2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state NEW,ESTABLISHED
Чтобы вставить правило между 1 и 2 строкой:# iptables -I INPUT 2 -s 202.54.1.2 -j DROP
Проверим, обновилось ли правило:# iptables -L INPUT -n --line-numbers
Вывод станет таким:
Chain INPUT (policy DROP) num target prot opt source destination 1 DROP all -- 202.54.1.1 0.0.0.0/0 2 DROP all -- 202.54.1.2 0.0.0.0/0 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state NEW,ESTABLISHED
7. Сохраняем правила файрвола.
Через iptables-save:# iptables-save > /etc/iptables.rules
8. Восстанавливаем правила.
Через iptables-restore# iptables-restore
9. Устанавливаем политики по умолчанию.
Чтобы сбрасывать весь трафик:# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -P FORWARD DROP
# iptables -L -v -n
После вышеперечисленных команд ни один пакет не покинет данный хост.# ping google.com
10. Блокировать только входящие соединения.
Чтобы сбрасывать все не инициированные вами входящие пакеты, но разрешить исходящий трафик:# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -L -v -n
Пакеты исходящие и те, которые были запомнены в рамках установленных сессий — разрешены.# ping google.com
11. Сбрасывать адреса изолированных сетей в публичной сети.
# iptables -A INPUT -i eth2 -s 192.168.0.0/24 -j DROP
# iptables -A INPUT -i eth2 -s 10.0.0.0/8 -j DROP
Список IP адресов для изолированных сетей:
10.0.0.0/8 -j (A)
172.16.0.0/12 (B)
192.168.0.0/16 (C)
224.0.0.0/4 (MULTICAST D)
240.0.0.0/5 (E)
127.0.0.0/8 (LOOPBACK)
12. Блокировка определенного IP адреса.
Чтобы заблокировать адрес взломщика 1.2.3.4:# iptables -A INPUT -s 1.2.3.4 -j DROP
# iptables -A INPUT -s 192.168.0.0/24 -j DROP
13. Заблокировать входящие запросы порта.
Чтобы заблокировать все входящие запросы порта 80:# iptables -A INPUT -p tcp --dport 80 -j DROP
# iptables -A INPUT -i eth2 -p tcp --dport 80 -j DROP
Чтобы заблокировать запрос порта 80 с адреса 1.2.3.4:# iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP
# iptables -A INPUT -i eth2 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP
14. Заблокировать запросы на исходящий IP адрес.
Чтобы заблокировать определенный домен, узнаем его адрес:# host -t a facebook.com
Вывод: facebook.com has address 69.171.228.40
Найдем CIDR для 69.171.228.40:# whois 69.171.228.40 | grep CIDR
Вывод:
CIDR: 69.171.224.0/19
Заблокируем доступ на 69.171.224.0/19:# iptables -A OUTPUT -p tcp -d 69.171.224.0/19 -j DROP
Также можно использовать домен для блокировки:# iptables -A OUTPUT -p tcp -d www.fаcebook.com -j DROP
# iptables -A OUTPUT -p tcp -d fаcebook.com -j DROP
15. Записать событие и сбросить.
Чтобы записать в журнал движение пакетов перед сбросом, добавим правило:
# iptables -A INPUT -i eth2 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth2 -s 10.0.0.0/8 -j DROP
Проверим журнал (по умолчанию /var/log/messages):# tail -f /var/log/messages
# grep -i --color 'IP SPOOF' /var/log/messages
16. Записать событие и сбросить (с ограничением на количество записей).
Чтобы не переполнить раздел раздутым журналом, ограничим количество записей с помощью -m. К примеру, чтобы записывать каждые 5 минут максимум 7 строк:# iptables -A INPUT -i eth2 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth2 -s 10.0.0.0/8 -j DROP
16. Сбрасывать или разрешить трафик с определенных MAC адресов.
# iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP
## *разрешить только для TCP port # 8080 с mac адреса 00:0F:EA:91:04:07 * ##
# iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT
17. Разрешить или запретить ICMP Ping запросы.
Чтобы запретить ping:# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# iptables -A INPUT -i eth2 -p icmp --icmp-type echo-request -j DROP
Разрешить для определенных сетей / хостов:# iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT
Разрешить только часть ICMP запросов:### ** предполагается, что политики по умолчанию для входящих установлены в DROP ** ###
# iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
## ** разрешим отвечать на запрос ** ##
# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
18. Открыть диапазон портов.
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT
19. Открыть диапазон адресов.
## разрешить подключение к порту 80 (Apache) если адрес в диапазоне от 192.168.1.100 до 192.168.1.200 ##
# iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT
## пример для nat ##
# iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.20-192.168.1.25
20. Закрыть или открыть стандартные порты.
Заменить ACCEPT на DROP, чтобы заблокировать порт.
## ssh tcp port 22 ##
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT
## cups (printing service) udp/tcp port 631 для локальной сети ##
iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT
## time sync via NTP для локальной сети (udp port 123) ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT
## tcp port 25 (smtp) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT
# dns server ports ##
iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
## http/https www server port ##
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT
## tcp port 110 (pop3) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT
## tcp port 143 (imap) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT
## Samba file server для локальной сети ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT
## proxy server для локальной сети ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT
## mysql server для локальной сети ##
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
21. Ограничить количество параллельных соединений к серверу для одного адреса.
Для ограничений используется connlimit модуль. Чтобы разрешить только 3 ssh соединения на одного клиента:# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT
Установить количество запросов HTTP до 20:# iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP
Где:
—connlimit-above 3 : Указывает, что правило действует только если количество соединений превышает 3.
—connlimit-mask 24 : Указывает маску сети.
Помощь по iptables.
Для поиска помощи по iptables, воспользуемся man:$ man iptables
Чтобы посмотреть помощь по определенным командам и целям:# iptables -j DROP -h
Проверка правила iptables.
Проверяем открытость / закрытость портов:# netstat -tulpn
Проверяем открытость / закрытость определенного порта:# netstat -tulpn | grep :80
Проверим, что iptables разрешает соединение с 80 портом:# iptables -L INPUT -v -n | grep 80
В противном случае откроем его для всех:# iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
Проверяем с помощью telnet$ telnet ya.ru 80
Можно использовать nmap для проверки:$ nmap -sS -p 80 ya.ru
Автор статьи Platon Puhlechev aka iFalkorr разрешает печатать данный текст.
Iptables отличный инструмент в руках администратора. Если нужно легко и просто защититься в десктопной Ubuntu, то стоит знать, что есть удобная консольная надстройка над iptables под названием UFW, а к ней есть графическая программа GUFW. Сделать свою Ubuntu ещё более защищённой поможет видеоматериал.
Дополнительные материалы:
Графический GUI для файрвола iptables — Gufw.
Запрещаем приложению доступ в сеть.
Безопасный сёрфинг в Интернете.
Дата последней правки: 2015-12-01 09:22:48
Настройка правил iptables в Linux
Введение
Iptables — это брандмауэр для Linux, используемый для мониторинга входящего и исходящего трафика и его фильтрации в соответствии с заданными пользователем правилами для исключения несанкционированного доступа к системе. При помощи Iptables можно разрешить на вашем сервере движение только определенного трафика. В данном руководстве мы рассмотрим использование Iptables для обеспечения безопасности веб-приложения.
Важно: В последних дистрибутивах RHEL/CentOS по умолчанию используется служба firewallD, уже установленная в системе. Если вы хотите использовать Iptables, сначала нужно ее отключить.
Для рассматриваемого примера используются VPS на Ubuntu 16.04 и локальная машина с SSH-клиентом
Основы Iptables
Все данные передаются по сети в виде пакетов. Ядро Linux предоставляет интерфейс для фильтрации пакетов входящего и исходящего трафика при помощи специальных таблиц. Iptables — это приложение командной строки и межсетевой экран для Linux, которым можно пользоваться для создания, поддержания работоспособности и проверки этих таблиц.
Можно создать несколько таблиц. В каждой таблице может содержаться несколько цепочек. Цепочка — это набор правил. Каждое правило определяет, что делать с пакетом, если он соответствует условиям. При соответствии пакета над ним выполняется целевое действие (TARGET). Это может быть проверка следующей цепочкой или один из следующих вариантов:
- ACCEPT: разрешить передачу пакета.
- DROP: запретить передачу пакета.
- RETURN: пропустить текущую цепочку и перейти к следующему правилу в цепочке, которая ее вызвала.
В данном руководстве мы будем работать с одной из таблиц по умолчанию, которая называется фильтром (filter). В таблице фильтра есть три цепочки (набора правил):
- INPUT – используется для контроля входящих пакетов. Можно разрешать или блокировать подключения по порту, протоколу или IP-адресу источника.
- FORWARD – используется для фильтрации пакетов, приходящих на сервер, но перенаправляемых куда-либо еще.
- OUTPUT – используется для фильтрации исходящих пакетов.
Пример настройки iptables
Давайте рассмотрим настройку iptables, на примере настройки доступа к web серверу.
Шаг 1 – Установка брандмауэра Iptables в Linux
1. Установка Iptables
Iptables предустановлен практически во всех дистрибутивах Linux, но если у вас его нет, в системах Ubuntu/Debian воспользуйтесь командами:
sudo apt-get update sudo apt-get install iptables
или в Centos/RedHat
yum install iptables
2. Проверка текущего состояния Iptables
Эта команда позволит вам проверить состояние текущей конфигурации Iptables. Опция -L используется для выведения всех правил, а опция -v — для более подробной информации:
sudo iptables -L -v
Пример результата:
В рассматриваемом примере во всех трёх цепочках установлена политика по умолчанию ACCEPT. Ни в одной цепочке нет никаких правил. Давайте изменим цепочку INPUT для фильтрации входящего трафика.
Шаг 2 – Определение правил
Определение правила означает внесение его в список (цепочку). Вот пример команды Iptables с обычными опциями. Некоторые из них не являются обязательными.
sudo iptables -t <таблица> -A <цепочка> -i <интерфейс> -p <протокол (tcp/udp) > -s <источник> --dport <номер порта> -j <целевое действие>
Опция -A означает “append”, добавление правила в конец цепочки. Очень важным моментом является то, что правила в цепочке применяются последовательно, и если пакет удовлетворяет условиям одного из них, последующие применяться не будут. Это всегда нужно помнить при создании наборов правил. Таблица означает таблицу, в которой редактируются цепочки. По умолчанию это filter. Цепочка — имя цепочки, к которой мы добавляем правило. Интерфейс — сетевой интерфейс, для которого выполняется фильтрация трафика. Протокол указывает сетевой протокол, пакеты которого вы хотите фильтровать, источник — IP-адрес отправителя пакета, номер порта — порт на вашем сервере, для которого применяется правило. Эти и некоторые другие опции будут рассмотрены ниже при демонстрации соответствующих действий. Для более подробной информации о команде Iptables и ее опциях обратитесь к соответствующей man-странице.
man iptables
1. Разрешение трафика на локальном узле
Первым делом нам нужно обязательно разрешить трафик через интерфейс loopback. Чтобы связь между приложениями и базами данных на сервере продолжалась в обычном режиме.
sudo iptables -A INPUT -i lo -j ACCEPT
Пример результата:
Опция -A используется для добавления в цепочку INPUT правила, разрешающего все соединения для интерфейса lo. Это обозначение для интерфейса loopback, он используется для всей связи на локальном узле, например, связи между базой данных и веб-приложением на одной машине.
2. Разрешение подключений к портам HTTP, SSH и SSL
Нам требуется, чтобы в обычном режиме работали порты HTTP (порт 80), https (порт 443), ssh (порт 22). Для этого нужно выполнить следующие команды. В них мы при помощи опции -p указали протокол, а при помощи опции —dport (destination port, порт на принимающей стороне, в данном случае это ваш сервер) соответствующий каждому протоколу порт:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Теперь все TCP-подключения с этими номерами портов будут разрешены. На самом деле для подключения по порту ssh лучше разрешить не со всех ip адресов, а только с определенных. Для защиты вашего сервера, как это сделать написано ниже
3. Фильтрация пакетов по источнику
Если вам нужно принимать или отклонять пакеты по IP-адресу или диапазону IP-адресов источника, можно указать их при помощи опции -s. Например, чтобы принимать пакеты с адреса 192.168.1.3:
sudo iptables -A INPUT -s 192.168.1.3 -j ACCEPT
вместо хоста также можно указать и полностью сеть, например для разрешения подключения по ssh только с локальной сети 192.168.1.0/24 пропишите правило
sudo iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
Отклонение команд с IP-адреса задаётся аналогичной командой с опцией DROP:
sudo iptables -A INPUT -s 192.168.1.3 -j DROP
Если нужно отклонять или принимать пакеты с диапазона IP-адресов, вам потребуется воспользоваться модулем Iprange с опцией -m и при помощи параметра —src указать диапазон:
sudo iptables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j DROP
4. Запрет всего остального трафика
Важно: после определения правил обязательно нужно запретить остальной трафика, в целях исключения несанкционированного доступа к серверу через другие открытые порты.
sudo iptables -A INPUT -j DROP
Эта команда отклоняет весь трафик, кроме указанных выше портов. Теперь можно проверить свои правила командой:
sudo iptables -L -v
Как мы видим для интерфейса loopback у нас разрешен любой трафик, по портам 80 и 443 можно подключиться с любого ip. А по порту 22 можно подключиться только с сети 192.168.1.0/24. Не забудьте сохранить настройки, иначе после перезагрузке вы потеряете все изменения. Как сохранить написано ниже.
Удаление правил iptables
Если нужно удалить все правила и прописать все заново с чистого листа, можно воспользоваться командой очистки (flush):
sudo iptables -F
Она удаляет все существующие правила. Если вам нужно удалить конкретное правило, воспользуйтесь опцией -D. Сначала при помощи опции —line-numbers выведите пронумерованный список всех правил:
sudo iptables -L --line-numbers
Для удаления правила нужно указать цепочку и номер в списке. В нашем случае это цепочка INPUT и номер 3.
sudo iptables -D INPUT 3
результат
Настройка NAT (MASQUERADE)
Большинство организаций получает от своих интернет-провайдеров ограниченное количество публично доступных IP-адресов, поэтому администратору требуется разделять доступ к Интернету, не выдавая каждому узлу сети публичный IP-адрес. Для доступа к внутренним и внешним сетевым службам узлы локальной сети используют внутренний (частный) IP-адрес. Граничные маршрутизаторы (межсетевые экраны) могут получать входящие соединения из Интернета и передавать их нужным узлам локальной сети и наоборот, направлять исходящие соединения узлов удаленным интернет-службам. Такое перенаправление сетевого трафика может быть опасным, особенно учитывая доступность современных средств взлома, осуществляющих подмену внутренних IP-адресов и таким образом маскирующих машину злоумышленника под узел вашей локальной сети. Чтобы этого не случилось, в Iptables существуют политики маршрутизации и перенаправления, которые можно применять для исключения злонамеренного использования сетевых ресурсов. Политика FORWARD позволяет администратору контролировать маршрутизацию пакетов в локальной сети. Например, чтобы разрешить перенаправление всей локальной сети, можно установить следующие правила (в примере предполагается, что внутренний IP-адрес брандмауэра/шлюза назначен на интерфейсе eth2):
sudo iptables -A FORWARD -i eth2 -j ACCEPT sudo iptables -A FORWARD -o eth2 -j ACCEPT
Эти правила предоставляют системам за шлюзом доступ к внутренней сети. Шлюз направляет пакеты от узла локальной сети к узлу назначения и наоборот (опции -o и -i), передавая их через устройство eth2.
Важно: по умолчанию в большинстве дистрибутивов Linux перенаправление отключено. Чтобы его включить, нужно внести изменения в файл конфигурации /etc/sysctl.conf. Найдите там такую строчку net.ipv4.ip_forward = 0 и измените 0 на 1:
net.ipv4.ip_forward = 1
Разрешение перенаправления пакетов внутренним интерфейсом брандмауэра позволяет узлам локальной сети связываться друг с другом, но у них не будет доступа в Интернет. Чтобы обеспечить узлам локальной сети с частными IP-адресами возможность связи с внешними публичными сетями, нужно настроить на брандмауэре трансляцию сетевых адресов (NAT). Создадим правило:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
В этом правиле используется таблица NAT, поэтому она указывается в явном виде (-t nat) и указана встроенная цепочка этой таблицы POSTROUTING для внешнего сетевого интерфейса eth0 (-o eth0). POSTROUTING позволяет изменять пакеты, когда они выходят из внешнего интерфейса шлюза. Целевое действие -j MASQUERADE заменяет (маскирует) частный IP-адрес узла внешним IP-адресом шлюза. Это называется IP-маскарадингом.
Проброс портов
Если в вашей внутренней сети есть сервер, который должен быть доступен извне, можно воспользоваться целевым действием -j DNAT цепочки PREROUTING в таблице NAT и указать IP-адрес и порт места назначения, на которые будут перенаправляться входящие пакеты, запрашивающие соединение с вашей внутренней службой. Например, если нужно перенаправлять входящие HTTP-запросы по порту 80 на выделенный HTTP-сервер Apache по адресу 172.31.0.23, выполните команду:
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 172.31.0.23:80
Данное правило определяет использование встроенной цепочки PREROUTING в таблице NAT для перенаправления входящих HTTP-запросов на порт 80 указанного IP-адреса 172.31.0.23. Такой способ трансляции сетевых адресов называется перенаправлением или пробросом портов.
Сохранение изменений в iptables
Созданные нами правила сохранены в оперативной памяти. Это означает, что при перезагрузке нам нужно будет заново из определить. Чтобы сохранить из после перезагрузки, нужно выполнить следующую команду:
В Ubuntu/Debian
sudo iptables-save > /etc/iptables.rules
В Centos/Redhat
iptables-save > /etc/sysconfig/iptables
Она сохраняет текущие правила в файл конфигурации системы, который используется для перенастройки таблиц во время перезагрузки. Эту команду нужно выполнять после каждого изменения правил. Для отключения брандмауэра просто очистите все правила и сохраните изменения:
sudo iptables -F sudo /sbin/iptables-save
Восстановление настроек
Если вы еще не сохраняли настройки, и хотите вернуться к первоначальным настройкам. Используйте iptables-restore.
В Ubuntu/Debian
sudo iptables-restore < /etc/iptables.rules
В Centos/Redhat
iptables-restore < /etc/sysconfig/iptables
Заключение
В данном руководстве мы рассмотрели основные моменты работы с Iptables: разрешение трафика только на определенных портах, фильтрацию пакетов по источнику, основы настройки трансляции сетевых адресов (NAT) и сохранение правил после перезагрузки. Однако, важно заметить, что iptables работает только с трафиком ipv4. Если ваш VPS поддерживает ipv6, нужно установить отдельные правила при помощи ip6tables.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Утилита iptables в Ubuntu. Категория: ОС Linux • Разное
Утилита iptables
— это межсетевой экран для операционных систем Linux. С помощью правил iptables
можно разрешать или блокировать прохождение трафика. Когда происходит попытка установления соединения с текущей машиной, iptables
просматривает список правил в списке, чтобы понять, как нужно поступить в этом случае. Если правила нет, то выполняется действие по умолчанию.
Цепочки правил
Набор правил формируется в цепочки, существуют базовые и пользовательские цепочки. Список базовых цепочек:
PREROUTING
— правила в этой цепочке применяются ко всем пакетам, которые поступают на сетевой интерфейс извнеINPUT
— применяются к пакетам, которые предназначаются для самого хоста или для процесса на данном хостеFORWARD
— правила, которые применяются к транзитным пакетам, проходящим через хост, не задерживаясьOUTPUT
— применяются к пакетам, которые сгенерированы самим хостом или процессами на данном хостеPOSTROUTING
— применяются к пакетам, которые должны покинуть сетевой интерфейс данного хоста
Таблицы iptables
Над цепочками правил в iptables
есть еще один уровень абстракции — таблицы. Таблицы предназначены для выполнения разных действий над пакетами, например для модификации или фильтрации:
raw
— предназначена для работы с сырыми пакетами, пока они еще не прошли обработкуmangle
— предназначена для модификации различных заголовков пакетаnat
— обеспечивает работу NAT, если сервер используется в качестве маршрутизатораfilter
— основная таблица для фильтрации пакетов, используется по умолчанию
Принцип работы
Входящий пакет начинает обрабатываться брандмауэром с цепочки PREROUTING
в таблице mangle
. Затем он обрабатывается правилами цепочки PREROUTING
таблицы nat
. На этом этапе проверяется, не требуется ли модификация назначения пакета (DNAT
). Важно сменить назначение сейчас, потому что маршрут пакета определяется сразу после того, как он покинет цепочку PREROUTING
. После этого он будет отправлен на цепочку INPUT
(если целью пакета является этот компьютер) или FORWARD
(если его целью является другой компьютер в сети).
Если целью пакета является другой компьютер, то пакет фильтруется правилами цепочки FORWARD
таблиц mangle
и filter
, а затем к нему применяются правила цепочки POSTROUTING
. На данном этапе можно использовать SNAT/MASQUARADE
(подмена источника/маскировка). После этих действий пакет (если выжил) будет отправлен в сеть.
Если назначением пакета является сам компьютер с брандмауэром, то, после маршрутизации, он обрабатывается правилами цепочек INPUT
таблиц mangle
и filter
. В случае прохождения цепочек пакет передается приложению.
Когда приложение на машине с брандмауэром, отвечает на запрос или отправляет собственный пакет, то он обрабатывается цепочкой OUTPUT
таблицы filter
. Затем к нему применяются правила цепочки OUTPUT
таблицы nat
— для определения, требуется ли использовать DNAT
(модификация назначения). Далее, пакет фильтруется цепочкой OUTPUT
таблицы filter
и выпускается в цепочку POSTROUTING
, которая может использовать SNAT
и QoS
. В случае успешного прохождения POSTROUTING
пакет выходит в сеть.
Утилита iptables
Синтаксис утилиты iptables
:
$ sudo iptables [-t таблица] команда [критерий действие]
Если таблица не указана, подразумевается таблица filter
. Команды могут быть:
-A
(или--append
) — добавить правило в цепочку-D
(или--delete
) — удалить правило из цепочки-I
(или--insert
) — вставить правило в цепочку под указанным номером-L
(или--list
) — вывести все правила для заданной цепочки-F
(или--flush
) — очистить все правила для заданной цепочки (таблицы)-N
(или--new-chain
) — создать новую цепочку-X
(или--delete-chain
) — удалить цепочку-P
(или--policy
) — установить действие по умолчанию для цепочки
Имеются следующие дополнительные опции:
-v
(или--verbose
) — увеличить подробность сообщений, при указании с командой--list
будет выводиться имя интерфейса, параметры правил и маски TOS.-n
(или--numeric
) — выводить ip-адреса и номера портов в числовом виде, предотвращая попытки преобразовать их в символические имена.--line-numbers
— показывать номера строк при отображении списка правил командой--list
(номер строки соответствует позиции правила в цепочке).
Примеры использования утилиты:
$ sudo iptables -F # сбросить все правила в таблице filter
$ sudo iptables -t nat -F # сбросить все правила в таблице nat
$ sudo iptables -L --line-numbers # посмотреть все правила в таблице filter с нумерацией
$ sudo iptables -L -v --line-numbers # посмотреть все правила в таблице filter с нумерацией (подробно)
$ sudo iptables -t nat -L --line-numbers # посмотреть все правила в таблице nat с нумерацией
$ sudo iptables -D INPUT 3 # удалить правило в цепочке INPUT в таблице filter по номеру
$ sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT # вставить правило в начало цепочки INPUT в таблице filter
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT # добавить правило в конец цепочки INPUT в таблице filter
$ sudo iptables -I INPUT 3 -p tcp --dport 80 -j ACCEPT # вставить правило в третью позицию цепочки INPUT в таблице filter
Поведение по умолчанию
Прежде чем приступать к настройке межсетевого экрана, следует определиться с тем, каким должно быть поведение цепочек правил по умолчанию. Другими словами, что iptables
нужно делать в том случае, если соединение не подпадает ни под одно из сконфигурированных правил?
Изначально все три цепочки таблицы filter
по умолчанию разрешают прием трафика:
$ sudo iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Если же что-то менялось, а теперь нужно вернуть прежние настройки, то сделать это можно с помощью команд:
$ sudo iptables -P INPUT ACCEPT $ sudo iptables -P OUTPUT ACCEPT $ sudo iptables -P FORWARD ACCEPT
Можно пойти по другому пути и сначала запретить весь трафик, а затем выборочно разрешать его:
$ sudo iptables -P INPUT DROP $ sudo iptables -P OUTPUT DROP $ sudo iptables -P FORWARD DROP
Действия с соединениями
После настройки поведения по умолчанию, можно переходить к созданию правил обработки трафика, чтобы iptables
понимал, что делать с конкретным пакетом.
ACCEPT
— пакет покидает данную цепочку и передается в следующуюDROP
— отбросить пакет, пакет не передается в следующую цепочкуREJECT
— отбросить пакет, сообщить отправителю пакета об ошибкеSNAT
— замена ip-адреса источника в пакете, в цепочкахPOSTROUTING
иOUTPUT
таблицыnat
DNAT
— замена ip-адреса назначения в пакете, в цепочкеPREROUTING
таблицыnat
(изредка — вOUTPUT
)LOG
— записать пакет в лог-файл (отправляется демонуsyslog
) и обработать остальными правиламиMASQUERADE
— какSNAT
, но для соединений с динамическим ip-адресом, в цепочкеPOSTROUTING
таблицыnat
MARK
— установить метку на пакет и обработать остальными правилами
Критерии для пакетов
Общие критерии — допустимо употреблять в любых правилах, они не зависят от типа протокола и не требуют подгрузки модулей расширения:
-p
(или--protocol
) — используется для указания типа протокола (all
,icmp
,tcp
,udp
)-s
(или--source
) — используется для указания ip-адреса источника; можно указать единственный ip-адрес (10.10.10.10) или диапазон ip-адресов (10.10.10.0/24)-d
(или--destination
) — используется для указания ip-адреса места назначения; можно указать единственный ip-адрес (10.10.10.10) или диапазон ip-адресов (10.10.10.0/24)-i
(или--in-interface
) — интерфейс, с которого был получен пакет, допускается только в цепочкахINPUT
,FORWARD
иPREROUTING
; при отсутствии этого критерия предполагается любой интерфейс-o
(или--out-interface
) — интерфейс, с которого будет отправлен пакет, допускается только в цепочкахOUTPUT
,FORWARD
иPOSTROUTING
; при отсутствии этого критерия предполагается любой интерфейс
Неявные критерии — неявно подгружают модули расширений и становятся доступны при указании критерия --protocol
. Рассмотрим некоторые из них:
-p tcp --sport
(или--source-port
) — исходный порт, с которого был отправлен TCP-пакет. В качестве параметра может указываться номер порта или название сетевой службы. Соответствие имен сервисов и номеров портов можно найти в файле/etc/services
. Номера портов могут задаваться в виде интервала из минимального и максимального номеров.-p tcp --dport
(или--destination-port
) — порт или диапазон портов, на который адресован TCP-пакет. Аргументы задаются в том же формате, что и для--source-port
.-p udp --sport
(или--source-port
) — исходный порт, с которого был отправлен UDP-пакет. В качестве параметра может указываться номер порта или название сетевой службы. Соответствие имен сервисов и номеров портов можно найти в файле/etc/services
. Номера портов могут задаваться в виде интервала из минимального и максимального номеров.-p udp --dport
(или--destination-port
) — порт или диапазон портов, на который адресован UDP-пакет. Аргументы задаются в том же формате, что и для--source-port
.
Явные критерии — требуют явной подгрузки модулей расширения с помощью опции -m
или --match
. Например, если планируется использовать критерий state
, то нужно явно указать -m state
левее используемого критерия. Рассмотрим некоторые из них:
-m conntrack --ctstate STATES
— проверяет признак состояния соединения:NEW
,ESTABLISHED
,RELATED
иINVALID
. СостояниеNEW
подразумевает, что пакет открывает новое соединение или пакет принадлежит однонаправленному потоку. СостояниеESTABLISHED
указывает на то, что пакет принадлежит уже установленному соединению, через которое пакеты идут в обеих направлениях. СостояниеRELATED
указывает на то, что пакет принадлежит уже существующему соединению, но при этом он открывает новое соединение. СостояниеINVALID
подразумевает, что пакет связан с неизвестным потоком или соединением и, возможно содержит ошибку в данных или в заголовке.-m state --state STATES
(устарел, не рекомендуется) — проверяет признак состояния соединения:NEW
,ESTABLISHED
,RELATED
иINVALID
.-m multiport --source-port PORTS
— служит для указания списка исходящих портов, можно указать до 15 различных портов. Названия портов в списке должны отделяться друг от друга запятыми, пробелы в списке недопустимы. Может использоваться только совместно с критериями-p tcp
или-p udp
. Главным образом используется как расширенная версия обычного критерия--source-port
.-m multiport --destination-port PORTS
— служит для указания списка входящих портов, можно указать до 15 различных портов. Названия портов в списке должны отделяться друг от друга запятыми, пробелы в списке недопустимы. Может использоваться только совместно с критериями-p tcp
или-p udp
. Главным образом используется как расширенная версия обычного критерия--destination-port
.-m multiport --port PORTS
— проверяет как исходящий так и входящий порт пакета. Формат аргументов аналогичен критерию--source-port
и--destination-port
. Данный критерий проверяет порты обоих направлений, если задан критерий-m multiport --port 80
— под него попадают пакеты, идущие с порта 80 на порт 80.-m mac --mac-source MAC
— MAC адрес сетевого узла, передавшего пакет, в форматеXX:XX:XX:XX:XX:XX
. Имеет смысл только в цепочкахPREROUTING
,FORWARD
иINPUT
и нигде более.-m iprange --src-range IP-IP
— позволяет указать диапазон ip-адресов источника, например 192.168.1.10-192.168.2.20-m iprange --dst-range IP-IP
— позволяет указать диапазон ip-адресов места назначения, например 192.168.1.10-192.168.2.20
Критерий состояния соединения
Как сказано выше, многие протоколы требуют двусторонних коммуникаций. Например, если нужно разрешить соединения по SSH, то добавить правила надо будет и в цепочку INPUT
и в цепочку OUTPUT
. Но что, если нужно разрешить только входящие SSH-соединения на сервер (т.е. только возможность подключиться к серверу по SSH)? Разрешит ли добавление правила в цепочку OUTPUT
и исходящие SSH-соединения (т.е. с сервера можно будет подключиться по SSH к другому хосту)?
Для таких случаев используются состояния соединений. Они позволяют описывать двусторонние коммуникации, в которых разрешается установка только соединений определенной направленности. В примере ниже разрешены SSH-соединения, поступающие от хоста 10.10.10.10, но SSH-соединения к этому хосту запрещены. Однако, системе разрешается отправка информации по SSH в случае уже установленного соединения, что делает возможной SSH-коммуникацию между хостами:
$ sudo iptables -A INPUT -p tcp --dport 22 -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT
$ sudo iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT
Сохранение изменений
Внесенные в цепочки правил изменения пропадут при перезагрузке, так что их нужно сохранить с в файл помощью команды:
$ sudo /sbin/iptables-save > /etc/iptables.rules
$ cat /etc/iptables.rules
# Generated by iptables-save v1.6.1 on Sat Feb 15 11:58:32 2020 *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -p udp -m udp --sport 53 -m state --state ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --sport 53 -m state --state ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT -A OUTPUT -o lo -j ACCEPT -A OUTPUT -p icmp -j ACCEPT -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT -A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT -A OUTPUT -p tcp -m tcp --sport 80 -j ACCEPT -A OUTPUT -p tcp -m tcp --sport 443 -j ACCEPT -A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT COMMIT # Completed on Sat Feb 15 11:58:32 2020
После перезагрузки правила можно восстановить из файла /etc/iptables.rules
с помощью команды:
$ sudo iptables-restore < /etc/iptables.rules
Автозагрузка правил
Понятно, что восстанавливать правила вручную после каждой перезагрузки неудобно. Поэтому устанавливаем пакет iptables-persistent
:
$ sudo apt install iptables-persistent
При установке пакета будет предложено сохранить текущие правила iptables
:
- в файл
/etc/iptables/rules.v4
для протокола IPv4 - в файл
/etc/iptables/rules.v6
для протокола IPv6
Теперь, после каких-либо изменений правил, надо сохранить текущее состояние в файл /etc/iptables/rules.v4
, чтобы это состояние восстановилось после перезагрузки:
$ sudo iptables-save > /etc/iptables/rules.v4
После установки пакета будет добавлена новая служба netfilter-persistent.service
, которая при загрузке системы будет восстанавливать правила iptables
:
$ systemctl status netfilter-persistent.service ● netfilter-persistent.service - netfilter persistent configuration Loaded: loaded (/lib/systemd/system/netfilter-persistent.service; enabled; vendor preset: enabled) Active: active (exited) since Wed 2020-02-05 10:08:52 MSK; 27s ago Main PID: 3769 (code=exited, status=0/SUCCESS) Tasks: 0 (limit: 2317) CGroup: /system.slice/netfilter-persistent.service фев 05 10:08:52 ubuntu-iptables systemd[1]: Starting netfilter persistent configuration... фев 05 10:08:52 ubuntu-iptables systemd[1]: Started netfilter persistent configuration.
Судя по всему, скоро пакет iptables-persistent
будет заменен на пакет netfilter-persistent
(сейчас он устанавливается как зависимость при установке iptables-persistent
).
Удаление всех правил
Для удаления всех сконфигурированных правил таблицы filter
можно использовать команду:
$ sudo iptables -F
Для удаления всех сконфигурированных правил таблицы nat
можно использовать команду:
$ sudo iptables -t nat -F
Пример настройки web-сервера
1. Политика ACCEPT для OUTPUT
Первым делом задаем политику по умолчанию:
$ sudo iptables --policy INPUT DROP $ sudo iptables --policy OUTPUT ACCEPT $ sudo iptables --policy FORWARD DROP
Разрешаем трафик через интерфейс loopback
(будет работать ping
для localhost
):
$ sudo iptables -A INPUT -i lo -j ACCEPT
Многие приложения используют для обмена между собой интерфейс обратной петли, и без этого правила работа таких приложений будет нарушена.
Если подходить к настройке не очень фанатично, то можно разрешить работу протокола ICMP (будут работать ping
и traceroute
):
$ sudo iptables -A INPUT -p icmp -j ACCEPT
ICMP (протокол межсетевых управляющих сообщений) — сетевой протокол, входящий в стек протоколов TCP/IP. В основном ICMP используется для передачи сообщений об ошибках и других исключительных ситуациях, возникших при передаче данных.
Утилита ping
, служащая для проверки возможности доставки IP-пакетов, использует ICMP-сообщения с типом 8 (эхо-запрос) и 0 (эхо-ответ). Утилита traceroute
, отображающая путь следования IP-пакетов, использует ICMP-сообщения с типом 11.
Разрешаем нашему серверу получать ответы от DNS-серверов:
$ sudo iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT $ sudo iptables -A INPUT -p tcp --sport 53 -m state --state ESTABLISHED -j ACCEPT
В большинстве случаев для DNS-сообщений используется протокол UDP. Но если сообщение превышает 512 байт — используется протокол TCP. DNS-сервера работают на порту 53, поэтому разрешаем входящий TCP и UDP трафик, который идет с source port
53. Кроме того, уточняем — что этот трафик в ответ на запрос с нашего сервера.
Разрешаем входящие подключения к портам HTTP, HTTPS и SSH:
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT $ sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT $ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Наш web-сервер (Apache или Nginx) прослушивает порты 80 и 443, а SSH-сервер — порт 22. Поэтому разрешаем входящий TCP трафик, который идет на destination port
80, 443 и 22.
Чтобы можно было устанавливать и обновлять пакеты с помощью утилиты apt
:
$ sudo iptables -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
Любой исходящий трафик у нас разрешен, поэтому утилита apt
может отправлять запросы на сервер репозитория. Но ей еще нужно получать ответы, поэтому разрешаем входящий TCP трафик, который идет с source port
80. Кроме того, уточняем — что этот трафик в ответ на запрос с нашего сервера.
Теперь можно проверить добавленные правила командой:
$ sudo iptables -L -v --line-numbers Chain INPUT (policy DROP 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 272 27773 ACCEPT all -- lo any anywhere anywhere 2 22 1848 ACCEPT icmp -- any any anywhere anywhere 3 12 1975 ACCEPT udp -- any any anywhere anywhere udp spt:domain state ESTABLISHED 4 0 0 ACCEPT tcp -- any any anywhere anywhere tcp spt:domain state ESTABLISHED 5 18 2313 ACCEPT tcp -- any any anywhere anywhere tcp dpt:http 6 0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:https 7 2091 140K ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh 8 10 1308 ACCEPT tcp -- any any anywhere anywhere tcp spt:http state ESTABLISHED Chain FORWARD (policy DROP 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 6 packets, 772 bytes) num pkts bytes target prot opt in out source destination
2. Политика DROP для OUTPUT
В этом случае все правила для цепочки INPUT
будут такими же, но надо еще добавить правила для цепочки OUTPUT
. Итак, первым делом задаем политику по умолчанию:
$ sudo iptables --policy INPUT DROP $ sudo iptables --policy OUTPUT DROP $ sudo iptables --policy FORWARD DROP
Разрешаем трафик через интерфейс loopback
:
$ sudo iptables -A INPUT -i lo -j ACCEPT $ sudo iptables -A OUTPUT -o lo -j ACCEPT
Разрешаем работу протокола ICMP (будут работать ping
и traceroute
):
$ sudo iptables -A INPUT -p icmp -j ACCEPT $ sudo iptables -A OUTPUT -p icmp -j ACCEPT
Разрешаем нашему серверу отправлять запросы DNS-серверам:
$ sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT $ sudo iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
Разрешаем нашему серверу получать ответы от DNS-серверов:
$ sudo iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT $ sudo iptables -A INPUT -p tcp --sport 53 -m state --state ESTABLISHED -j ACCEPT
Разрешаем входящие подключения к портам HTTP, HTTPS и SSH:
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT $ sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT $ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Разрешаем отправлять пакеты с портов HTTP, HTTPS и SSH:
$ sudo iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT $ sudo iptables -A OUTPUT -p tcp --sport 443 -j ACCEPT $ sudo iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
Чтобы можно было устанавливать и обновлять пакеты с помощью утилиты apt
:
$ sudo iptables -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT $ sudo iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
Теперь можно проверить добавленные правила командой:
$ sudo iptables -L -v --line-numbers Chain INPUT (policy DROP 6 packets, 623 bytes) num pkts bytes target prot opt in out source destination 1 53 5876 ACCEPT all -- lo any anywhere anywhere 2 0 0 ACCEPT icmp -- any any anywhere anywhere 3 16 2808 ACCEPT udp -- any any anywhere anywhere udp spt:domain state ESTABLISHED 4 0 0 ACCEPT tcp -- any any anywhere anywhere tcp spt:domain state ESTABLISHED 5 35 3480 ACCEPT tcp -- any any anywhere anywhere tcp dpt:http 6 0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:https 7 936 63201 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh 8 50 92195 ACCEPT tcp -- any any anywhere anywhere tcp spt:http state ESTABLISHED Chain FORWARD (policy DROP 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy DROP 6 packets, 772 bytes) num pkts bytes target prot opt in out source destination 1 53 5876 ACCEPT all -- any lo anywhere anywhere 2 0 0 ACCEPT icmp -- any any anywhere anywhere 3 16 1244 ACCEPT udp -- any any anywhere anywhere udp dpt:domain 4 0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:domain 5 18 22936 ACCEPT tcp -- any any anywhere anywhere tcp spt:http 6 0 0 ACCEPT tcp -- any any anywhere anywhere tcp spt:https 7 657 80901 ACCEPT tcp -- any any anywhere anywhere tcp spt:ssh 8 69 4613 ACCEPT tcp -- any any anywhere anywhere tcp dpt:http
Настройка маршрутизатора
Есть компьютер с двумя сетевыми интерфейсами. Первый интерфейс eth0
смотрит в интернет и имеет белый ip-адрес 128.68.35.23
. Второй интерфейс eth2
смотрит в локальную сеть и имеет ip-адрес 192.168.100.1
.
Доступ в интернет (SNAT)
Этот компьютер должен обеспечивать выход в интернет для всех компьютеров из локальной сети 192.168.100.0/24
. По умолчанию транзитный трафик отключен, так что редактируем файл /etc/sysctl.conf
:
$ sudo nano /etc/sysctl.conf
net.ipv4.ip_forward=1
Чтобы настройки вступили в силу:
$ sudo sysctl -p
Теперь настраиваем iptables
:
$ sudo iptables -P FORWARD DROP
$ sudo iptables -A FORWARD -i eth2 -o eth0 -s 192.168.100.0/24 -j ACCEPT $ sudo iptables -A FORWARD -i eth0 -o eth2 -d 192.168.100.0/24 -j ACCEPT
Тем самым разрешили ходить транзитным пакетам для нашего диапазона ip адресов, а всё остальное запретили. Теперь настроим SNAT (подмена адреса источника), что позволит всем компьютерам сети выходить в интернет, используя единственный ip-адрес 128.68.35.23
.
$ sudo -t nat iptables -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j SNAT --to-source 128.68.35.23
Доступ внутрь сети (DNAT)
Внутри сети есть компьютер с ip-адресом 192.168.100.2
, к которому нужен доступ по RDP из интернета. Все запросы в нашу локальную сеть приходят на интерфейс eth0
с ip-адресом 128.68.35.23
. Мы может отобрать те их них, которые идут на порт 3389
и отправить их на 192.168.100.2
(DNAT — подмена адреса получателя):
$ sudo iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.100.2
Дополнительно
Поиск:
CLI • Linux • Ubuntu • Конфигурация • Настройка • iptables • NAT • Файервол • Брандмауэр • Цепочка • Таблица • filter
Настройка iptables от простого к сложному. Часть 1.
В Linux существует некоторое количество решений для настройки фаервола, однако многие из них являются на самом деле только фронтэндами для настройки iptables, и некоторые не совсем удачными. В принципе, неплохо, когда можно быстро настроить фаервол, но когда вы разберетесь с iptables, вы сможете это сделать быстрее и тоньше. Тонкая настройка iptables фронтэндам обычно недоступна.
Приступим. Начнем с простого, и потом будем усложнять конфигурацию. Здесь на сайте уже есть статья про автозагрузку правил iptables, поэтому мы не будем сейчас рассматривать загрузку правил, а сосредоточимся на самих правилах. Настраивается фаервол всегда под учетной записью root.
Сценарии сетевых подключений
Перед настройкой фаервола обязательно нужно иметь точное представление о том, какие сетевые соединения и как должны устанавливаться при работе системы, чтобы все сервисы могли нормально работать. Чем точнее у нас картина работы сетевых сервисов, как работающих на нашем сервере, так и на других серверах, тем более тонко можно настроить систему. Поэтому желательно всегда сначала описывать сценарии того, как всё должно работать, и только потом начинать настраивать фаервол. Сценарий можно написать в любом текстовом редакторе. Сначала описываем все внешние сервисы, с которыми работает сервер, а затем все сервисы, которые работают на сервере. Зачем это надо? Чтобы точно представлять сам процесс работы, без углубления в техническую часть. После написания максимально точного сценария можно приступать к настройке фаервола. Описание в сценарии должно выглядеть примерно так:
1) Все пользователи могут просматривать сайт. По умолчанию сайт на русском языке.
2) Если пользователи пришли с адресов <список-адресов-или-маска-подсети>, то им должен быть показан сайт на украинском. В нашем примере это будет, допустим, интернет-магазин с одним доменным именем, отображаемый на русском или украинском языке, и имеющий в продаже свой набор для России и Украины. У нас будет просто два сайта, один на русском, второй на украинском, и по адресу, с которого пришел клиент, будет определяться, на какой сайт он попадет. Пример взят из головы, на практике, конечно, такие вопросы решаются по другому. Можно также не разрешать просмотр сайта с китайских адресов из-за постоянного спама в комментариях на китайском.
3) Из офиса должна быть доступна почта, из других мест она не должна быть доступна.
4) Извне должна быть обеспечена возможность подключения к ВПН
5) Мы можем использовать только несколько DNS-серверов, которым мы доверяем. Все остальные сервера DNS должны быть недоступны
6) …..
И так далее. Думаю, достаточно для простого примера. Смысл в том, чтобы максимально точно определить картину сетевого взаимодествия. Любой сценарий имеет только одну цель — формализовать взаимодействие с пользователями и сервисами до составления описаний соединений, включающих порт, протокол, адрес источника, адрес назначения для каждого соединения.
Настройка iptables: Самая простая конфигурация
Если говорить про боевые сервера, то настройка фаервола на двух серверах может сильно различаться, в зависимости от задач, которые выполняют эти сервера. Поэтому я постараюсь описать общие принципы, которыми можно пользоваться при настройке фаервола для любых серверов. Это только база для дальнейшей настройки.
В первую очередь, необходимо очистить загруженные правила:
iptables -F INPUT iptables -F OUTPUT iptables -F FORWARD
INPUT, OUTPUT, FORWARD — это три основные цепочки, по которым будут идти пакеты, входящие, исходящие и проходящие с интерфейса на интерфейс.
После этого необходимо задать политику по умолчанию. Их всего две — ACCEPT и DROP, принимать пакеты или не принимать. Для боевого сервера всегда необходимо выбирать DROP, а затем открывать всё, что необходимо и не более того.
Для задания таких политик необходимо предварительно разрешить соединения по SSH, будем считать, что мы не меняли стандартный порт (что обычно следует на боевых серверах делать сразу после установки SSH-сервера).
iptables -t filter -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
И после этого уже можно приступать к изменению политик по умолчанию:
iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP
Для цепочки OUTPUT пока можно оставить политику по умолчанию ACCEPT, разрешающую исходящие соединения, к ней можно переходить после настройки цепочки INPUT, когда мы запретим входящие соединения. На многих серверах достаточно бывает правильно настроить цепочку INPUT, но мы рассмотрим позже также и настройку OUTPUT для более жесткой конфигурации.
Итак. В данный момент у нас открыт только порт SSH-сервера для входящих соединений, на все остальные порты соединения проходить не будут. Теперь надо добавить прием соединений на порты остальных сервисов, если они на вашем сервере запущены.
SMTP:
iptables -t filter -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
DNS (обычно достаточно разрешить UDP, но можно также добавить и TCP):
iptables -t filter -A INPUT -p udp -m udp --dport 53 -j ACCEPT
HTTP:
iptables -t filter -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
POP3:
iptables -t filter -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
HTTPS:
iptables -t filter -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
И так далее. Порты, которые необходимо открыть для того или иного сервиса, и протокол можно посмотреть в файле /etc/services, в котором перечислены все закрепленные за определенными сервисами порты.
Но это еще не всё. Порты открыты, сервисы доступны извне, но почта не работает и доменные имена не резолвятся. Дело в том, что при запросе DNS-серверов запрос отправляется с произвольного свободного порта из числа непривелегированных, точно так же, как и соединение с другим почтовым сервером. И ответ эти сервисы отправляют на тот же самый порт. А этот порт, как вы понимаете, у нас закрыт. Мы могли бы открыть этот порт, но мы не знаем, с какого порта будет исходящее соединение. Поэтому мы можем сделать самое простое, что может быть,- разрешить соединения с определенных портов удаленного компьютера:
SMTP:
iptables -t filter -A INPUT -p tcp -m tcp --sport 25 -j ACCEPT
DNS:
iptables -t filter -A INPUT -p udp -m udp --sport 53 -j ACCEPT
Эти два правила разрешают входящие соединения с портов 25/tcp и 53/udp, поэтому, когда с этих портов приходят пакеты по соответствующему протоколу, они будут приняты. Если вы планируете обновлять систему, программное обеспечение или устанавливать пакеты, необходимые для работы, то вам придется разрешить соединения с 80 порта удаленных машин.
Вот теперь самая простая конфигурация iptables у нас готова.
После внесения правил в таблицы, необходимо их сохранить. Для этого можно воспользоваться, например, таким скриптом.
Обработка источника соединения
Идем дальше. соединение по определенным портам нам необходимо не со всем Интернетом, а с определенными машинами, с определенными IP-адресами. Поэтому мы можем немного усложнить правила, добавив в них адрес источника пакетов.
iptables -t filter -A INPUT -s 123.123.123.123 -p tcp -m tcp --dport 22 -j ACCEPT
Данное правило позволяет принимать пакеты на 22 порт по протоколу TCP только из источника с адресом 123.123.123.123, на это указывает параметр «-s» (source, источник). Таким образом вы можете ограничить соединения с сервером по SSH одним определенным IP-адресом, либо определенной подсетью, если укажете маску подсети, из которой разрешены соединения вместо отдельного IP-адреса.
Если у вас всегда используется один и тот же почтовый шлюз, через который ваш сервер отправляет почту, то вы можете, например, ограничить соединения с порта 25/tcp, указав этот шлюз в качестве источника.
Правила для конкретного сетевого интерфейса или IP-адреса
На сервере может быть несколько сетевых интерфейсов. Обычно их как минимум два — внешний сетевой и так называемый loopback-интерфейс 127.0.0.1, доступ к которому извне невозможен, если отсутствует соответствующее перенаправление пакетов. У вас также может как минимум еще один IP-адрес, используемый совместно с алиасом сетевого интерфейса, или еще один физический сетевой интерфейс. И на каждом IP-адресе или сетевом интерфейсе могут работать определенные сервисы. Например, на одном веб-сервер Apache, а на втором сервер службы доменных имен bind9. И когда вы разрешаете соединения на определенный порт без указания этого сетевого интерфейса, вы открываете доступ к этому порту на всех интерфейсах. Поэтому есть два способа сузить область действия разрешения.
Первый способ — указать IP-адрес, для которого будет разрешен доступ.
iptables -t filter -A INPUT -d 234.234.234.234 -p tcp -m tcp --dport 22 -j ACCEPT
Этот пример показывает, как можно использовать адрес назначения в правиле iptables. При этом также можно использовать адрес источника:
iptables -t filter -A INPUT -s 123.123.123.123 -d 234.234.234.234 -p tcp -m tcp --dport 22 -j ACCEPT
В данном пример мы уже ограничиваем доступ двумя адресами, что позволяет получить доступ по SSH к серверу по адресу 234.234.234.234 с адреса 123.123.123.123, с остальных адресов доступ вы получить не сможете.
Второй способ — указать имя сетевого интерфейса. Этот способ также применим, когда внешний адрес может измениться. В случае, если изменится адрес на сетевом интерфейсе, с предыдущим вариантом вы потеряете доступ к серверу. Указание имени интерфейса осуществляется следующим образом:
iptables -t filter -A INPUT -i eth0 -s 123.123.123.123 -p tcp -m tcp --dport 22 -j ACCEPT
Такой вариант разрешает доступ по SSH на сетевом интерфейсе eth0, на остальных сетевых интерфейсах доступ по SSH будет отсутствовать.
Всё, что мы только что рассмотрели — это только самое начало, в следующей части будет продолжение…
[wysija_form id=»2″]
- Нажмите здесь, чтобы поделиться контентом на Facebook. (Открывается в новом окне)
- Нажмите, чтобы поделиться на LinkedIn (Открывается в новом окне)
- Нажмите, чтобы поделиться на Reddit (Открывается в новом окне)
- Нажмите, чтобы поделиться на Twitter (Открывается в новом окне)
- Нажмите, чтобы поделиться записями на Tumblr (Открывается в новом окне)
- Нажмите, чтобы поделиться записями на Pinterest (Открывается в новом окне)
- Нажмите, чтобы поделиться записями на Pocket (Открывается в новом окне)
- Нажмите, чтобы поделиться в Telegram (Открывается в новом окне)
- Нажмите, чтобы поделиться в WhatsApp (Открывается в новом окне)
- Нажмите, чтобы поделиться в Skype (Открывается в новом окне)
25 наиболее часто используемых примеров правил Linux IPTables
На первый взгляд правила IPTables могут показаться загадочными.
В этой статье я дал 25 практических правил IPTables, которые вы можете скопировать / вставить и использовать для своих нужд.
Эти примеры будут служить базовыми шаблонами для настройки этих правил в соответствии с вашими конкретными требованиями.
Для удобства все эти 25 правил iptables представлены в формате сценария оболочки: iptables-rules
1.Удалить существующие правила
Перед тем, как вы начнете создавать новый набор правил, вы можете очистить все правила по умолчанию и существующие правила. Для этого используйте команду iptables flush, как показано ниже.
iptables -F (или) iptables --flush
2. Установить политики цепочки по умолчанию
Политика цепочки по умолчанию — ПРИНЯТЬ. Измените это на DROP для всех цепочек INPUT, FORWARD и OUTPUT, как показано ниже.
iptables -P ПАДЕНИЕ ВВОДА iptables -P FORWARD DROP iptables -P ВЫХОДНАЯ ДРОП
Когда вы устанавливаете политику по умолчанию для цепочки INPUT и OUTPUT как DROP, для каждого имеющегося у вас требования к правилу брандмауэра вы должны определить два правила.т.е. один для входящего и один для исходящего.
Во всех приведенных ниже примерах у нас есть два правила для каждого сценария, поскольку мы установили DROP в качестве политики по умолчанию для цепочек INPUT и OUTPUT.
Если вы доверяете своим внутренним пользователям, можете пропустить последнюю строку выше. т.е. по умолчанию НЕ УДАЛЯТЬ все исходящие пакеты. В этом случае для каждого требования к правилу брандмауэра вам просто нужно определить только одно правило. т.е. определить правило только для входящих, так как исходящие — ПРИНЯТЬ для всех пакетов.
Примечание. Если вы не знаете, что означает цепочка, вам следует сначала ознакомиться с основами IPTables.
3. Заблокировать определенный ip-адрес
Прежде чем мы продолжим, приведем другие примеры. Если вы хотите заблокировать определенный IP-адрес, вы должны сделать это, как показано ниже. Измените «x.x.x.x» в следующем примере на конкретный IP-адрес, который вы хотите заблокировать.
BLOCK_THIS_IP = "x.x.x.x" iptables -A INPUT -s "$ BLOCK_THIS_IP" -j DROP
Это полезно, когда вы обнаруживаете какие-то странные действия с определенного IP-адреса в файлах журнала и хотите временно заблокировать этот IP-адрес на время дальнейшего исследования.
Вы также можете использовать один из следующих вариантов, который блокирует только TCP-трафик на подключении eth0 для этого IP-адреса.
iptables -A INPUT -i eth0 -s "$ BLOCK_THIS_IP" -j DROP iptables -A INPUT -i eth0 -p tcp -s "$ BLOCK_THIS_IP" -j DROP
4. Разрешить ВСЕ входящие SSH
Следующие правила разрешают ВСЕ входящие ssh-соединения на интерфейсе eth0.
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW, ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Примечание : Если вы хотите точно понимать, что означает каждый из аргументов, вы должны прочитать Как добавить правила брандмауэра IPTables
5.Разрешить входящий SSH только из определенной сети
Следующие правила разрешают входящие ssh-соединения только из сети 192.168.100.X.
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW, ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
В приведенном выше примере вместо / 24 можно также использовать полную маску подсети. то есть «192.168.100.0/255.255.255.0».
6. Разрешить входящие HTTP и HTTPS
Следующие правила разрешают весь входящий веб-трафик.т.е. HTTP-трафик на порт 80.
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW, ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
Следующие правила разрешают весь входящий безопасный веб-трафик. т.е. трафик HTTPS на порт 443.
iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW, ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
7.Объедините несколько правил вместе с помощью MultiPorts
Когда вы разрешаете входящие подключения из внешнего мира к нескольким портам, вместо того, чтобы писать отдельные правила для каждого порта, вы можете объединить их вместе, используя расширение multiport, как показано ниже.
В следующем примере разрешен весь входящий трафик SSH, HTTP и HTTPS.
iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW, ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT
8.Разрешить исходящий SSH
Следующие правила разрешают исходящее соединение ssh. т.е. когда вы используете ssh изнутри на внешний сервер.
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW, ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Обратите внимание, что это немного отличается от входящего правила. Т.е. мы разрешаем состояние NEW и ESTABLISHED в цепочке OUTPUT, и только состояние ESTABLISHED в цепочке INPUT.Для входящего правила все наоборот.
9. Разрешить исходящий SSH только в определенную сеть
Следующие правила разрешают исходящее ssh-соединение только с определенной сетью. Т.е. вы подключаетесь к сети 192.168.100.0/24 только изнутри.
iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW, ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
10. Разрешить исходящий HTTPS
Следующие правила разрешают исходящий безопасный веб-трафик.Это полезно, если вы хотите разрешить доступ в Интернет для своих пользователей. На серверах эти правила также полезны, если вы хотите использовать wget для загрузки файлов извне.
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW, ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
Примечание. Для исходящего веб-трафика HTTP добавьте два дополнительных правила, как указано выше, и измените 443 на 80.
11. Балансировка нагрузки входящего веб-трафика
Вы также можете распределить нагрузку входящего веб-трафика с помощью правил брандмауэра iptables.
Используется n-е расширение iptables. В следующем примере нагрузка балансирует HTTPS-трафик на три разных IP-адреса. Для каждого 3-го пакета выполняется балансировка нагрузки на соответствующий сервер (с использованием счетчика 0).
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443 iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102: 443 iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443
12. Разрешить пинг снаружи внутрь
Следующие правила позволяют внешним пользователям пинговать ваши серверы.
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
13. Разрешить пинг изнутри наружу
Следующие правила позволяют вам пинговать изнутри на любой из внешних серверов.
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
14. Разрешить кольцевой доступ
Вы должны разрешить полный петлевой доступ на своих серверах. т.е. доступ с использованием 127.0.0.1
iptables -A ВВОД -i lo -j ПРИНЯТЬ iptables -A ВЫХОД -o lo -j ПРИНЯТЬ
15. Разрешить внутреннюю сеть внешней сети.
На сервере брандмауэра, где одна карта Ethernet подключена к внешней, а другая карта Ethernet подключена к внутренним серверам, используйте следующие правила, чтобы разрешить внутренней сети взаимодействовать с внешней сетью.
В этом примере eth2 подключен к внешней сети (Интернету), а eth0 подключен к внутренней сети (например: 192.168.1.x).
iptables -A FORWARD -i eth0 -o eth2 -j ACCEPT
16. Разрешить исходящий DNS
Следующие правила разрешают исходящие DNS-соединения.
iptables -A ВЫХОД -p udp -o eth0 --dport 53 -j ПРИНЯТЬ iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
17. Разрешить подключения к NIS
Если вы используете NIS для управления учетными записями пользователей, вам следует разрешить соединения NIS.Даже если SSH-соединение разрешено, если вы не разрешите связанные с NIS соединения ypbind, пользователи не смогут войти в систему.
Порты NIS являются динамическими. т.е. когда ypbind запускается, он выделяет порты.
Сначала выполните rpcinfo -p, как показано ниже, и получите номера портов. В этом примере использовались порты 853 и 850.
rpcinfo -p | grep ypbind
Теперь разрешите входящее соединение с портом 111 и портами, которые использовались ypbind.
iptables -A INPUT -p tcp --dport 111 -j ПРИНЯТЬ iptables -A ВВОД -p udp --dport 111 -j ПРИНЯТЬ iptables -A ВВОД -p tcp --dport 853 -j ПРИНЯТЬ iptables -A ВВОД -p udp --dport 853 -j ПРИНЯТЬ iptables -A INPUT -p tcp --dport 850 -j ACCEPT iptables -A INPUT -p udp --dport 850 -j ACCEPT
Вышеуказанное не будет работать после перезапуска ypbind, поскольку на этот раз у него будут другие номера портов.
Для этого есть два решения: 1) Используйте статический IP-адрес для вашего NIS или 2) Используйте некоторые умные методы написания сценариев оболочки для автоматического получения динамического номера порта из выходных данных команды «rpcinfo -p» и использования его в выше правил iptables.
18. Разрешить Rsync из определенной сети
Следующие правила разрешают rsync только из определенной сети.
iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW, ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT
19.Разрешить подключение к MySQL только из определенной сети
Если вы используете MySQL, обычно вы не хотите разрешать прямое подключение извне. В большинстве случаев у вас может быть веб-сервер, работающий на том же сервере, на котором работает база данных MySQL.
Однако администраторы баз данных и разработчики могут нуждаться в прямом входе в MySQL со своего портативного компьютера или настольного компьютера с помощью клиента MySQL. В этом случае вы можете разрешить вашей внутренней сети напрямую взаимодействовать с MySQL, как показано ниже.
iptables -A ВХОД -i eth0 -p tcp -s 192.168.100.0 / 24 --dport 3306 -m state --state NEW, ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
20. Разрешить трафик Sendmail или Postfix
Следующие правила разрешают почтовый трафик. Это может быть sendmail или postfix.
iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW, ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
21.Разрешить IMAP и IMAPS
Следующие правила разрешают трафик IMAP / IMAP2.
iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW, ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT
Следующие правила разрешают трафик IMAPS.
iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW, ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT
22.Разрешить POP3 и POP3S
Следующие правила разрешают доступ по протоколу POP3.
iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW, ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT
Следующие правила разрешают доступ по протоколу POP3S.
iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW, ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT
23.Предотвращение DoS-атаки
Следующее правило iptables поможет вам предотвратить атаку отказа в обслуживании (DoS) на ваш веб-сервер.
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25 / minute --limit-burst 100 -j ACCEPT
В приведенном выше примере:
- -m limit: используется расширение limit iptables
- –limit 25 / минута: Ограничивает максимум 25 подключений в минуту. Измените это значение в соответствии с вашими конкретными требованиями
- –limit-burst 100: это значение указывает, что ограничение в минуту будет применяться только после того, как общее количество подключений достигнет уровня limit-burst.
24. Перенаправление портов
В следующем примере весь трафик, поступающий на порт 442, маршрутизируется на 22. Это означает, что входящее ssh-соединение может поступать как с порта 22, так и с порта 422.
iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22
Если вы сделаете это выше, вам также необходимо явно разрешить входящее соединение на порт 422.
iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW, ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT
25.Журнал отброшенных пакетов
Вы также можете зарегистрировать все отброшенные пакеты. Эти правила должны быть внизу.
Сначала создайте новую цепочку под названием LOGGING.
iptables -N РЕГИСТРАЦИЯ
Затем убедитесь, что все оставшиеся входящие соединения переходят в цепочку LOGGING, как показано ниже.
iptables -A ВХОД -j РЕГИСТРАЦИЯ
Затем зарегистрируйте эти пакеты, указав собственный «префикс журнала».
iptables -A LOGGING -m limit --limit 2 / min -j LOG --log-prefix «IPTables Packet Dropped:» --log-level 7
Наконец, отбросьте эти пакеты.
iptables -A РЕГИСТРАЦИЯ -j КАПЛЯ
Все вышеперечисленные 25 правил iptables имеют формат сценария оболочки: iptables-rules
Предыдущие статьи из серии iptables:
Если вам понравилась эта статья, возможно, вам также понравится ..
.
iptables — `iiptables input policy drop` становится` all forward drop`
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
Загрузка…
- Авторизоваться
.
Простой межсетевой экран с отслеживанием состояния — ArchWiki
На этой странице объясняется, как настроить брандмауэр с отслеживанием состояния с помощью iptables. Также объясняется, что означают правила и зачем они нужны. Для простоты он разделен на два основных раздела. В первом разделе рассматривается брандмауэр для отдельной машины, во втором настраивается шлюз NAT в дополнение к брандмауэру из первого раздела.
Предупреждение: Правила ниже даны в порядке их выполнения, и их следует соблюдать только при локальном входе в систему.Если вы вошли в систему на удаленной машине, вы можете быть заблокированы при настройке правил. Чтобы обойти эту проблему при удаленной настройке, можно использовать пример файла конфигурации.
Предварительные требования
Примечание: Ваше ядро должно быть скомпилировано с поддержкой iptables. Все стандартные ядра Arch Linux имеют поддержку iptables.
Сначала установите утилиты пользовательского уровня iptables или убедитесь, что они уже установлены.
В этой статье предполагается, что в настоящее время правила iptables отсутствуют.Чтобы проверить текущий набор правил и убедиться, что в настоящее время правил нет, выполните следующее:
# iptables-save
# Создано с помощью iptables-save v1.4.19.1 в четверг, 1 августа, 19:28:53 2013 г. *фильтр : ВВОД ПРИНЯТЬ [50: 3763] : FORWARD ACCEPT [0: 0] : OUTPUT ACCEPT [30: 3472] COMMIT # Завершено, 1 августа, 19:28:53 2013 г.
или
# iptables -nvL --line-numbers
Цепочка INPUT (политика ПРИНЯТЬ 156 пакетов, 12541 байт) num pkts bytes target prot opt in source назначение Цепочка FORWARD (политика ACCEPT 0 пакетов, 0 байтов) num pkts bytes target prot opt in source назначение ЦЕПНЫЙ ВЫХОД (политика ПРИНЯТЬ 82 пакета, 8672 байта) num pkts bytes target prot opt in source назначение
Если есть правила, вы можете сбросить их, загрузив набор правил по умолчанию:
# iptables-restore etc / iptables / empty.правила
В противном случае см. Iptables # Resetting rules.
Межсетевой экран для одной машины
Примечание: Поскольку iptables обрабатывает правила в линейном порядке, сверху вниз внутри цепочки, рекомендуется размещать часто используемые правила в начале цепочки. Конечно, есть предел, зависящий от реализуемой логики. Кроме того, правила имеют связанные затраты времени выполнения, поэтому правила не следует переупорядочивать исключительно на основе эмпирических наблюдений за счетчиками байтов / пакетов.
Создание необходимых цепочек
Для этой базовой настройки мы создадим две определяемые пользователем цепочки, которые мы будем использовать для открытия портов в брандмауэре.
# iptables -N TCP # iptables -N UDP
Цепи, конечно, могут иметь произвольные имена. Мы выбираем их только для соответствия протоколам, которые мы хотим обрабатывать с ними в более поздних правилах, которые указаны с параметрами протокола, например -p tcp
, всегда.
Цепь FORWARD
Если вы хотите настроить свой компьютер в качестве шлюза NAT, см. # Настройка шлюза NAT.Однако для одной машины мы просто устанавливаем политику цепочки FORWARD на DROP и переходим:
# iptables -P ПЕРЕДАЧА ОТПУСКА
Цепочка ВЫХОДА
Цепочка OUTPUT может быть мощным инструментом для фильтрации исходящего трафика, особенно для серверов и других устройств, на которых не работают веб-браузеры или одноранговые инструменты, которым необходимо подключаться к произвольным адресатам в Интернете. Однако для правильной настройки цепочки OUTPUT требуется информация о предполагаемом использовании системы.Безопасный набор правил для настольной системы, портативного компьютера, облачного сервера и домашнего / локального сервера будет сильно отличаться.
В этом простом примере мы разрешим весь исходящий трафик, установив политику по умолчанию для цепочки OUTPUT на ACCEPT . Это менее безопасно, но хорошо совместимо со многими системами.
# iptables -P ПРИНЯТЬ ВЫВОД
Цепь INPUT
Подобно предыдущим цепочкам, мы устанавливаем политику по умолчанию для цепочки INPUT на DROP на случай, если что-то каким-то образом проскочит по нашим правилам.Отказ от всего трафика и указание того, что разрешено, - лучший способ создать безопасный брандмауэр.
Предупреждение: Если вы вошли в систему через SSH, следующее немедленно отключит сеанс SSH. Чтобы этого избежать: (1) добавьте первое правило цепочки INPUT ниже (оно будет держать сеанс открытым), (2) добавьте обычное правило, разрешающее входящий SSH (чтобы иметь возможность повторно подключаться в случае разрыва соединения) и (3 ) установить политику.
# iptables -P ПАДЕНИЕ ВВОДА
Каждый пакет, полученный любым сетевым интерфейсом, сначала проходит цепочку INPUT , если он предназначен для этой машины.В этой цепочке мы следим за тем, чтобы были приняты только те пакеты, которые нам нужны.
Первое правило, добавленное в цепочку INPUT, разрешит трафик, принадлежащий установленным соединениям, или новый допустимый трафик, связанный с этими соединениями, например ошибки ICMP или эхо-ответы (пакеты, возвращаемые хостом при проверке связи). ICMP означает Протокол управляющих сообщений Интернета . Некоторые сообщения ICMP очень важны и помогают управлять перегрузкой и MTU и принимаются по этому правилу.
Состояние соединения ESTABLISHED
означает, что либо другое правило ранее разрешало начальную попытку соединения ( --ctstate NEW
), либо соединение уже было активным (например, активное удаленное соединение SSH) при настройке правила:
# iptables -A INPUT -m conntrack --ctstate СВЯЗАННЫЕ, УСТАНОВЛЕННЫЕ -j ПРИНЯТЬ
Второе правило будет принимать весь трафик от интерфейса «loopback» (lo), который необходим для многих приложений и служб.
Примечание: Вы можете добавить сюда дополнительные доверенные интерфейсы, такие как "eth2", если вы не хотите / не нуждаетесь в трафике, фильтруемом брандмауэром, но имейте в виду, что если у вас есть настройка NAT, которая перенаправляет любой трафик на этот интерфейс из любого другого места в сети (скажем, маршрутизатора) он пройдет, независимо от любых других настроек, которые у вас могут быть.
# iptables -A INPUT -i lo -j ACCEPT
Третье правило отбрасывает весь трафик с совпадением состояния «НЕДЕЙСТВИТЕЛЬНО».Трафик можно разделить на четыре категории «состояния»: НОВЫЙ, УСТАНОВЛЕННЫЙ, СВЯЗАННЫЙ или НЕДЕЙСТВИТЕЛЬНЫЙ, и именно это делает этот межсетевой экран с отслеживанием состояния, а не менее безопасным «без отслеживания состояния». Состояния отслеживаются с помощью модулей ядра «nf_conntrack_ *», которые автоматически загружаются ядром при добавлении правил.
Примечание:
- Это правило отбрасывает все пакеты с недопустимыми заголовками или контрольными суммами, недопустимыми флагами TCP, недопустимыми сообщениями ICMP (например, порт недоступен, когда мы ничего не отправляли на хост) и пакеты вне последовательности, которые могут быть вызваны предсказанием последовательности или другие подобные атаки.Цель "DROP" сбросит пакет без какого-либо ответа, в отличие от REJECT, который вежливо отклоняет пакет. Мы используем DROP, потому что нет правильного ответа «REJECT» на пакеты, которые являются INVALID, и мы не хотим подтверждать, что мы получили эти пакеты.
- Пакеты обнаружения соседей ICMPv6 остаются неотслеживаемыми и всегда будут классифицироваться как «НЕДЕЙСТВИТЕЛЬНЫЕ», хотя они не повреждены и т.п. Помните об этом и примите их перед этим правилом! iptables -A INPUT -p 41 -j ACCEPT
# iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
Следующее правило будет принимать все новые входящие эхо-запросы ICMP , также известные как эхо-запросы.Только первый пакет будет считаться НОВЫМ, остальные будут обрабатываться правилом СВЯЗАННЫЙ, УСТАНОВЛЕННЫЙ. Поскольку компьютер не является маршрутизатором, никакой другой трафик ICMP с состоянием NEW разрешать не нужно.
# iptables -A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
Теперь мы присоединяем цепочки TCP и UDP к цепочке INPUT для обработки всех новых входящих подключений. Как только соединение принимается цепочкой TCP или UDP, оно обрабатывается правилом трафика RELATED / ESTABLISHED.Цепочки TCP и UDP будут либо принимать новые входящие соединения, либо вежливо отклонять их. Новые TCP-соединения должны запускаться с помощью пакетов SYN.
Примечание. NEW, но не SYN - единственный недопустимый флаг TCP, не охваченный состоянием INVALID. Это потому, что они редко бывают вредоносными и их нельзя просто отбрасывать. Вместо этого они просто отклоняются с помощью TCP RESET по следующему правилу.
# iptables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP # iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
Мы отклоняем TCP-соединения с TCP-пакетами RESET и UDP-потоками с сообщениями о недоступности порта ICMP, если порты не открыты.Это имитирует поведение Linux по умолчанию (соответствует RFC) и позволяет отправителю быстро закрыть соединение и очистить.
# iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable # iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
Для других протоколов мы добавляем последнее правило в цепочку INPUT, чтобы отклонять весь оставшийся входящий трафик с сообщениями о недоступности протокола icmp. Это имитирует поведение Linux по умолчанию.
# iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable
Результат iptables.файл правил
Пример файла iptables.rules
после выполнения всех команд сверху:
/etc/iptables/iptables.rules
# Создано с помощью iptables-save v1.4.18, вс 17 марта, 14:21:12 2013 *фильтр : INPUT DROP [0: 0] : FORWARD DROP [0: 0] : OUTPUT ACCEPT [0: 0] : TCP - [0: 0] : UDP - [0: 0] -A INPUT -m conntrack --ctstate СВЯЗАННО, УСТАНОВЛЕНО -j ПРИНЯТЬ -A ВВОД -i lo -j ПРИНЯТЬ -A ВХОД -m conntrack --ctstate НЕДЕЙСТВИТЕЛЬНО -j DROP -A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT -A ВХОД -p udp -m conntrack --ctstate NEW -j UDP -A INPUT -p tcp --tcp-flags FIN, SYN, RST, ACK SYN -m conntrack --ctstate NEW -j TCP -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -j REJECT --reject-with icmp-proto-unreachable COMMIT # Завершено вс, 17 мар, 14:21:12 2013
Этот файл можно сгенерировать и сохранить с помощью:
# iptables-save -f / и т.д. / iptables / iptables.правила
и может использоваться для продолжения работы в следующих разделах. Если вы настраиваете брандмауэр удаленно через SSH, добавьте следующее правило, чтобы разрешить новые соединения SSH, прежде чем продолжить (при необходимости настройте порт):
-A TCP -p tcp --dport 22 -j ПРИНЯТЬ
Цепочки TCP и UDP
Цепочки TCP и UDP содержат правила для приема новых входящих TCP-соединений и потоков UDP к определенным портам.
Примечание: Здесь вам нужно добавить правила для приема входящих соединений, таких как SSH, HTTP или других служб, к которым вы хотите получить удаленный доступ.
Открытие портов для входящих подключений
Чтобы принимать входящие TCP-соединения через порт 80 для веб-сервера:
# iptables -A TCP -p tcp --dport 80 -j ПРИНЯТЬ
Чтобы принимать входящие TCP-соединения через порт 443 для веб-сервера (HTTPS):
# iptables -A TCP -p tcp --dport 443 -j ПРИНЯТЬ
Чтобы разрешить удаленные SSH-соединения (через порт 22):
# iptables -A TCP -p tcp --dport 22 -j ПРИНЯТЬ
Чтобы принимать входящие запросы TCP / UDP для DNS-сервера (порт 53):
# iptables -A TCP -p tcp --dport 53 -j ПРИНЯТЬ # iptables -A UDP -p udp --dport 53 -j ПРИНЯТЬ
См. Iptables (8) для более сложных правил, таких как сопоставление нескольких портов.
Порт стук
Блокировка портов - это метод внешнего открытия портов, которые по умолчанию брандмауэр держит закрытыми. Он работает, требуя попыток подключения к серии предопределенных закрытых портов. Когда получена правильная последовательность «стуков» (попыток подключения) порта, брандмауэр открывает определенные порты, чтобы разрешить соединение. См. «Стук в порте» для получения дополнительной информации.
Защита от спуфинговых атак
Примечание: rp_filter
в настоящее время установлен на 2
по умолчанию в / usr / lib / sysctl.d / 50-default.conf
, поэтому в следующем шаге нет необходимости.
Блокировка зарезервированных локальных адресов, входящих из Интернета или локальной сети, обычно выполняется путем установки rp_filter
(фильтр обратного пути) в sysctl на 1. Для этого добавьте следующую строку в свой /etc/sysctl.d/90- Файл firewall.conf
(подробности см. в sysctl), чтобы включить проверку адреса источника, встроенную в само ядро Linux. Проверка ядром обрабатывает спуфинг лучше, чем отдельные правила iptables для каждого случая.
net.ipv4.conf.all.rp_filter = 1
Это можно сделать с помощью netfilter, если требуется статистика (и лучшая регистрация):
# iptables -t raw -I PREROUTING -m rpfilter --invert -j DROP
Примечание: Нет причин включать это в обоих местах. Метод netfilter - это современный выбор, он также работает с IPv6.
Для нишевых конфигураций, в которых используется асинхронная маршрутизация, вместо этого необходимо использовать параметр sysctl rp_filter = 2
.Передача переключателя --loose
модулю rpfilter
приведет к тому же результату с netfilter.
«Скрыть» свой компьютер
Если у вас настольный компьютер, было бы неплохо заблокировать некоторые входящие запросы.
Блокировать запрос ping
Ping-запрос - это пакет ICMP, отправленный на адрес назначения для обеспечения возможности соединения между устройствами. Если ваша сеть работает нормально, вы можете безопасно заблокировать все запросы ping. Важно отметить, что этот на самом деле не скрывает ваш компьютер - любой отправленный вам пакет отклоняется, поэтому вы все равно будете отображаться в простом "ping-сканировании" nmap диапазона IP-адресов.
Это элементарная «защита», которая усложняет жизнь при отладке проблем в будущем. Это следует делать только в образовательных целях.
Чтобы заблокировать эхо-запросы, добавьте следующую строку в файл /etc/sysctl.d/90-firewall.conf
(подробности см. В sysctl):
net.ipv4.icmp_echo_ignore_all = 1
Более подробная информация находится на странице руководства iptables или в документации и примерах на веб-странице http://www.snowman.net/projects/ipt_recent/
Обман сканеров портов
Примечание:
- Это открывает перед вами некую форму DoS.Атака может отправлять пакеты с поддельными IP-адресами и блокировать их подключение к вашим сервисам.
- Этот трюк может заблокировать допустимый IP-адрес, если некоторые пакеты с этого адреса на порт назначения будут расценены модулем conntrack как НЕДЕЙСТВИТЕЛЬНЫЕ. Чтобы избежать попадания в черный список, можно разрешить все пакеты, направляемые на этот конкретный порт назначения.
Сканирование портов используется злоумышленниками для выявления открытых портов на вашем компьютере. Это позволяет им идентифицировать и идентифицировать ваши работающие службы и, возможно, запускать против них эксплойты.
Правило состояния INVALID заботится обо всех типах сканирования портов, кроме сканирования UDP, ACK и SYN (-sU, -sA и -sS в nmap соответственно).
Сканирование ACK не используется для идентификации открытых портов, а для идентификации портов, отфильтрованных брандмауэром. Благодаря проверке SYN для всех TCP-соединений с состоянием NEW, каждый отдельный пакет, отправленный сканированием ACK, будет правильно отклонен пакетом TCP RESET. Некоторые брандмауэры вместо этого отбрасывают эти пакеты, и это позволяет злоумышленнику определить правила брандмауэра.
Последний модуль можно использовать для обмана двух оставшихся типов сканирования портов. Модуль «Последние» используется для добавления хостов в «недавний» список, который можно использовать для снятия отпечатков пальцев и остановки определенных типов атак. Текущие недавние списки можно просмотреть в / proc / net / xt_recent /
.
SYN сканирование
При сканировании SYN сканер портов отправляет пакет SYN (синхронизации) на каждый порт, чтобы инициировать TCP-соединение. Закрытые порты возвращают пакет TCP RESET или отбрасываются строгим межсетевым экраном, а открытые порты возвращают пакет SYN ACK.
Модуль latest
может использоваться для отслеживания хостов с отклоненными попытками подключения и возврата TCP RESET для любого SYN-пакета, который они отправляют на открытые порты, как если бы порт был закрыт. Если первым будет просканирован открытый порт, SYN ACK все равно будет возвращен, поэтому для стабильной работы требуется запуск приложений, таких как ssh, на нестандартных портах.
Сначала вставьте правило в начало цепочки TCP. Это правило отвечает TCP RESET на любой хост, который попал в список TCP-PORTSCAN
за последние шестьдесят секунд.Переключатель --update
вызывает обновление последнего списка, что означает сброс 60-секундного счетчика.
# iptables -I TCP -p tcp -m latest --update --rsource --seconds 60 --name TCP-PORTSCAN -j REJECT --reject-with tcp-reset
Затем необходимо изменить правило отклонения пакетов TCP, чтобы добавить узлы с отклоненными пакетами в список TCP-PORTSCAN
.
# iptables -D INPUT -p tcp -j REJECT --reject-with tcp-reset # iptables -A INPUT -p tcp -m latest --set --rsource --name TCP-PORTSCAN -j REJECT --reject-with tcp-reset
UDP сканирование
Сканирование портов UDP
похоже на сканирование TCP SYN, за исключением того, что UDP является протоколом «без установления соединения».Нет никаких рукопожатий или подтверждений. Вместо этого сканер отправляет UDP-пакеты на каждый UDP-порт. Закрытые порты должны возвращать сообщения ICMP о недоступности порта, а открытые порты не возвращают ответ. Поскольку UDP не является «надежным» протоколом, сканер не может узнать, были ли потеряны пакеты, и должен выполнять несколько проверок для каждого порта, который не возвращает ответ.
Ядро Linux отправляет сообщения ICMP о недоступности порта очень медленно, поэтому полное сканирование UDP на компьютере Linux займет более 10 часов.Однако общие порты все же можно идентифицировать, поэтому применение тех же мер против сканирования UDP, что и сканирование SYN, является хорошей идеей.
Во-первых, добавьте правило отклонения пакетов от хостов из списка UDP-PORTSCAN
в начало цепочки UDP.
# iptables -I UDP -p udp -m latest --update --rsource --seconds 60 --name UDP-PORTSCAN -j REJECT --reject-with icmp-port-unreachable
Затем измените правило отклонения пакетов для UDP:
# iptables -D INPUT -p udp -j REJECT --reject-with icmp-port-unreachable # iptables -A INPUT -p udp -m latest --set --rsource --name UDP-PORTSCAN -j REJECT --reject-with icmp-port-unreachable
Восстановить окончательное правило
Если использовался один или оба из описанных выше приемов сканирования портов, последнее правило по умолчанию больше не является последним правилом в цепочке INPUT.Это должно быть последнее правило, иначе оно перехватит только что добавленные вами правила сканера портов и , сделав их бесполезными. Просто удалите (-D) правило, затем добавьте его снова с помощью добавления (-A), которое поместит его в конец цепочки.
# iptables -D INPUT -j REJECT --reject-with icmp-proto-unreachable # iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable
Защита от других атак
См. Соответствующие параметры ядра в sysctl # TCP / IP stack harden.
Брутфорс атаки
К сожалению, брутфорс-атаки на сервисы, доступные через внешний IP-адрес, являются обычным явлением. Одна из причин этого заключается в том, что атаки легко выполнять с помощью множества доступных инструментов. К счастью, есть несколько способов защитить службы от них. Одним из них является использование соответствующих правил iptables
, которые активируют и заносят в черный список IP-адрес после того, как заданное количество пакетов попытается инициировать соединение. Другой - использование специализированных демонов, которые отслеживают неудачные попытки в лог-файлах и заносят их в черный список.
Предупреждение: Использование черного списка IP-адресов остановит тривиальные атаки, но для этого требуется дополнительный демон и успешное ведение журнала (раздел, содержащий / var
, может стать заполненным, особенно если злоумышленник обрушивается на сервер). Кроме того, зная ваш IP-адрес, злоумышленник может отправлять пакеты с поддельным заголовком источника и блокировать вас на сервере. Ключи SSH предоставляют элегантное решение проблемы перебора без этих проблем.
Два пакета, которые запрещают IP-адреса после слишком большого количества сбоев пароля, - это Fail2ban или, в частности, для sshd
, Sshguard.Эти два приложения обновляют правила iptables, чтобы временно или навсегда отклонить будущие подключения от злоумышленников.
Следующие правила дают пример конфигурации для смягчения атак SSH bruteforce с использованием iptables
.
# iptables -N IN_SSH # iptables -N LOG_AND_DROP # iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -j IN_SSH # iptables -A IN_SSH -m недавний --name sshbf --rttl --rcheck --hitcount 3 --seconds 10 -j LOG_AND_DROP # iptables -A IN_SSH -m недавнее --name sshbf --rttl --rcheck --hitcount 4 --seconds 1800 -j LOG_AND_DROP # iptables -A IN_SSH -m недавний --name sshbf --set -j ACCEPT # iptables -A LOG_AND_DROP -j LOG --log-prefix "iptables deny:" --log-level 7 # iptables -A LOG_AND_DROP -j DROP
Большинство правил не требуют пояснений: первое разрешает максимум три пакета подключения за десять секунд и отбрасывает дальнейшие попытки с этого IP.Следующее правило добавляет причуду, позволяя максимум четыре удара за 30 минут. Это сделано потому, что некоторые атаки методом перебора на самом деле выполняются медленно, а не серией попыток. Правила используют ряд дополнительных опций. Чтобы узнать больше о них, проверьте исходную ссылку для этого примера на compilefailure.blogspot.com. Цепочка LOG_AND_DROP используется для регистрации разорванных соединений.
Приведенные выше правила можно использовать для защиты любой службы, хотя, вероятно, наиболее часто требуется демон SSH.
С точки зрения порядка необходимо убедиться, что -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -j IN_SSH
находится в правильной позиции в последовательности iptables: он должен стоять перед цепочкой TCP прикреплен к INPUT, чтобы сначала поймать новые SSH-соединения. Если все предыдущие шаги этой вики были выполнены, работает следующее позиционирование:
... -A ВХОД -m conntrack --ctstate НЕДЕЙСТВИТЕЛЬНО -j DROP -A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT -A ВХОД -p tcp --dport 22 -m conntrack --ctstate NEW -j IN_SSH -A ВХОД -p udp -m conntrack --ctstate NEW -j UDP -A INPUT -p tcp --tcp-flags FIN, SYN, RST, ACK SYN -m conntrack --ctstate NEW -j TCP ...
Совет: Для самотестирования правил после настройки фактическое занесение в черный список может замедлить тест, что затруднит точную настройку параметров. Наблюдать за входящими попытками можно через cat / proc / net / xt_recent / sshbf
. Для разблокировки собственного IP во время тестирования нужен root echo /> / proc / net / xt_recent / sshbf
IPv6
Если вы не используете IPv6, вы можете рассмотреть возможность его отключения, в противном случае выполните следующие действия, чтобы включить правила брандмауэра IPv6.
Скопируйте правила IPv4, используемые в этом примере, в качестве основы и измените любые IP-адреса с формата IPv4 на формат IPv6:
# cp /etc/iptables/iptables.rules /etc/iptables/ip6tables.rules
Некоторые правила в этом примере необходимо адаптировать для использования с IPv6. Протокол ICMP был обновлен в IPv6, заменив протокол ICMP для использования с IPv4. Следовательно, коды возврата ошибки отклонения --reject-with icmp-port-unreachable
и --reject-with icmp-proto-unreachable
должны быть преобразованы в коды ICMPv6.
Доступные коды ошибок ICMPv6 перечислены в RFC 4443, который указывает, что попытки подключения, заблокированные правилом брандмауэра, должны использовать --reject-with icmp6-adm -hibited
. Это в основном проинформирует удаленную систему о том, что соединение было отклонено брандмауэром, а не службой прослушивания.
Если предпочтительно не сообщать явным образом о существовании фильтра межсетевого экрана, пакет также может быть отклонен без сообщения:
-A ВВОД -j ОТКЛОНЕНИЕ
Вышеупомянутое будет отклонено с возвращаемой ошибкой по умолчанию --reject-with icmp6-port-unreachable
.Однако следует отметить, что идентификация брандмауэра является основной функцией приложений сканирования портов, и большинство из них идентифицирует его независимо.
Эту статью или раздел необходимо расширить.
На следующем этапе убедитесь, что протокол и расширение изменены на IPv6, соответствующие правилу, касающемуся всех новых входящих эхо-запросов ICMP (ping):
# ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 128 -m conntrack --ctstate NEW -j ACCEPT
Netfilter conntrack, похоже, не отслеживает протокол обнаружения соседей ICMPv6 (IPv6-эквивалент ARP), поэтому нам необходимо разрешить трафик ICMPv6 независимо от состояния для всех напрямую подключенных подсетей.Следующее должно быть вставлено после отбрасывания --ctstate INVALID
, но перед любыми другими целями DROP или REJECT вместе с соответствующей строкой для каждой непосредственно подключенной подсети:
# ip6tables -A INPUT -s fe80 :: / 10 -p ipv6-icmp -j ПРИНЯТЬ
Поскольку для IPv6 нет фильтра обратного пути ядра, вы можете включить его в ip6tables следующим образом:
# ip6tables -t raw -A PREROUTING -m rpfilter -j ACCEPT # ip6tables -t raw -A PREROUTING -j DROP
Сохранение правил
Наборы правил завершены и должны быть сохранены в файл, чтобы их можно было загружать при каждой загрузке.
Сохраните правила IPv4 и IPv6 с помощью следующих команд:
# iptables-save -f /etc/iptables/iptables.rules # ip6tables-save -f /etc/iptables/ip6tables.rules
Результирующий файл ip6tables.rules
Пример файла ip6tables.rules
после выполнения всех вышеперечисленных команд:
/etc/iptables/ip6tables.rules
# Создано с помощью ip6tables-save v1.8.2 в сб, 20 апреля, 10:53:41 2019 *фильтр : INPUT DROP [0: 0] : FORWARD DROP [0: 0] : OUTPUT ACCEPT [0: 0] : TCP - [0: 0] : UDP - [0: 0] -A INPUT -m conntrack --ctstate СВЯЗАННО, УСТАНОВЛЕНО -j ПРИНЯТЬ -A ВВОД -i lo -j ПРИНЯТЬ -A ВХОД -m conntrack --ctstate НЕДЕЙСТВИТЕЛЬНО -j DROP -A ВВОД -s fe80 :: / 10 -p ipv6-icmp -j ПРИНЯТЬ -A ВХОД -p udp -m conntrack --ctstate NEW -j UDP -A ВХОД -p tcp -m tcp --tcp-flags FIN, SYN, RST, ACK SYN -m conntrack --ctstate NEW -j TCP -A INPUT -p udp -j REJECT --reject-with icmp6-adm -hibited -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -j REJECT --reject-with icmp6-adm -hibited -A ВВОД -p ipv6-icmp -m icmp6 --icmpv6-type 128 -m conntrack --ctstate NEW -j ACCEPT COMMIT # Завершено 20 апр, сб, 10:53:41 2019
Затем включите и запустите iptables.service
и ip6tables.service
. Проверьте статус служб, чтобы убедиться, что правила загружены правильно.
Настройка NAT-шлюза
В этом разделе руководства рассматриваются шлюзы NAT. Предполагается, что вы уже прочитали первую часть руководства и настроили цепочки INPUT , OUTPUT , TCP и UDP , как описано выше. Все правила до сих пор были созданы в таблице filter . В этом разделе нам также придется использовать таблицу nat .
Настройка таблицы фильтров
Создание необходимых цепочек
В нашей настройке мы создадим две новые цепочки в таблице фильтров, fw-interfaces и fw-open , используя следующие команды:
# iptables -N fw-интерфейсы # iptables -N fw-open
Настройка цепочки FORWARD
Настройка цепочки FORWARD аналогична настройке цепочки INPUT в первом разделе.
Теперь мы устанавливаем правило с совпадением conntrack , идентичное правилу в цепочке INPUT :
# iptables -A FORWARD -m conntrack --ctstate СВЯЗАННЫЕ, УСТАНОВЛЕННЫЕ -j ПРИНЯТЬ
Следующим шагом будет включение пересылки для доверенных интерфейсов и передача всех пакетов по цепочке fw-open .
# iptables -A FORWARD -j fw-interfaces # iptables -A ВПЕРЕД -j fw-open
Остальные пакеты отклоняются сообщением ICMP :
# iptables -A FORWARD -j REJECT --reject-with icmp-host-unreachable # iptables -P FORWARD DROP
Настройка fw-интерфейсов и fw-open цепочек
Значение цепочек fw-interfaces и fw-open объяснено позже, когда мы будем иметь дело с цепочками POSTROUTING и PREROUTING в таблице nat соответственно.
Настройка нат таблицы
В этом разделе мы предполагаем, что исходящий интерфейс (тот, у которого есть общедоступный IP-адрес в Интернете) - это ppp0 . Имейте в виду, что вы должны изменить имя во всех следующих правилах, если ваш исходящий интерфейс имеет другое имя.
Настройка цепочки POSTROUTING
Теперь мы должны определить, кому разрешено подключаться к Интернету. Предположим, у нас есть подсеть 192.168.0.0/24 (что означает, что все адреса имеют форму 192.168.0. *) На eth0 . Сначала нам нужно принять машины на этом интерфейсе в таблице FORWARD, поэтому мы создали цепочку fw-interfaces выше:
# iptables -A fw-interfaces -i eth0 -j ПРИНЯТЬ
Теперь мы должны изменить все исходящие пакеты так, чтобы в качестве адреса источника использовался наш общедоступный IP-адрес, а не адрес локальной сети. Для этого мы используем цель MASQUERADE :
# iptables -t nat -A РАЗВЕДКА -s 192.168.0.0 / 24 -o ppp0 -j МАСКАРАД
Не забудьте указать выше параметр -o ppp0 . Если вы его пропустите, ваша сеть будет повреждена.
Предположим, у нас есть другая подсеть, 10.3.0.0/16 (что означает все адреса 10.3. *. *), На интерфейсе eth2 . Мы снова добавляем те же правила, что и выше:
# iptables -A fw-interfaces -i eth2 -j ПРИНЯТЬ # iptables -t nat -A POSTROUTING -s 10.3.0.0/16 -o ppp0 -j MASQUERADE
Последний шаг - включить пересылку пакетов (если она еще не включена).
Машины из этих подсетей теперь могут использовать вашу новую машину NAT в качестве шлюза. Обратите внимание, что вы можете настроить DNS и DHCP-сервер, например dnsmasq, или комбинацию BIND и dhcpd, чтобы упростить сетевые настройки разрешения DNS на клиентских машинах. Это не тема данного руководства.
Настройка цепи PREROUTING
Иногда нам нужно изменить адрес входящего пакета от шлюза к машине LAN. Для этого мы используем определенную выше цепочку fw-open , а также цепочку PREROUTING в таблице nat в следующих двух простых примерах.
Во-первых, мы хотим изменить все входящие SSH-пакеты (порт 22) на ssh-сервер машины 192.168.0.5 :
# iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 22 -j DNAT --to 192.168.0.5 # iptables -A fw-open -d 192.168.0.5 -p tcp --dport 22 -j ПРИНЯТЬ
Второй пример покажет вам, как изменить пакеты на порт, отличный от входящего. Мы хотим изменить любое входящее соединение на порту 8000 на наш веб-сервер на 192.168.0.6 , порт 80 :
# iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 8000 -j DNAT --to 192.168.0.6:80 # iptables -A fw-open -d 192.168.0.6 -p tcp --dport 80 -j ПРИНЯТЬ
Та же самая настройка также работает с пакетами udp.
Сохранение правил
Сохраните правила:
# iptables-save -f /etc/iptables/iptables.rules
Предполагается, что вы выполнили описанные выше действия, чтобы включить службу iptables systemd.
См. Также
.