Примеры часто используемых команд iptables
Общие команды
Просмотр правил с их номерами:
iptables -L —line-numbers
Для каждой таблицы смотреть правила нужно отдельно:
iptables -t nat -L —line-numbers
Удалить все правила:
iptables -F
Установить правила по умолчанию:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
* в данных примерах по умолчанию для всех входящих (INPUT) и исходящих (OUTPUT) пакетов будет работать запрещающее правило (DROP).
Разрешить все
Способ 1. С помощью добавления правила:
iptables -I INPUT 1 -j ACCEPT
iptables -I OUTPUT 1 -j ACCEPT
iptables -I FORWARD 1 -j ACCEPT
* данные три команды создадут правила, которые разрешают все входящие, исходящие и транзитные пакеты.
Способ 2. Чисткой правил:
iptables -F
iptables -S
* здесь мы сначала удаляем все правила (-F), затем устанавливаем политику по умолчанию — разрешать входящие, исходящие и транзитные (-S).
Способ 3. Отключение сервиса (удобно для диагностики проблем на время отключить firewall):
service iptables stop
iptables stop
Работа с правилами
1. Добавить правило в конец списка:
iptables -A INPUT -p tcp —dport 25 -j ACCEPT
iptables -A INPUT -p tcp -s ! 192.168.0.25 —dport 993 -i eth0 -j ACCEPT
2. Добавить диапазон портов:
iptables -A INPUT -p tcp —dport 3000:4000 -j ACCEPT
* в данном случае, от 3000 до 4000.
3. Вставить правило:
iptables -I FORWARD 15 -p udp -d 8.8.8.8 —dport 53 -i eth1 -j ACCEPT
4. Заблокировать определенный IP-адрес для подключения по 25 порту:
iptables -I INPUT 1 -s 1.1.1.1 -p tcp —dport 25 -j DROP
5. Разрешить несколько портов:
iptables -A INPUT -p tcp —match multiport —dports 20,21,25,80,8080,3000:4000 -j ACCEPT
Проброс портов (port forwarding)
Рассмотрим пример проброса одного порта и диапазона портов.
Один порт (одинаковые порты)
Существует два способа настройки.
1. Правила PREROUTING + POSTROUTING:
iptables -t nat -A PREROUTING -p tcp -m tcp -d 19.8.232.80 —dport 22 -j DNAT —to-destination 192.168.1.15:22
iptables -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.1.15 —sport 22 -j SNAT —to-source 19.8.232.80:22
* где 19.8.232.80 — адрес, на котором слушаем запросы на подключение; 22 — порт для проброса; 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.
2. Правила PREROUTING + FORWARD:
iptables -t nat -A PREROUTING -p tcp -i eth1 —dport 22 -j DNAT —to-destination 192.168.1.15:22
iptables -A FORWARD -p tcp -d 192.168.1.15 —dport 22 -m state —state NEW,ESTABLISHED,RELATED -j ACCEPT
* где eth1 — сетевой интерфейс, на котором слушаем запросы; 22 — порт для проброса; 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.
Один порт (разные порты)
Рассмотрим ситуацию, когда мы слушаем один порт, а пробрасываем на другой.
iptables -t nat -A PREROUTING -p tcp -i eth1 —dport 8022 -j DNAT —to-destination 192.168.1.15:22
iptables -A FORWARD -p tcp -d 192.168.1.15 —dport 22 -m state —state NEW,ESTABLISHED,RELATED -j ACCEPT
* где eth1 — сетевой интерфейс, на котором слушаем запросы; 8022 — порт для проброса, на котором будем слушать запросы; 22 — порт для проброса на внутренний адрес; 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.
Диапазон портов
При необходимости пробросить диапазон портов, используем команды:
iptables -t nat -I PREROUTING -p tcp -m tcp —dport 1000:5000 -j DNAT —to-destination 192.168.1.15:1000-5000
iptables -A FORWARD -d 192.168.1.15 -i eth1 -p tcp -m tcp —dport 1000:5000 -j ACCEPT
* где eth1 — сетевой интерфейс, на котором слушаем запросы; 1000:5000 — порты для проброса (от 1000 до 5000); 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.
Стартовая настройка
Мы можем начать настройку брандмауэра на сервере с этих команд.
Разрешаем SSH:
iptables -A INPUT -p tcp —dport 22 -j ACCEPT
Создаем правила для нормальной работы apt или yum:
iptables -A INPUT -m state —state ESTABLISHED,RELATED -j ACCEPT
Разрешаем ICMP (для выполнения команды ping):
iptables -A INPUT -p icmp -j ACCEPT
Разрешаем все входящие на адрес локальной петли:
iptables -A INPUT -i lo -j ACCEPT
Ставим политику запрета на входящие и разрешаем все исходящие:
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
Настройка по умолчанию
Если мы хотим вернуть настройки в первоночальное значение (разрешено все, правил нет), выполняем команды ниже.
Сначала ставим разрешающую политику для основных цепочек:
iptables -S
Ставим политику разрешения на входящие и исходящие:
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
Удаляем все правила во всех таблицах:
iptables -F
iptables -t nat -F
iptables -t mangle -F
Удаляем все цепочки, которые не используются:
iptables -X
Настройка FirewallD в Webmin
Войдите в раздел «Сеть» Webmin на боковой панели. Затем нажмите кнопку «Брандмауэр Linux» и следуйте пошаговым инструкциям ниже.
Добавление портов
Шаг 1: В разделе FirewallD найдите кнопку «Добавить разрешенный порт ..» и щелкните по ней мышью, чтобы добавить новый порт в брандмауэр.
Шаг 2: После нажатия кнопки «Добавить разрешенный порт» FirewallD откроет окно «Параметры разрешенного порта». Отсюда найдите «Один порт» и введите его в поле. Или, если это диапазон портов, введите диапазон в разделе «Диапазон портов».
Шаг 3: После того, как вы ввели данные порта, найдите раздел «Сетевой протокол» и установите для него TCP или UDP.
Шаг 4: Найдите зеленую кнопку «Создать» и выберите ее, чтобы добавить в свой список правил.
Добавление услуги
Шаг 1: Нажмите кнопку «Добавить разрешенную службу», чтобы открыть меню разрешенных служб.
Шаг 2: Найдите область «Разрешить услуги» и щелкните по ней мышью. Затем введите в поле поиска имя службы, которую вы хотите разрешить через брандмауэр.
Шаг 3: Нажмите зеленую кнопку «Создать», чтобы добавить новую службу в правила FirewallD.
Добавление порта вперед
Шаг 1: Нажмите кнопку «Добавить порт вперед» в области правил FirewallD.
Шаг 2: Найдите поле «Один порт» и введите порт, который вы хотите переадресовать. Или выберите поле «Диапазон портов», чтобы добавить диапазон портов.
Шаг 3: Найдите «Порт назначения» и введите либо один порт, либо диапазон портов.
Шаг 4: Нажмите кнопку «Создать», чтобы добавить правила в брандмауэр.
Удаление правил брандмауэра
Существует два способа удалить правило: указать номер правила или само правило.
Удаление правила по его номеру
Для начала просмотрите список существующих правил. Для этого запросите состояние брандмауэра с опцией numbered.
К примеру, чтобы удалить правило 2 (открывающее трафик HTTP), нужно запустить команду:
Программа запросит подтверждения.
Примечание: Если сервер поддерживает IPv6, нужно удалить соответствующее правило и для этого протокола.
Удаление правила
Также можно указать в команде само правило, которое нужно удалить. К примеру, чтобы удалить allow http, нужно запустить:
Этот метод работает и для IPv4, и для IPv6.
Как открыть порты в Linux
Для этого примера предположим, что мы хотим открыть порт 4000 для соединений TCP. Сначала нам нужно убедиться, что порт еще не используется. Делаем это через netstat или ss.
Предполагая, что вывод пуст, мы можем добавить соответствующие правила для портов в системный брандмауэр. Методы для этого будут различаться в зависимости от вашего дистрибутива и от того, использует ли он более новый брандмауэр ufw или firewalld. Ubuntu предпочитает ufw, в то время как CentOS вместо этого обычно использует firewalld. Конечно, некоторые дистрибутивы Linux все еще используют старый брандмауэр iptables.
Для пользователей Ubuntu и других систем на базе брандмауэра ufw
Вместо использования старого брандмауэра iptables Ubuntu и некоторые другие дистрибутивы используют ufw. В этих системах следующая команда откроет порт.
Пропустите следующие несколько шагов и проверьте только что открытый порт, чтобы убедиться, что он работает.
Как открыть порты в Linux с помощью CentOS и других систем на основе брандмауэра
Если в вашей системе используется firewalld, лучше всего использовать команду firewall-cmd для обновления правил.
Это не будет постоянным изменением, но мы расскажем, как сохранить правила после перезагрузки после тестирования порта.
Для других дистрибутивов Linux
Если в вашей системе Linux нет ufw или firewalld, вам нужно использовать iptables. Если он не установлен, загрузите его с помощью выбранного менеджера пакетов. После установки эти команды откроют порт 4000:
Если ваша система использует systemctl, замените вторую команду на:
Закрыть порт UFW в Ubuntu и Debian
Как открыть мы показали, а теперь я покажу вам обратный процесс. Синтаксис аналогичен. Нам требуется просто изменить одно слово в команде с «allow» на «deny«. Например чтоб запретить доступ к порту 80 введите команду.
Данная команда закроет порт 80 как на TCP, так и UDP. Так же как и в разрешающей команде можно использовать протоколы порта, TCP и UDP.
или
Аналогично вы можете сделать то же самое и для служб. Например закрыть порты службы SSH, можно командой.
Ответ в терминале будет таким:
Закрыть порт службы SSH в UFW на Ubuntu и Debian
Таким образом, вы можете контролировать входящий трафик.
Шаг 7 — Удаление правил
Знать процедуру удаления правил брандмауэра так же важно, как и знать процедуру их создания. Существует два разных способа указывать правила для удаления: по номеру правила или по фактическому правилу (так же, как правила задавались при их создании)
Начнем с метода удаления по номеру правила, поскольку этот метод проще.
По номеру правила
Если вы используете номер правила для удаления правил брандмауэра, прежде всего нужно получить список правил брандмауэра. Команда UFW status имеет опцию отображение номеров рядом с каждым правилом, как показано здесь:
Если мы решим удалить правило 2, разрешающее соединения через порт 80 (HTTP), мы можем указать его в команде UFW delete, как показано здесь:
После этого откроется диалогового окна подтверждения удаления правила 2, разрешающего соединения HTTP. Если вы включили поддержку IPv6, вы можете также удалить соответствующее правило для IPv6.
По фактическому имени правила
Вместо номеров правил можно указывать фактические имена удаляемых правил. Например, если вы хотите удалить правило , вы можете использовать следующую команду:
Также вы можете указать это правило как , а не указывать имя службы:
Этот метод удалит правила IPv4 и IPv6, если они существуют.
4: Настройка соединений SSH
Если включить UFW сейчас, он заблокирует все входящие соединения. Потому нужно создать правила, которые разрешат входящий трафик заведомо доверенных сервисов (например, SSH и HTTP). Обязательно нужно разрешить трафик SSH на облачном сервере, так как этот протокол позволяет вам подключаться к серверу.
Чтобы разблокировать соединения SSH, введите:
Это правило разрешит входящие соединения по порту 22 (порт SSH по умолчанию). UFW знает имена некоторых сервисов (в том числе и SSH), которые перечислены в файле /etc/services.
Вместо названия сервиса в правиле можно указать порт. Например:
Если вы используете нестандартный порт для SSH, укажите его в команде. К примеру, если SSH прослушивает порт 2222, нужно ввести:
Перенаправление портов в Linux
Перенаправление портов нужно в том случае, если мы хотим «замаскировать» внутреннюю службу, обеспечив к ней доступ извне не по стандартному, а совсем по другому порту. Пусть $FAKE_PORT — обманный порт на внешнем интерфейсе шлюза, подключившись к которому мы должны попасть на адрес $LAN_IP и порт $SRV_PORT. Набор правил для iptables будет отличаться несущественно, поэтому приведу сразу пример итогового скрипта для ленивых.
Предположим, у вас есть веб-сервер в локальной сети, который должен быть доступным из дикого интернета только по https (443/tcp). Причин не использовать VPN или отдельный IP для отдельного сервера может быть много. Например, архитектура сети, отсутствие свободных IP, веб-сервер — гостевая виртуальная машина, а наш шлюз — хост )) Ну, не знаю, сами придумайте ситуацию.
Причем мы хитрые и хотим, чтобы наш веб сервер из интернета не был виден на 443 порту, а был доступен, скажем, на 1293 порту (примерно вот так: https://1.2.3.4:1293). Итак, мы хотим перенаправить входящие из интернет на порт 1293 на порт 443 сервера в локальной сети.
Проверяем состояние брандмауэра
Первым делом нужно убедиться, что пакет ufw вообще установлен или установить его, если это не так:
# apt install ufw
На VDS от Xelent вы сразу получаете полномочия root, поэтому нет необходимости вводить команду sudo.
Как показано на следующей иллюстрации, уже установлена последняя версия пакета ufw.
UFW установлен
Теперь посмотрим состояние брандмауэра:
# ufw status verbose
По умолчанию фильтр пакетов выключен, поэтому вы получите сообщение
Status: inactive
Не нужно спешить включать файрвол: сначала его нужно настроить. Ведь если порт 22 окажется по умолчанию недоступен, то вы потеряете доступ к своему VDS. Конечно, в службе поддержки вам помогут, но все это — потеря времени.
Сложные правила
Для отдельного ПК или небольших сетей базовых возможностей вполне хватает, для настройки сложных правил в firewalld изначально предлагался так называемый direct-синтаксис, чуть позже появился собственный язык Rich Language. В первом варианте достаточно знать синтаксис iptables, рекомендуется использовать в крайнем случае, так как правила не сохраняются после перезагрузки.
Синтаксис direct правила такой:
Позиция полностью совпадает с синтаксисом iptables. Получаем текущие установки:
Добавляем правило, разрешающее соединение по 25-му порту:
Пробросим соединение по 22-му на другой сервер:
Проверяем:
Rich Language позволяет записывать сложные правила в более удобном для понимания виде. В правиле можно указывать любые параметры, характеризующие пакет: источник, назначение, сервис, порт, протокол, маскарадинг, журналирование, аудит и действие. Например, разрешим подсети соединяться по HTTP и добавляем аудит:
Большой плюс Rich Language в том, что все параметры можно описать в XML в файле зоны. Формат файла очень простой и повторяет названия параметров:
Настройка файрвола — дело привычки. Часто удобнее вбить команду, которой пользуешься уже не один год, чем осваивать новую утилиту. Поэтому иногда все-таки хочется вернуть классический инструмент. Это не проблема. Iptables в CentOS 7 не ставится, поэтому его нужно вернуть:
Чтобы не настраивать все повторно, лучше сохранить текущие правила, сгенерированные firewalld.
Останавливаем firewalld и запускаем iptables:
Проверяем текущие правила:
Запрещаем автозапуск firewalld при загрузке ОС:
Как сбросить брандмауэр?
Синтаксис выглядит следующим образом, что бы сбросить UFW правила к заводским установкам по умолчанию и в неактивный режим, выполните следующую команду:
$ sudo ufw reset
1 | $sudo ufw reset |
Примеры вывода:
<span class=»notranslate»> Сброс всех правил, установленных по умолчанию.</span> <span class=»notranslate»> Это может нарушить существующие SSH</span>
<span class=»notranslate»> соединения.</span> <span class=»notranslate»> Продолжайте операции (Y | N)? <strong>У</strong></span>
<span class=»notranslate»> Резервное копирование ‘user6.rules’ до » /etc/ufw/user6.rules.20160801_121710</span>
<span class=»notranslate»> Резервное копирование ‘after.rules’ до » /etc/ufw/after.rules.20160801_121710</span>
<span class=»notranslate»> Резервное копирование ‘before.rules’ до » /etc/ufw/before.rules.20160801_121710</span>
<span class=»notranslate»> Резервное копирование ‘after6.rules’ до » /etc/ufw/after6.rules.20160801_121710</span>
<span class=»notranslate»> Резервное копирование ‘user.rules’ до » /etc/ufw/user.rules.20160801_121710</span>
<span class=»notranslate»> Резервное копирование ‘before6.rules’ до » /etc/ufw/before6.rules.20160801_121710</span>
1 |
<span class=»notranslate»>Сбросвсехправил,установленныхпоумолчанию.</span><span class=»notranslate»>ЭтоможетнарушитьсуществующиеSSH</span> <span class=»notranslate»>соединения.</span><span class=»notranslate»>Продолжайтеоперации(Y|N)?<strong>У</strong></span> <span class=»notranslate»>Резервноекопирование’user6.rules’до»/etc/ufw/user6.rules.20160801_121710</span> <span class=»notranslate»>Резервноекопирование’after.rules’до»/etc/ufw/after.rules.20160801_121710</span> <span class=»notranslate»>Резервноекопирование’before.rules’до»/etc/ufw/before.rules.20160801_121710</span> <span class=»notranslate»>Резервноекопирование’after6.rules’до»/etc/ufw/after6.rules.20160801_121710</span> <span class=»notranslate»>Резервноекопирование’user.rules’до»/etc/ufw/user.rules.20160801_121710</span> <span class=»notranslate»>Резервноекопирование’before6.rules’до»/etc/ufw/before6.rules.20160801_121710</span> |
Открыть порт в Ubuntu / Debian, указав системную службу
Некоторые службы и профили определены в UFW. Эти службы используют определенный порт, поэтому мы также можем открыть порты с помощью названия службы. Это очень удобно новичкам, которые не знают какая служба какой порт использует.
Итак, чтобы открыть порты с помощью этого метода, нам нужно использовать следующий синтаксис:
Например:
И вы должны получить следующий результат:
Открыть порт SSH в UFW на Ubuntu или Debian
В данном примере будет открыт порт 22, который является портом, используемым SSH.
Если вы хотите узнать, какие еще службы вы можете использовать, вы можете ознакомиться с ними, введя команду.
Вот так все просто, данная команда покажет все основные службы и порты которые та или иная служба использует.
Разрешить подключения к другим портам
В зависимости от приложений, которые работают на вашем сервере, и ваших конкретных потребностей вам также потребуется разрешить входящий доступ к некоторым другим портам.
Ниже приведены несколько примеров того, как разрешить входящие соединения с некоторыми из наиболее распространенных служб:
Открытый порт 80 — HTTP
HTTP-соединения могут быть разрешены с помощью следующей команды:
Вместо профиля вы можете использовать номер порта :
Открытый порт 443 — HTTPS
HTTPS-соединения можно разрешить с помощью следующей команды:
Для достижения того же самого вместо вы можете использовать номер порта :
Открытый порт 8080
Если вы запустите Tomcat или любое другое приложение, которое прослушивает порт 8080, вы можете разрешить входящие соединения с помощью:
Отклонять доступ к порту (сообщать пользователю, что он блокируются брандмауэром)
Синтаксис reject просто игнорирует трафик. Если вы хотите позволить пользователя узнать о том, когда трафик отклонен, а не просто игнорировать его, используйте синтаксис:
$ sudo ufw reject in smtp
$ sudo ufw reject out smtp
$ sudo sudo ufw reject 1194 comment ‘No more vpn traffic’
$ sudo ufw reject 23 comment ‘Unencrypted port not allowed’
1 |
$sudo ufw reject insmtp $sudo ufw reject out smtp $sudo sudo ufw reject1194comment’No more vpn traffic’ $sudo ufw reject23comment’Unencrypted port not allowed’ |
Если кто-то попытается подключиться к порту 23 они получат сообщение reject следующего содержания:
<span class=»notranslate»> Telnet: Невозможно подключиться к удаленному узлу: Соединение отклонено</span>
1 | <span class=»notranslate»>TelnetНевозможноподключитьсякудаленномуузлуСоединениеотклонено</span> |
Открытие портов
В зависимости от приложений, которые работают в системе, вам также может потребоваться открыть другие порты. Общий синтаксис открытия порта следующий:
Ниже приведены несколько способов, как разрешить HTTP-соединения.
Первый вариант — использовать имя службы. UFW проверяет файл предмет порта и протокола указанной службы:
Вы также можете указать номер порта и протокол:
Если протокол не указан, UFW создает правила как для и для .
Другой вариант — использовать профиль приложения; в данном случае Nginx HTTP:
UFW также поддерживает другой синтаксис для указания протокола с помощью ключевого слова :
Портовые диапазоны
UFW также позволяет открывать диапазоны портов. Открывающий и закрывающий порты разделяются двоеточием ( ), и вы должны указать протокол, либо или .
Например, если вы хотите разрешить порты с до как на и на , вы должны выполнить следующую команду:
Определенный IP-адрес и порт
Чтобы разрешить соединения на всех портах с заданного IP-адреса источника, используйте ключевое слово за которым следует адрес источника.
Вот пример внесения IP-адреса в белый список:
Если вы хотите разрешить данному IP-адресу доступ только к определенному порту, используйте ключевое слово за которым следует номер порта.
Например, чтобы разрешить доступ к порту с машины с IP-адресом , введите:
Подсети
Синтаксис разрешения подключений к подсети IP-адресов такой же, как и при использовании одного IP-адреса. Единственное отличие состоит в том, что вам нужно указать маску сети.
Ниже приведен пример, показывающий, как разрешить доступ для IP-адресов от до до порта ( MySQL ):
Конкретный сетевой интерфейс
Чтобы разрешить подключения к определенному сетевому интерфейсу, используйте ключевое слово за которым следует имя сетевого интерфейса:
Настройка Nftables на Linux
Nftables – это инструмент, с помощью которого идет настройка фаервола Netfilter. Для настройки он использует конфиг – /etc/nftables.conf и команду nft. А также Nftables может быть запущен как служба.
Служба и конфиг nftables
В системе Debian 11 и Ubuntu 22.04 по умолчанию существует служба nftables, что облегчает управление файрволлом. Вы можете выполнять следующие команды:
- – включить автозагрузку службы
- – отключить автозагрузку службы
- – запустить службу
- – остановить службу
- – перезагрузить службу
По умолчанию эта служба выключена и перед добавлением правил в файрволл, её нужно включить. При запуске служба читает конфиг /etc/nftables.conf и запускается с указанными там правилами.
По умолчанию конфиг выглядит так:
$ cat /etc/nftables.conf #!/usr/sbin/nft -f flush ruleset table inet filter { chain input { type filter hook input priority filter; } chain forward { type filter hook forward priority filter; } chain output { type filter hook output priority filter; } }
Давайте разберем его:
- – конфиг выполнен в виде скрипта, а в качестве оболочки будет использован /usr/sbin/nft;
- – первым делом выполняется команда, которая очистит фаервол от всех правил;
-
– блок в котором мы описываем таблицу filter. Ключевое слово inet означает что таблица создана для ipv4 и ipv6
chain input { } – блок описывающий правила для input;
. Здесь содержаться 3 вложенных блока для разделения правил на разные цепочки:
- – этот блок для forward;
- – а этот для output;
В каждой цепочке есть правило, которое её описывает:
type filter hook input (или forward или output) priority filter;
Цепочку вы можете назвать как угодно (chain input, или chain my_input, или chain in), но вот фраза определит эту цепочку как input для таблицы filter. Поменяйте input на forward или output, чтобы поменять тип цепочки.
Редактировать этот конфиг вручную не нужно, для этого есть специальная команда (nft), с помощью которой можно добавлять свои таблицы, цепочки и правила. А также удалять или редактировать их. Но так как в системе уже есть конфиг в котором есть таблица filter и цепочки input, forward и output, то нам остаётся лишь добавлять правила (rule). В этой статье я не буду рассматривать добавление таблиц и цепочек.
Просмотр действующих правил
Чтобы посмотреть правила, которые применяются прямо сейчас, выполните команду:
$ sudo nft list ruleset table inet filter { chain input { type filter hook input priority filter; policy accept; } chain forward { type filter hook forward priority filter; policy accept; } chain output { type filter hook output priority filter; policy accept; } }
Если у вас команда ничего не показала, то скорее всего у вас выключена служба nftables и вам нужно её запустить.
Видим почти-что наш конфиг, но без двух строк ( и ). То есть команда показывает нам только таблицы, цепочки и правила. А что такое policy accept и почему этого не было записано в конфиге, разберём ниже в этой статье.
Прохождение цепочки
Пакет, попавший в цепочку, начинает проходить правила указанные в ней сверху вниз. Фаервол сравнивает пакет с первым правилом, затем со вторым и так далее. Если фаервол определит правило для этого пакета, то с пакетом будет выполнено действие:
- drop – пакет будет уничтожен;
- accept – пакет сразу же покинет эту цепочку и пойдет дальше, то есть нижние правила уже не будут рассмотрены.
А если фаервол не найдет в данной цепочке подходящего правила для пакета, то фаервол выполнит действие с пакетом, которое указано в политике (policy accept или policy drop).
Прохождение пакетом цепочки input
Сейчас во всех цепочках политика accept, и нет других правил. Это означает что все пакеты разрешены во все стороны (нет никаких правил и политика разрешает прохождение пакетов).
Если изменить политику на drop, то будет обратная ситуация. Нет никаких правил, а политика будет отбрасывать все пакеты.
Обычно для цепочки input добавляют некоторые разрешающие правила, а затем меняют политику на drop. Таким образом всё что мы не разрешили будет запрещено. А цепочку output вообще не трогают, оставляя политику accept. То есть к нашему серверу можно подключиться только определённым образом, а сам сервер может отправлять пакеты куда захочет (например в интернет).
Если в конфиге /etc/nftables.conf мы не обозначили политику для цепочек, то будет использован accept. Именно это и показывает команда nft list ruleset.
3: Политика по умолчанию
Начиная настройку брандмауэра, вы должны продумать и определить его политику по умолчанию. Эти правила управляют обработкой трафика, который не отвечает другим правилам. По умолчанию UFW сбрасывает все входящие и разрешает все исходящие соединения. Это значит, что другие пользователи не смогут получить доступ к вашему облачному серверу, но все установленные на сервере приложения могут взаимодействовать с внешними приложениями.
Чтобы вернуться к исходным правилам, введите команды:
Если вы настроили пользовательский набор правил, эти команды сбросят его и восстановят исходный набор. Теперь брандмауэр будет сбрасывать все входящие и поддерживать исходящие соединения.
Стандартные правила брандмауэра подходят для персональных компьютеров; серверам обычно необходимо принимать входящий трафик.
Настройка брандмауэра с помощью UFW в Ubuntu 18.04
Как мы уже говорили, UFW по умолчанию установлен в Ubuntu 18.04, однако он не включен. Таким образом, первое, что нужно сделать, это включить UFW.
Для этого мы должны сначала подключиться к серверу с помощью SSH или, если Ubuntu 18.04 работает локально, просто открыть терминал. Если у вас возникли проблемы со входом на сервер, ознакомьтесь с этим руководством.
ssh vash-user@vash-server
Как только у нас будет доступ к нашему серверу, мы включим UFW с помощью следующей команды:
sudo ufw enable
Если вы увидите сообщение об ошибке «Команда не найдена», установите UFW с помощью следующей команды.
sudo apt-get install ufw
Затем мы должны проверить статус UFW.
sudo ufw status
Как мы видим, теперь UFW включен.
По умолчанию UFW запрещает все входящие и разрешает все исходящие соединения. Для многих пользователей этой конфигурации достаточно, но если у нас есть сетевые службы или приложения, мы должны установить некоторые правила.
Операции с портами
Для открытия/закрытия портов также используется команды Allow/Deny, в зависимости от требований администратора. Синтаксис выглядит следующим образом:
Расшифровка:
1. action — одно из двух действий: разрешить (Allow) или запретить (Deny);
2. port — цифровое имя порта, для которого применяется правило;
3. name_protocol — наименование протокола.
Если требуется указать перечень портов, используем двоеточие между начальной и конечной точкой. Альтернативный вариант — использовать имя службы, для которой создается запись. Например, откроем порт для сервиса HTTP:
Важно! UFW разрешает стандартный порт, который закреплен за службой. Если значение отличается от общепринятых, то создавать правило по имени сервиса нельзя — оно не активируется
Возможности firewalld
Firewalld запускается как демон, новые правила добавляются без перезапуска и без сброса установленного файрвола. Изменения в конфигурации могут быть сделаны в любое время и применяются мгновенно: сохранять или применять изменения не требуется. Поддерживается IPv4, IPv6, автоматическая загрузка модулей ядра и сетевые зоны, определяющие уровень доверия соединений. Предоставляется простой интерфейс добавления правил для служб и приложений, белый список приложений, имеющих право менять правила. В настоящее время такую возможность поддерживает libvirt, Docker, fail2ban, Puppet, скрипт установки Virtuozzo и многие другие проекты. В репозитории YUM уже есть пакеты fail2ban-firewalld и puppet-firewalld, поэтому подключить их можно одной командой.
Firewalld предоставляет информацию о текущих настройках брандмауэра через D-Bus API, а также принимает изменения через D-Bus с использованием методов аутентификации PolicyKit. В качестве бэкенда используются iptables, ip6tables, ebtables, ipset и планируется nftables. Но сами правила, созданные непосредственно этими утилитами, firewalld не может разобрать, поэтому оба метода использовать нельзя.
Управление производится при помощи утилит командной строки firewall-cmd или графической firewall-config, позволяющей настроить все правила в удобной среде. Для помощи в миграции текущих правил iptables на firewalld используется утилита firewall-offline-cmd, по умолчанию считывающая . В последних релизах появилась утилита firewallctl, имеющая простой синтаксис и позволяющая получать информацию о состоянии службы, конфигурации брандмауэра и изменять правила.
Графическая firewall-config поддерживает firewalldПараметры firewall-cmd
Смотрим статус:
Разрешить соединение на определенный порт очень просто:
Чтобы любые изменения вступили в силу, всегда после правок должна быть запущена команда
Для удаления порта из правил используется параметр :
Вообще, многие команды имеют значения для проверки статуса , — список, изменения или удаления соответствующего значения
Для краткости на этом не будем дальше заострять внимание. После релоада правил проверяем:
В firewalld предусмотрен режим, позволяющий одной командой заблокировать все соединения:
Для проверки, в каком режиме находится файрвол, есть специальный ключ:
Отключается panic mode:
В firewalld необязательно знать, какой порт привязан к сервису, достаточно указать название сервиса. Все остальное утилита возьмет на себя.
После установки firewalld знает настройки более 50 сервисов, получаем их список.
Разрешим подключение к HTTP:
Используя фигурные скобки, можно задавать сразу несколько сервисов. Информация по настройкам сервисов доступна при помощи
Firewalld хранит все настройки в XML-файлах в каталогах в /usr/lib/firewalld. В частности, сервисы лежат в services. Внутри файла описание: название, протокол и порт.
Это каталог системный, и менять там ничего нельзя. Если нужно переопределить настройки или создать свой сервис, то копируем любой файл в качестве шаблона в , правим под свои условия и применяем настройки.
Для настройки ICMP используется отдельный набор правил. Получаем список поддерживаемых типов ICMP:
Проверяем статус:
Все настройки firewalld хранит в XML-файлахFirewalld знает о почти 50 сервисах
8: Удаление правил
Существует два способа удалить правило: указать номер правила или само правило.
Удаление правила по его номеру
Для начала просмотрите список существующих правил. Для этого запросите состояние брандмауэра с опцией numbered.
К примеру, чтобы удалить правило 2 (открывающее трафик HTTP по порту 80), нужно ввести команду:
Брандмауэр запросит подтверждение.
Примечание: Если сервер поддерживает IPv6, нужно удалить соответствующее правило и для этого протокола.
Удаление самого правила
Также можно указать в команде то самое правило, которое нужно удалить. К примеру, чтобы удалить allow http, нужно запустить:
или
Этот метод работает и для IPv4, и для IPv6.
8: Удаление правил
Существует два способа удалить правило: указать номер правила или само правило.
Удаление правила по номеру
Для начала просмотрите список существующих правил. Для этого запросите состояние брандмауэра с опцией numbered.
К примеру, чтобы удалить правило 2 (открывающее трафик HTTP по порту 80), нужно запустить команду:
Программа запросит подтверждение.
Примечание: Если сервер поддерживает IPv6, нужно удалить соответствующее правило и для этого протокола.
Удаление правила
Также можно указать в команде само правило, которое нужно удалить. К примеру, чтобы удалить allow http, нужно запустить:
или
Этот метод работает и для IPv4, и для IPv6.
Шаг 7 — Удаление правил
Знать процедуру удаления правил брандмауэра так же важно, как и знать процедуру их создания. Существует два разных способа указывать правила для удаления: по номеру правила или по фактическому правилу (так же, как правила задавались при их создании)
Начнем с метода удаления по номеру правила, поскольку этот метод проще.
По номеру правила
Если вы используете номер правила для удаления правил брандмауэра, прежде всего нужно получить список правил брандмауэра. Команда UFW status имеет опцию отображение номеров рядом с каждым правилом, как показано здесь:
Если мы решим удалить правило 2, разрешающее соединения через порт 80 (HTTP), мы можем указать его в команде UFW delete, как показано здесь:
После этого откроется диалогового окна подтверждения удаления правила 2, разрешающего соединения HTTP. Если вы включили поддержку IPv6, вы можете также удалить соответствующее правило для IPv6.
По фактическому имени правила
Вместо номеров правил можно указывать фактические имена удаляемых правил. Например, если вы хотите удалить правило , вы можете использовать следующую команду:
Также вы можете указать это правило как , а не указывать имя службы:
Этот метод удалит правила IPv4 и IPv6, если они существуют.
Добавление большего количества правил (открытие портов и разрешение IP-адреса)
Синтаксис выглядит следующим образом, чтобы открыть порт TCP 22 и 443:
$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp
1 |
$sudo ufw allow80/tcp $sudo ufw allow443/tcp |
Откройте сервер UDP / 1194 (OpenVPN):
$ sudo ufw allow 1194/udp
1 | $sudo ufw allow1194/udp |
Откройте порт 25 (smtpd / сервер электронной почты):
$ sudo ufw allow 25
1 | $sudo ufw allow25 |
Вы можете разрешить диапазоны портов, TCP и UDP 3000 до 5000:
$ sudo ufw allow 3000:5000/tcp
$ sudo ufw allow 3000:5000/udp
1 |
$sudo ufw allow30005000/tcp $sudo ufw allow30005000/udp |
Разрешить соединения с определенного IP-адреса 1.2.3.4, введите следующую команду:
$ sudo ufw allow from 1.2.3.4
1 | $sudo ufw allow from1.2.3.4 |
Разрешить соединения с определенного IP-адреса 1.2.3.4, к нашему порту 22, введите следующую команду:
$ sudo ufw allow from 1.2.3.4 to any port 22 proto tcp
1 | $sudo ufw allow from1.2.3.4toany port22proto tcp |
ИЛИ (Dest 222.222.222.222 порт 22)
$ sudo ufw allow from 1.2.3.4 to 222.222.222.222 port 22 proto tcp
1 | $sudo ufw allow from1.2.3.4to222.222.222.222port22proto tcp |