Как загрузить правила iptables
Для ручного восстановления настроек можно использовать вызов утилиты iptables-restore. Она восстанавливает настройки брандмауэра Netfilter с указанного файла или из потока ввода STDIN, если файл не задан явно. Рассмотрим синтаксис iptables-restore:
iptables-restore
Основные опции:
- -c: восстанавливает значения всех счетчиков пакетов и байтов;
- -n: позволяет не сбрасывать содержимое правил обновляемой таблицы правил iptables. Если не указан — все текущие правила обновляемой таблицы сбрасываются. Получается, что правила из файла дописываются в конец таблиц рабочей конфигурации, если указан этот параметр;
- -t: происходит только сборка и тестирование набора правил из файла, без обновление рабочей таблицы правил iptables;
- -v: выводит дополнительную отладочную информацию в течении восстановления набора правил;
- -V: выводит номер версии программы;
- -w секунды: дождаться монопольной блокировки фильтра пакетов ядра linux xtables. Применяется, чтобы предотвратить одновременное выполнение нескольких экземпляров утилиты. Опция заставляет ждать программу в течении некоторого времени возможности монопольной блокировки xtables;
- -W миллисекунды: интервал ожидания для каждой попытки запуска пакета в монопольном режиме. Часто многие приложения системы критичны к времени запуска и выполнения, поэтому длительное ожидания для монопольной блокировки xtables часто является неприемлемым. Данный параметр в миллисекундах задает максимальное время такого ожидания. По умолчанию равно 1 секунде. Применяется только совместно с ключом -w;
- -M modprobe: Указывает путь к программе modprobe. По умолчанию iptables-restore проверяет /proc/sys/kernel/modprobe для определения пути к исполняемому файлу. modprobe — утилита управления модулями ядра. Существует несколько вариантов данной утилиты. Данный параметр можно проигнорировать;
- -T таблица: Восстанавливает только таблицу правил с указанным именем, даже если поток данных содержит другие таблицы;
- имя файла: путь до файла с восстанавливаемыми таблицами правил в файловой системе
Вот пример команды iptables-restore:
Или вариант восстановления правил из файла без сброса содержимого текущих таблиц Netfilter:
iptables-persistent в Debian & Ubuntu
Почти то же, что и iptables-services, только немного неудобнее.
# Устанавливаем apt-get -y install iptables-persistent
Во время установки будет задано два вопроса, на которые следует ответить положительно.
После установки в каталоге /etc/iptables появятся файлы rules.v4 и rules.v6. В эти файлы будут записываться правила межсетевого экрана.
Управление правилами при помощи iptables-persistent немного отличается от iptables-services в более неудобную сторону. После добавления новых правил через консоль, следует выполнять команду для их сохранения.
dpkg-reconfigure iptables-persistent
Команда записывает изменения правил в файл /etc/iptables/rules.v4, в процессе выполнения запрашивается подтверждение. Если после добавления нового правила вы не выполните эту команду, то оно будет работать только до первой перезагрузки или отключения системы.
Автоматически сохранять текущие правила при перезагрузке iptables-persistent не может.
Для подстраховки можно воспользоваться рассмотренным выше способом и добавить в файл /etc/network/interfaces, команду для автоматического сохранения правил.
post-down iptables-save > /etc/iptables/rules.v4
Также после установки пакета появляется демон netfilter-persistent при помощи которого можно управлять правилами iptables.
При выполнении команды —help можно посмотреть список доступных команд для управления.
netfilter-persistent --help Usage: /usr/sbin/netfilter-persistent (start|stop|restart|reload|flush|save)
Выполняться они могут через команду — service
- service netfilter-persistent start — запустить сервис
- service netfilter-persistent stop — остановить сервис
- service netfilter-persistent restart — перезапустить сервис
- service netfilter-persistent reload — восстановить правила из файлов rules.v4/rules.v6
- service netfilter-persistent save — сохранить правила в файлы rules.v4/rules.v6
- service netfilter-persistent flush — полностью очищает текущие правила, все становится открыто, но не очищает файл с записанными правилами. Поэтому после перезагрузки, правила из файла считаются и загрузятся снова, если его предварительно не очистить.
Таким образом для сохранения правил можно пользоваться как dpkg-reconfigure так и service netfilter-persistent save, например.
Открытие портов
Теперь немного расширим нашу конфигурацию и откроем в iptables порты для некоторых сервисов. Допустим, у нас работает веб-сервер и необходимо открыть к нему доступ из интернета. Добавляем правила для веб-трафика:
Было добавлено разрешение на входящие соединения по 80-му и 443-му портам, которые использует web сервер в своей работе.
Если у вас установлен почтовый сервер, то нужно разрешить на него входящие соединения по всем используемым портам:
Для корректной работы DNS сервера, нужно открыть UDP порт 53
И так далее. По аналогии можете открыть доступ для всех необходимых сервисов.
Accept Other Necessary Connections
We have told iptables to keep open any connections that are already open and to allow new connections related to those connections. However, we need to create some rules to establish when we want to accept new connections that don’t meet those criteria.
We want to keep two ports open specifically. We want to keep our SSH port open (we’re going to assume in this guide that this is the default 22. If you’ve changed this in your SSH configuration, modify your value here). We are also going to assume that this computer is running a web server on the default port 80. If this is not the case for you, you don’t have to add that rule.
The two lines we’re going to use to add these rules are:
As you can see, these are very similar to our first rule, but perhaps more simple. The new options are:
- -p tcp: This option matches packets if the protocol being used is TCP. This is a connection-based protocol that will be used by most applications because it allows for reliable communication.
- –dport: This option is available if the flag is given. It gives a further requirement of matching the destination port for the matching packet. The first rule matches for TCP packets destined for port 22, while the second rule matches TCP traffic pointed towards port 80.
There is one more accept rule that we need to ensure that our server can function correctly. Often, services on the computer communicate with each other by sending network packets to each other. They do this by utilizing a pseudo network interface called the , which directs traffic back to itself rather than to other computers.
So if one service wants to communicate with another service that is listening for connections on port 4555, it can send a packet to port 4555 of the loopback device. We want this type of behavior to be allowed, because it is essential for the correct operation of many programs.
The rule we need to add is this:
This looks a bit different than our other commands. Let’s go over what it is doing:
-I INPUT 1: The -I flag tells iptables to insert a rule. This is different than the -A flag which appends a rule to the end. The -I flag takes a chain and the rule position where you want to insert the new rule.
In this case, we’re adding this rule as the very first rule of the INPUT chain. This will bump the rest of the rules down. We want this at the top because it is fundamental and should not be affected by subsequent rules.
-i lo: This component of the rule matches if the interface that the packet is using is the “lo” interface. The “lo” interface is another name for the loopback device. This means that any packet using that interface to communicate (packets generated on our server, for our server) should be accepted.
To see our current rules, we should use the flag. This is because the flag doesn’t include some information, like the interface that a rule is tied to, which is an important part of the rule we just added:
Базовый фаервол
Изначально текущие правила разрешают все входящие и исходящие соединения. Такое поведение подвергает сервер опасности. При разработке таблицы правил следует помнить о том, что как только пакет принят (ACCEPTED), отклонён (REJECTED) или сброшен (DROPPED), он не будет проверяться остальными правилами. То есть правила, которые находятся в начале таблицы, имеют приоритет над остальными.
Во время создания правил нужно иметь в виду риск заблокировать себя на собственном сервере (например, запретив подключения SSH).
Для начала нужно разрешить все текущие соединения.
Данная команда состоит из следующих опций:
- -A добавляет правило в таблицу.
- INPUT определяет это правило в цепочку input.
- m conntrack вместе с опцией –cstate ESTABLISHED,RELATED применяет результат данной команды к текущим соединениям и связанным с ними разрешённым соединениям.
- -j ACCEPT переносит пакет в accept и принимает текущие соединения.
Теперь текущие соединения сервера не будут заблокированы. Можно приступить к блокировке опасных подключений.
К примеру, чтобы заблокировать весь исходящий трафик, кроме портов 22 (SSH) и 80 (трафик веб-сервера), нужно сначала разрешить подключения к этим портам:
Опция -p в этих командах задаёт протокол, при помощи которого будут созданы подключения (в данном случае – tcp), а опция –dport указывает порт, по которому будет передаваться пакет.
Разрешив трафик на эти порты, можно заблокировать остальной трафик. Поскольку это правило будет находиться в конце списка, любой трафик, отвечающий предыдущим правилам, не будет затронут.
Чтобы заблокировать остальной трафик, создайте правило:
Итак, теперь список правил выглядит так:
Осталось добавить всего одно правило, которое настроит кольцевую проверку (или loopback). Имейте в виду, что без следующих опций это попадёт в конец списка и никогда не будет использовано, поскольку оно будет идти после правила блокировки всего трафика.
Чтобы избежать этого, нужно сделать это правило первым в списке при помощи опции INPUT.
- -I INPUT 1 помещает правило в начало списка.
- lo пропускает пакеты, которые используют интерфейс loopback.
- -j ACCEPT будет принимать трафик loopback.
Итак, теперь все правила брандмауэра настроены. Полный список правил выглядит так (опция –v выведет дополнительные сведения):
Однако правила iptables действительны в течение одной сессии и будут сброшены после перезагрузки сервера.
Основы Iptables
Все данные передаются по сети в виде пакетов. Ядро Linux предоставляет интерфейс для фильтрации пакетов входящего и исходящего трафика при помощи специальных таблиц. Iptables — это приложение командной строки и межсетевой экран для Linux, которым можно пользоваться для создания, поддержания работоспособности и проверки этих таблиц.
Можно создать несколько таблиц. В каждой таблице может содержаться несколько цепочек. Цепочка — это набор правил. Каждое правило определяет, что делать с пакетом, если он соответствует условиям. При соответствии пакета над ним выполняется целевое действие (TARGET). Это может быть проверка следующей цепочкой или один из следующих вариантов:
- ACCEPT: разрешить передачу пакета.
- DROP: запретить передачу пакета.
- RETURN: пропустить текущую цепочку и перейти к следующему правилу в цепочке, которая ее вызвала.
В данном руководстве мы будем работать с одной из таблиц по умолчанию, которая называется фильтром (filter). В таблице фильтра есть три цепочки (набора правил):
- INPUT – используется для контроля входящих пакетов. Можно разрешать или блокировать подключения по порту, протоколу или IP-адресу источника.
- FORWARD – используется для фильтрации пакетов, приходящих на сервер, но перенаправляемых куда-либо еще.
- OUTPUT – используется для фильтрации исходящих пакетов.
Сохранение введенных правил при перезагрузке
Все введенные в консоли правила — после перезагрузки ОС будут сброшены в первоначальное состояние (читай — удалены). Для того чтобы сохранить все введенные команды iptables, существует несколько путей. Например, один из них — задать все правила брандмауэра в файле инициализации . Но у данного способа есть существенный недостаток: весь промежуток времени с запуска сетевой подсистемы, до запуска последней службы и далее скрипта rc.local из SystemV операционная система будет не защищена. Представьте ситуацию, например, если какая-нибудь служба (например NFS) стартует последней и при ее запуске произойдет какой-либо сбой и до запуска скрипта rc.local. Соответственно, rc.local так и не запуститься, а наша система превращается в одну большую дыру.
Поэтому самой лучшей идеей будет инициализировать правила netfilter/iptables при загрузке сетевой подсистемы. Для этого в Debian есть отличный инструмент — каталог /etc/network/if-up.d/, в который можно поместить скрипты, которые будут запускаться при старте сети. А так же есть команды iptables-save и iptables-restore, которые сохраняют создают дамп правил netfilter из ядра на и восстанавливают в ядро правила со соответственно.
Итак, алгоритм сохранения 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 :FORWARD ACCEPT ....... # комментарий -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, задающие необходимые правила.
Итог
На сегодня будет достаточно. Более сложные реализации межсетевого экрана я обязательно будут публиковаться в следующих статьях.
Проброс портов
Если в вашей внутренней сети есть сервер, который должен быть доступен извне, можно воспользоваться целевым действием -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.
Проверяем открытость / закрытость портов:
Проверяем открытость / закрытость определенного порта:
Проверим, что iptables разрешает соединение с 80 портом:
В противном случае откроем его для всех:
Проверяем с помощью telnet
Можно использовать nmap для проверки:
Автор статьи Platon Puhlechev aka iFalkorr разрешает печатать данный текст.
Iptables отличный инструмент в руках администратора. Если нужно легко и просто защититься в десктопной Ubuntu, то стоит знать, что есть удобная консольная надстройка над iptables под названием UFW, а к ней есть графическая программа GUFW. Сделать свою Ubuntu ещё более защищённой поможет видеоматериал.
Дополнительные материалы:Графический GUI для файрвола iptables — Gufw.Запрещаем приложению доступ в сеть.Безопасный сёрфинг в Интернете.
Дата последней правки: 2015-12-01 09:22:48
Базовая конфигурация
Ниже приведён пример базовой статической конфигурации iptables
При сохранении и загрузке подобной конфигурации необходимо принимать во внимание возможность внесения в неё изменений со стороны других сервисов, например Fail2ban. Кроме того, при использовании IPv6-адресации конфигурацию для IPv6 следует выполнять независимо от IPv4.
IPv4
Просмотр текущей конфигурации:
sudo iptables-save
Создаём скрипт с дампом правил iptables:
sudo nano etcnetworkif-up.diptables-rules
Копируем следующий код:
#!/sbin/iptables-restore # Таблица filter и её цепочки *filter :INPUT ACCEPT : :FORWARD ACCEPT : :OUTPUT ACCEPT : # Разрешаем связанные и установленые соединения -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Разрешаем служебный icmp-трафик -A INPUT -p icmp -j ACCEPT # Разрешаем доверенный трафик на интерфейс loopback -A INPUT -i lo -j ACCEPT # Сюда можно вставлять дополнительные правила для цепочки INPUT # Запрещаем всё остальное для INPUT -A INPUT -j REJECT --reject-with icmp-host-prohibited # Порядок и смысл правил для цепочек FORWARD и OUTPUT аналогичен INPUT -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -p icmp -j ACCEPT -A FORWARD -j REJECT --reject-with icmp-host-prohibited # Фильтровать цепочку OUTPUT настоятельно не рекомендуется #-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT #-A OUTPUT -p icmp -j ACCEPT #-A OUTPUT -o lo -j ACCEPT #-A OUTPUT -j REJECT --reject-with icmp-host-prohibited COMMIT
Дополняем нужными правилами с учётом iptables-save.
Сохраняем и закрываем: Ctrl+O, Enter, Ctrl+X
Делаем скрипт исполняемым и загружаем правила iptables:
sudo chmod +x etcnetworkif-up.diptables-rules sudo etcnetworkif-up.diptables-rules
IPv6
Просмотр текущей конфигурации:
sudo ip6tables-save
Создаём скрипт с дампом правил ip6tables:
sudo nano etcnetworkif-up.dip6tables-rules
Копируем следующий код:
#!/sbin/ip6tables-restore # Таблица filter и её цепочки *filter :INPUT ACCEPT : :FORWARD ACCEPT : :OUTPUT ACCEPT : # Разрешаем связанные и установленые соединения -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Разрешаем служебный icmp-трафик -A INPUT -p ipv6-icmp -j ACCEPT # Разрешаем доверенный трафик на интерфейс loopback -A INPUT -i lo -j ACCEPT # Сюда можно вставлять дополнительные правила для цепочки INPUT # Запрещаем всё остальное для INPUT -A INPUT -j REJECT --reject-with icmp6-adm-prohibited # Порядок и смысл правил для цепочек FORWARD и OUTPUT аналогичен INPUT -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -p ipv6-icmp -j ACCEPT -A FORWARD -j REJECT --reject-with icmp6-adm-prohibited # Фильтровать цепочку OUTPUT настоятельно не рекомендуется #-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT #-A OUTPUT -p ipv6-icmp -j ACCEPT #-A OUTPUT -o lo -j ACCEPT #-A OUTPUT -j REJECT --reject-with icmp6-adm-prohibited COMMIT
Дополняем нужными правилами с учётом ip6tables-save.
Сохраняем и закрываем: Ctrl+O, Enter, Ctrl+X
Делаем скрипт исполняемым и загружаем правила iptables:
sudo chmod +x etcnetworkif-up.dip6tables-rules sudo etcnetworkif-up.dip6tables-rules
Implementing a Drop Rule
We now have four separate rules that explicitly accept packets based on certain criteria. However, our firewall currently is not blocking anything.
If a packet enters the INPUT chain and doesn’t match one of the four rules that we made, it is being passed to our default policy, which is to accept the packet anyways. We need to change this.
There are two different ways that we can do this, with some pretty important differences.
The first way we could do this is to modify the default policy of our INPUT chain. We can do this by typing:
This will catch any packets that fall through our INPUT chain, and drop them. This is what we call a default drop policy. One of the implications of this type of a design is that it falls back on dropping packets if the rules are flushed.
This may be more secure, but also can have serious consequences if you don’t have another way of accessing your server. With DigitalOcean, you can log in through our web console to get access to your server if this happens. The web console acts as a virtual local connection, so iptables rules will not affect it.
You may like your server to automatically drop all connections in the event that the rules are dumped. This would prevent your server from being left wide open. This also means that you can easily append rules to the bottom of the chain easily while still dropping packets as you’d like.
The alternative approach is to keep the default policy for the chain as accept and add a rule that drops every remaining packet to the bottom of the chain itself.
If you changed the default policy for the INPUT chain above, you can set it back to follow along by typing:
Now, you can add a rule to the bottom of the chain that will drop any remaining packets:
The result under normal operating conditions is exactly the same as a default drop policy. This rule works by matching every remaining packet that reaches it. This prevents a packet from ever dropping all of the way through the chain to reach the default policy.
Basically, this is used to keep the default policy to accept traffic. That way, if there are any problems and the rules are flushed, you will still be able to access the machine over the network. This is a way of implementing a default action without altering the policy that will be applied to an empty chain.
Of course, this also means that any rule that any additional rule that you wish to add to the end of the chain will have to be added before the drop rule. You can do this either by temporarily removing the drop rule:
Or, you can insert rules that you need at the end of the chain (but prior to the drop) by specifying the line number. To insert a rule at line number 4, you could type:
If you are having trouble knowing which line number each rule is, you can tell iptables to number the rules by typing:
This can be helpful to make sure you are adding your rule at the appropriate position.
Основные команды iptables
Рассмотрим основные команды, которые используются для установки различных правил и для работы с iptables в целом.
Во-первых, все команды iptables должен использовать только пользователь с административными (root) правами. В этом руководстве будет использоваться пользователь с sudo-правами, так как это предпочтительный вариант при работе на ОС Ubuntu 14.04. Однако при желании вы можете использовать и суперпользователя.
Для начала необходимо вывести список всех прав, которые сейчас установлены для iptables. Для этого используйте ключ –L:
$ 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
По умолчанию существует три цепочки правил – INPUT (входящие пакеты), FORWARD (транзитные пакеты) и OUTPUT (исходящие пакеты). У всех по умолчанию проставлено действие ACCEPT (пропуск пакета). Также можно увидеть заголовки колонок, но самих правил нет, т.к. Ubuntu не поставляется с каким-то пакетом правил по умолчанию.
Для того, чтобы посмотреть вывод в формате, отражающем команды, необходимые для включения каждого правила и действия, используйте ключ – S:
$ sudo iptables –S
Вывод будет следующим:
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT
Для того, чтобы сделать копию настройки, необходимо просто набрать команду sudo iptables, а затем каждую из строчек в выводе.
Допустим, у вас уже есть какие-то правила. Для того, чтобы убрать их и начать заново, используйте команду с ключом –F:
$ sudo iptables –F
При этом важно помнить, что даже если вы удалите все правила из своих цепочек, это никак не повлияет на порядок действий, политику (policy). Поэтому, если вы работаете удаленно, перед удалением правил убедитесь, что политика по умолчанию на входящие и исходящие пакеты (INPUT и OUTPUT) – это пропуск (ACCEPT)
Сделать это можно следующей командой:
$ sudo iptables -P INPUT ACCEPT $ sudo iptables -P OUTPUT ACCEPT $ sudo iptables –F
Ключ –P устанавливает политику для стандартной цепочки.
Допуск других важных соединений
Мы уже задали, что iptables должен держать открытыми все соединения, которые уже установлены, и допускать новые соединения, которые как-то связаны с предыдущими. Тем не менее необходимо создать еще несколько правил для того, чтобы были установлены другие новые соединения, которые не подходят под предыдущие критерии.
В частности, необходимо, чтобы были всегда открыты два порта: SSH-порт (по умолчанию это обычно порт 22) и порт веб-сервера, который стандартно имеет 80 порт.
Поэтому нужно добавить следующие правила:
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT $ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Эти правила похожи на первое правило, но выглядят более простыми. Новые опции, которые мы используем:
- -p tcp: данная часть помечает все пакеты, если использованный протокол TCP. Соединение через этот протокол используется большинством приложений.
- —dport: поставить эту опцию можно только в том случае, если вы указали часть команды выше. Она указывает порт: первое правило показывает, что оно работает для TCP-пакетов для порта 22, а второе – для TCP-пакетов для порта 80.
Если еще одно правило, которое нужно добавить для того, чтобы сервер функционировал корректно. Сервисы компьютера могут взаимодействовать между собой, посылая сетевые пакеты друг другу. Они делают это, используя loopback-интерфейс, который перенаправляет трафик обратно к себе, а не на другие компьютеры.
Поэтому если один сервис взаимодействует с другим сервисом, то пакеты, используя loopback, пересылаются через порт 4555
Важно, чтобы такое взаимодействие было разрешено, так как оно необходимо для работы многих программ
Правило, которое нужно добавить, выглядит так:
$ sudo iptables -I INPUT 1 -i lo -j ACCEPT
Расшифровка его частей такая:
- -I INPUT 1: эта часть говорит iptables вставить правило. В отличие от ключа –A, который отправляет правило в конец цепочки, ключ –I вставляет правило в то место цепочки, куда вы хотите его поместить. В данном случае правило будет самым первым правилом в цепочке INPUT, а остальные правила будут идти уже после него. Это необходимо сделать, так как это базовое правило и оно не должно зависеть от остальных правил.
- -i lo: эта часть правила проверяет, соответствует ли интерфейс пакета loopback-интерфейсу.
Для того, чтобы посмотреть текущие правила, используйте команду с флагом –S. Можно также использовать ключ –L, но при его использовании отображается не вся информация, в частности, интерфейс, к которому относится это правило, поэтому в данном случае используйте такую команду:
$ sudo iptables –S
Вывод будет выглядеть следующим образом:
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
Что такое 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, с которыми тоже желательно разобраться.
Как закрыть порт Iptables
В этой статье я не стану подробно рассматривать все возможности Iptables, виды цепочек и как работает эта служба. Все это мы рассмотрели в статье настройка Iptables для начинающих. Вместо этого, перейдем ближе к делу. Чтобы заблокировать порт нам сначала нужно понять какие порты открыты в Linux и за что они отвечают. Чтобы посмотреть какие порты слушаются локально, можно использовать утилиту netstat:
Для анализа портов, доступных извне используется программа nmap:
Как видите, извне у нас, кроме стандартных портов веб-сервера, доступны mysql, ftp, dns и другие сервисы. Некоторые из них не должны быть доступны публично. Это не критично, но и нежелательно. Мы можем очень просто закрыть такие порты с помощью iptables. Общий синтаксис команды для блокировки порта будет выглядеть вот так:
$ iptables -A INPUT -p tcp —dport номер_порта -j DROP
Например, если мы хотим заблокировать порт iptables mysql, то необходимо выполнить:
Можно закрыть порт для определенного интерфейса, например, eth1:
Или даже для ip и целой подсети. Например, закрыть все подключения к порту 22 SSH кроме IP адреса 1.2.3.4:
Здесь знак восклицания означает инверсию, то есть применить ко всем кроме этого. Можно убрать этот знак и указать только IP, к которым нужно применить запрет. Мы рассмотрели как закрыть порт iptables в цепочке INPUT, которая отвечает за входящие соединения, это более применимо к серверам. Но что, если нужно закрыть подключение к удаленному порту из этого компьютера или нашей сети? Для этого существует цепочка OUTPUT.
Например, заблокируем попытки отправки почты подключением к любой машине по порту 25:
Также, как и раньше, вы можете указать исходящий сетевой интерфейс, только теперь он указывается опцией -o:
После того как вы завершите с настройкой портов нужно сохранить все созданные правила, чтобы они остались активными даже после перезагрузки. Для этого выполните:
Чтобы посмотреть текущие правила для каждой из цепочек выполните:
Такая команда покажет все правила, а если вы хотите только информацию о заблокированных портах, выполните:
Очистить все правила в случае возникновения проблем можно командой: