Использование утилиты UFW на Ubuntu 18.04 LTS

12.01.2020

Теги: CLILinuxUbuntuКоманда

Во всех дистрибутивах Linux для обеспечения сетевой безопасности и изоляции внутренних процессов от внешней среды используется брандмауэр iptables. Но его настройка довольно сложная, поэтому многие дистрибутивы создают собственные оболочки, которые упрощают процесс настройки. В Ubuntu используется оболочка под названием UFW или Uncomplicated FireWall.

Синтаксис команды ufw

Для управления возможностями брандмауэра используется одноимённая команда — ufw:

$ ufw опции действие параметры

Опции:

  • --version — показывает текущую версию брандмауэра;
  • --dry-run — тестовый запуск, без реальных действий.

Действия:

  • enable — включить фаервол и добавить его в автозагрузку;
  • disable — отключить фаервол и удалить его из автозагрузки;
  • reload — перезагрузить файервол;
  • default — задать политику по умолчанию;
  • logging — включить журналирование или изменить уровень подробности;
  • reset — сбросить все настройки до состояния по умолчанию;
  • status — посмотреть состояние фаервола;
  • show — посмотреть один из отчётов о работе;
  • allow — добавить разрешающее правило;
  • deny — добавить запрещающее правило;
  • reject — добавить отбрасывающее правило;
  • limit — добавить лимитирующее правило;
  • delete — удалить правило;
  • insert — вставить правило.

Настройка UFW

Сначала смотрим состояние фаервола:

$ sudo ufw status
Status: inactive

Если он еще не включен — включаем:

$ sudo ufw enable

Снова смотрим состояние фаервола:

$ sudo ufw status
Состояние: активен

Получить более подробную информацию:

$ sudo ufw status verbose
Состояние: активен
Журналирование: on (low)
По умолчанию: deny (входящие), allow (исходящие), disabled (маршрутизированные)
Новые профили: skip

Если вы работаете по SSH, то перед тем, как включать брандмауэр, нужно добавить правило, разрешающее работу по SSH, иначе у вас не будет доступа к серверу:

$ sudo ufw allow OpenSSH

Политика по умолчанию

Перед тем, как перейти к добавлению правил, необходимо указать политику по умолчанию. Какие действия будут применяться к пакетам, если они не подпадают под созданные правила фаервола. Все входящие пакеты будем отклонять:

$ sudo ufw default deny incoming
Правило по умолчанию incoming изменено на «deny»
(не забудьте соответственно обновить правила)

А все исходящие — разрешим:

$ sudo ufw default allow outgoing
Правило по умолчанию outgoing изменено на «allow»
(не забудьте соответственно обновить правила)

Смотрим текущую политику фаервола:

$ sudo ufw status verbose
Состояние: активен
Журналирование: on (low)
По умолчанию: deny (входящие), allow (исходящие), disabled (маршрутизированные)
Новые профили: skip
Эти две команды ничего не изменили в политике — сразу после включения брандмауэра использовалась именно такая политика.

Добавление правил

Чтобы создать разрешающее правило, используется команда allow. Чтобы создать запрещающее правило — используются команды deny и reject. Они отличаются тем, что для deny отправителю отсылается пакет с уведомлением об ошибке, а для reject входящий пакет просто отбрасывается.

$ ufw allow служба
$ ufw allow порт
$ ufw allow порт/протокол

Посмотреть доступные имена приложений можно с помощью команды:

$ sudo ufw app list
Доступные приложения:
  Apache
  Apache Full
  Apache Secure
  CUPS
  OpenSSH

Правило для OpenSSH

Чтобы открыть порт 22 для SSH, нужно добавить правило:

$ sudo ufw allow OpenSSH
$ sudo ufw allow 22/tcp

После выполнения одной из этих команд:

$ sudo ufw status verbose
Состояние: активен
Журналирование: on (low)
По умолчанию: deny (входящие), allow (исходящие), disabled (маршрутизированные)
Новые профили: skip

В                          Действие    Из
----------------------------------------------------
22/tcp                     ALLOW IN    Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)

Правило для Apache

Чтобы открыть порт 80 для Apache, нужно выполнить одну из этих команд:

$ sudo ufw allow Apache
$ sudo ufw allow 80/tcp

Чтобы открыть порт 443 для Apache, нужно выполнить одну из этих команд:

$ sudo ufw allow 'Apache Secure'
$ sudo ufw allow 443/tcp

Состояние после выполнения этих команд:

$ sudo ufw status verbose
Состояние: активен
Журналирование: on (low)
По умолчанию: deny (входящие), allow (исходящие), disabled (маршрутизированные)
Новые профили: skip

В                             Действие    Из
-------------------------------------------------------
80/tcp (Apache)               ALLOW IN    Anywhere
443/tcp (Apache Secure)       ALLOW IN    Anywhere
80/tcp (Apache (v6))          ALLOW IN    Anywhere (v6)
443/tcp (Apache Secure (v6))  ALLOW IN    Anywhere (v6)

Направление трафика

Можно указать направление следования трафика с помощью слов out — для исходящего и in — для входящего.

$ ufw allow направление порт

Например, разрешим только исходящий трафик на порт 80, а входящий запретим:

$ sudo ufw allow out 80/tcp
$ sudo ufw deny in 80/tcp

Полный синтаксис

Также можно использовать более полный синтаксис добавления правил:

$ ufw allow направление on интерфейс proto протокол \
> from ip-адрес port порт to ip-адрес port порт

Разрешить все входящие соединения HTTP и HTTPS с любого хоста на любом сетевом интерфейсе:

$ sudo ufw allow in proto tcp from any to any port 80,443

Разрешить все входящие соединения к серверу MySQL (порт 3306) на сетевом интерфейсе eth0:

$ sudo ufw allow in on eth0 proto tcp to any port 3306

В качестве ip-адреса источника может использоваться также и адрес подсети. Например, разрешим доступ со всех IP-адресов подсети по протоколу TCP к нашему IP-адресу 192.168.110.2 на порту 5901:

$ sudo ufw allow in proto tcp from 192.168.110.0/24 to 192.168.110.2 port 5901

Больше примеров можно найти в документации

$ man ufw
NAME
       ufw - program for managing a netfilter firewall
DESCRIPTION
       This program is for managing a Linux firewall and aims to provide an easy to use interface for the user.
USAGE
       ufw [--dry-run] enable|disable|reload

       ufw [--dry-run] default allow|deny|reject [incoming|outgoing|routed]

       ufw [--dry-run] logging on|off|LEVEL

       ufw [--dry-run] reset

       ufw [--dry-run] status [verbose|numbered]

       ufw [--dry-run] show REPORT

       ufw [--dry-run] [delete] [insert NUM] [prepend] allow|deny|reject|limit [in|out] [log|log-all]
       [ PORT[/PROTOCOL] | APPNAME ] [comment COMMENT]

       ufw [--dry-run] [rule] [delete] [insert NUM] [prepend] allow|deny|reject|limit [in|out [on INTERFACE]] 
       [log|log-all] [proto PROTOCOL] [from ADDRESS [port PORT | app APPNAME ]]
       [to ADDRESS [port PORT | app APPNAME ]] [comment COMMENT]

       ufw  [--dry-run]  route  [delete] [insert NUM] [prepend] allow|deny|reject|limit
       [in|out on INTERFACE] [log|log-all] [proto PROTOCOL] [from ADDRESS [port PORT | app APPNAME]]
       [to ADDRESS [port PORT | app APPNAME]] [comment COMMENT]

       ufw [--dry-run] [--force] delete NUM

       ufw [--dry-run] app list|info|default|update
..........

Правило limit

С помощью правила limit можно ограничить количество подключений к определённому порту с одного IP-адреса, это может быть полезно для защиты от атак перебора паролей. По умолчанию подключения блокируются, если пользователь пытается создать шесть и больше подключений за 30 секунд:

$ sudo ufw limit ssh/tcp

Удаление правил

Чтобы удалить правило, используется команда delete. Например, мы создали два правила для порта 80:

$ sudo ufw allow out 80/tcp
$ sudo ufw deny in 80/tcp

Теперь удалим эти два правила:

$ sudo ufw delete allow out 80/tcp
$ sudo ufw delete deny in 80/tcp

Более удобный способ — удалять правила по номеру

$ sudo ufw status numbered 
Состояние: активен

     В                          Действие    Из
--------------------------------------------------------
[ 1] OpenSSH                    ALLOW IN    Anywhere                  
[ 2] Apache Full                ALLOW IN    Anywhere                  
[ 3] OpenSSH (v6)               ALLOW IN    Anywhere (v6)             
[ 4] Apache Full (v6)           ALLOW IN    Anywhere (v6) 
$ sudo ufw delete 2
Удаление:
 allow 'Apache Full'
Продолжить операцию (y|n)? y
Правило удалено

Логирование UFW

Чтобы отлаживать работу UFW, могут понадобится журналы работы брандмауэра. Для включения журналирования используется команда logging:

$ sudo ufw logging on

Также этой командой можно изменить уровень логирования (low, medium, high):

$ sudo ufw logging medium

Лог сохраняется в директории /var/log/ufw.

Отключение UFW

Чтобы полностью отключить UFW — достаточно использовать команду disable:

$ sudo ufw disable

Если что-то пошло не так, можно использовать команду reset для сброса настроек до состояния по умолчанию:

$ sudo ufw reset

Файлы конфигурации

Файлы конфигурации расположены в файле /etc/default/ufw и директории /etc/ufw

  • /etc/default/ufw — основная конфигурация для политик по умолчанию, поддержки IPv6 и модулей ядра
  • /etc/ufw/before[6].rules — правила в этих файлах выполняются до добавления каких-либо правил с помощью команды ufw
  • /etc/ufw/after[6].rules — правила в этих файлах выполняются после любых правил, добавленных с помощью команды ufw
  • /etc/ufw/sysctl.conf — параметры сети ядра
  • /etc/ufw/ufw.conf — устанавливает, включен ли ufw при загрузке, и устанавливает LOGLEVEL

Файл /etc/default/ufw

# Set to yes to apply rules to support IPv6 (no means only IPv6 on loopback
# accepted). You will need to 'disable' and then 'enable' the firewall for
# the changes to take affect.
IPV6=yes

# Set the default input policy to ACCEPT, DROP, or REJECT. Please note that if
# you change this you will most likely want to adjust your rules.
DEFAULT_INPUT_POLICY="DROP"

# Set the default output policy to ACCEPT, DROP, or REJECT. Please note that if
# you change this you will most likely want to adjust your rules.
DEFAULT_OUTPUT_POLICY="ACCEPT"

# Set the default forward policy to ACCEPT, DROP or REJECT.  Please note that
# if you change this you will most likely want to adjust your rules
DEFAULT_FORWARD_POLICY="DROP"

# Set the default application policy to ACCEPT, DROP, REJECT or SKIP. Please
# note that setting this to ACCEPT may be a security risk. See 'man ufw' for
# details
DEFAULT_APPLICATION_POLICY="SKIP"

# By default, ufw only touches its own chains. Set this to 'yes' to have ufw
# manage the built-in chains too. Warning: setting this to 'yes' will break
# non-ufw managed firewall rules
MANAGE_BUILTINS=no

#
# IPT backend
#
# only enable if using iptables backend
IPT_SYSCTL=/etc/ufw/sysctl.conf

# Extra connection tracking modules to load. IPT_MODULES should typically be
# empty for new installations and modules added only as needed. See
# 'CONNECTION HELPERS' from 'man ufw-framework' for details. Complete list can
# be found in net/netfilter/Kconfig of your kernel source. Some common modules:
# nf_conntrack_irc, nf_nat_irc: DCC (Direct Client to Client) support
# nf_conntrack_netbios_ns: NetBIOS (samba) client support
# nf_conntrack_pptp, nf_nat_pptp: PPTP over stateful firewall/NAT
# nf_conntrack_ftp, nf_nat_ftp: active FTP support
# nf_conntrack_tftp, nf_nat_tftp: TFTP support (server side)
# nf_conntrack_sane: sane support
IPT_MODULES=""

По умолчанию ufw изменяет только цепочки, которые сам и создает. Базовые цепочки (INPUT, FORWARD, OUTPUT и т.д.) остаются без изменений. Это можно изменить с помощью опции MANAGE_BUILTINS — но это может сломать правила, которые были добавлены не ufw.

Файл /etc/ufw/sysctl.conf

# Configuration file for setting network variables. Please note these settings
# override /etc/sysctl.conf and /etc/sysctl.d. If you prefer to use
# /etc/sysctl.conf, please adjust IPT_SYSCTL in /etc/default/ufw. See
# Documentation/networking/ip-sysctl.txt in the kernel source code for more
# information.

# Uncomment this to allow this host to route packets between interfaces
#net/ipv4/ip_forward=1
#net/ipv6/conf/default/forwarding=1
#net/ipv6/conf/all/forwarding=1

# Disable ICMP redirects. ICMP redirects are rarely used but can be used in
# MITM (man-in-the-middle) attacks. Disabling ICMP may disrupt legitimate
# traffic to those sites.
net/ipv4/conf/all/accept_redirects=0
net/ipv4/conf/default/accept_redirects=0
net/ipv6/conf/all/accept_redirects=0
net/ipv6/conf/default/accept_redirects=0

# Ignore bogus ICMP errors
net/ipv4/icmp_echo_ignore_broadcasts=1
net/ipv4/icmp_ignore_bogus_error_responses=1
net/ipv4/icmp_echo_ignore_all=0

# Don't log Martian Packets (impossible addresses)
# packets
net/ipv4/conf/all/log_martians=0
net/ipv4/conf/default/log_martians=0

#net/ipv4/tcp_fin_timeout=30
#net/ipv4/tcp_keepalive_intvl=1800

# Uncomment this to turn off ipv6 autoconfiguration
#net/ipv6/conf/default/autoconf=1
#net/ipv6/conf/all/autoconf=1

# Uncomment this to enable ipv6 privacy addressing
#net/ipv6/conf/default/use_tempaddr=2
#net/ipv6/conf/all/use_tempaddr=2

Добавленные пользователем правила сохраняются в файлах /etc/ufw/user[6].rules. Например, после выполнения команды

$ sudo ufw allow OpenSSH

В эти два файла будут добавлены строки, разрешающие подключение по протоколу tcp на 22-ом порту

*filter
..........
### RULES ###

### tuple ### allow tcp 22 0.0.0.0/0 any 0.0.0.0/0 OpenSSH - in
-A ufw-user-input -p tcp --dport 22 -j ACCEPT -m comment --comment 'app_OpenSSH'

### END RULES ###
..........
*filter
..........
### RULES ###

### tuple ### allow tcp 22 ::/0 any ::/0 OpenSSH - in
-A ufw6-user-input -p tcp --dport 22 -j ACCEPT -m comment --comment 'app_OpenSSH'

### END RULES ###
..........

Настройка иаршрутизации

Допустим, есть локальная сеть 172.16.220.0/24 и сервер с двумя сетевыми интерфейсами. Интерфейс eth0 смотрит в интернет и имеет ip-адрес 123.123.123.123, интерфейс eth1 смотрит во внутреннюю сеть. Сервер должен обеспечивать выход в интернет для всех компьютеров сети.

Включить ufw и разрешить запуск при загрузке системы

$ sudo ufw allow OpenSSH
$ sudo ufw enable

Разрешить пересылку (forward) пакетов между интерфейсами

$ sudo nano /etc/ufw/sysctl.conf
# Uncomment this to allow this host to route packets between interfaces
net/ipv4/ip_forward=1
#net/ipv6/conf/default/forwarding=1
#net/ipv6/conf/all/forwarding=1
$ sudo ufw disable
$ sudo ufw enable

Политика по умолчанию для цепочек INPUT, FORWARD, OUTPUT

$ sudo nano /etc/default/ufw
DEFAULT_INPUT_POLICY="DROP"
DEFAULT_OUTPUT_POLICY="ACCEPT"
DEFAULT_FORWARD_POLICY="DROP"

Подмена ip-адреса источника на ip-адрес 123.123.123.123

$ sudo nano /etc/ufw/before.rules
# добавляем правило для цепочки POSTROUTING таблицы nat
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 172.16.220.0/24 -o eth0 -j MASQUERADE
COMMIT

# Don't delete these required lines, otherwise there will be errors
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
# End required lines
..........
# разрешить пересылку (forward) пакетов между интерфейсами
-A ufw-before-forward -i eth1 -o etho -s 172.16.220.0/24 -j ACCEPT
-A ufw-before-forward -i eth0 -o eth1 -d 172.16.220.0/24 -j ACCEPT
..........
COMMIT

Перезагружаем ufw, чтобы применить новые правила

$ sudo ufw reload

Дополнительно

Поиск: CLI • Linux • Ubuntu • Команда • UFW • iptables • Фаервол • Брандмауэр • TCP • UDP • Порт

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.