Настало время более детально познакомиться с предустановленным в систему Ubuntu 12.04 фаерволом, а именно ufw (Ubuntu Firewall) который является некой оберткой для iptables.

Просто с первого взгляда да и не сильного знакомства с iptablesработа с ним превращается в недопонимание, как строить правила, как ими управлять. Но это процесс времени, можно и нужно попрактиковаться некоторое время и трудностей больше не будет. А сейчас я пока разберусь, хоть и кратко, но для меня это будет более чем достаточно:

ekzorchik@srv-serv:~$ apt-cache search ufw

ufw – program for managing a Netfilter firewall

gufw – graphical user interface for ufw

из вывода становится понятно, что если у Вас используется серверная часть (т. е. Без GUI) то нужно использоваться ufw в противном случае для Desktopgufw, сейчас в рамках данной заметки я буду рассматривать без guiтак я по крайнем мере лучше понимаю, да и просто мне нравится все делать своими руками, а не щелкать кнопочки (+ практикуюсь набором слепой печати).

ekzorchik@srv-serv:~$ sudo apt-get install ufw

По умолчанию в системе Ubunu 12.04фаервол выключен, будем исправлять это дело придерживаясь принципа: все запретить, а разрешить только нужное.

ekzorchik@srv-serv:~$ sudo ufw status

Status: inactive

На заметку:

Хочу предупредить если к системе вы подключаетесь через программу putty,winscp то советую сперва настроить правила, а уже потом включить ufwв противном случае легко может оказаться, что доступ Вы потеряете.

ekzorchik@srv-serv:~$ sudo ufw enable

Command may disrupt existing ssh connections. Proceed with operation (y|n)? y

Firewall is active and enabled on system startup

Также можно включить использование ufw через правку конфигурационного файла:

ekzorchik@srv-serv:~$ sudo cat /etc/ufw/ufw.conf | grep -v '^#'

ENABLED=yes

LOGLEVEL=off

На заметку: если система выступает в роли шлюза (как правило имеется 2 и более сетевых адаптеров), то нужно активировать для ufw возможность пересылки пакетов из внутренней сети в другую и обратно:

ekzorchik@srv-serv:~$ sudo nano /etc/default/ufw

DEFAULT_FORWARD_POLICY="ACCEPT"

или по другому внеся изменения в ekzorchik@srv-serv:~$ sudo nano /etc/ufw/sysctl.conf

net/ipv4/ip_forward=1

ekzorchik@srv-serv:~$ sudo sysctl -p

потому как настройка в /etc/ufw/sysctl.conf перекрывает настройки заданные в /etc/sysctl.conf, чтобы сделать наоборот следует:

ekzorchik@srv-serv:~$ sudo nano /etc/ufw/ufw.conf

IPT_SYSCTL=/etc/sysctl.conf

Сохранить внесенные изменения и перезапустить ufw

ekzorchik@srv-serv:~$ sudo ufw reload

Т.к. я нигде пока не использую ipv6 (ведь ранее даже разбирал, как отключить поддержку для всех системы), то также выключу и в ufw:

ekzorchik@srv-serv:~$ sudo nano /etc/default/ufw

IPV6=no

  • Запретим доступ к системе из вне: (правило применяется сразу же)

ekzorchik@srv-serv:~$ sudo ufw default deny

Default incoming policy changed to ‘deny’

(be sure to update your rules accordingly)

  • Просто включить доступ к системе на определенные порты: (откуда угодно)

ekzorchik@srv-serv:~$ sudo ufw allow ssh

Rule added

ekzorchik@srv-serv:~$ sudo ufw allow http

Rule added

ekzorchik@srv-serv:~$ less /etc/services | grep ssh

ssh 22/tcp # SSH Remote Login Protocol

ssh 22/udp

  • поэтому зная название сервиса из файла /etc/services можно включать и отключать доступ:

ekzorchik@srv-serv:~$ less /etc/services

ekzorchik@srv-serv:~$ sudo ufw deny ftp

Rule added

  • Запретим прощупывание системы посылкой ICMP запросов (т. е. Использование команды ping, по умолчанию в системе ufw разрешает такие запросы)

ekzorchik@srv-serv:~$ sudo nano /etc/ufw/before.rules

# ok icmp codes

-A ufw-before-input -p icmp –icmp-type destination-unreachable -j ACCEPT

-A ufw-before-input -p icmp –icmp-type source-quench -j ACCEPT

-A ufw-before-input -p icmp –icmp-type time-exceeded -j ACCEPT

-A ufw-before-input -p icmp –icmp-type parameter-problem -j ACCEPT

-A ufw-before-input -p icmp –icmp-type echo-request -j ACCEPT

чтобы запретить изменяем ACCEPT на DROP и не забываем сохранить внесенные изменения и перечитать настройки ufw (sudo ufw reload)

  • Теперь разрешим доступ к системе с определенного ip адреса на порт 22:

ekzorchik@srv-serv:~$ sudo ufw allow to 192.168.1.50 port 22 from 192.168.1.58 proto tcp

Rule added

  • ,а если нужно сделать доступ из всего диапазона локальной сети, то так:

(добавляем перед уже существующим правилом новое, после удаляем предшествующее — можно можно сделать как-то по другому я пока не разобрался, но все в процессе: – через некоторое время стало понятно как это сделать по простому, просто отменить предыдущее правило:

ekzorchik@srv-serv:~$ sudo ufw delete allow to 192.168.1.50 port 22 from 192.168.1.58 proto tcp

)

ekzorchik@srv-serv:~$ sudo ufw insert 1 allow to 192.168.1.50 port 22 from 192.168.1.0/24 proto tcp

Rule inserted

ekzorchik@srv-serv:~$ sudo ufw status numbered

Status: active

To Action From

— —— —-

[ 1] 192.168.1.50 22/tcp ALLOW IN 192.168.1.0/24

[ 2] 192.168.1.50 22/tcp ALLOW IN 192.168.1.58

ekzorchik@srv-serv:~$ sudo ufw delete 2

Deleting:

allow from 192.168.1.58 to 192.168.1.50 port 22 proto tcp

Proceed with operation (y|n)? y

Rule deleted

По такому же принципу можно делать и для других портов (25,565,110,993,8080 и т. д.)

  • Включаем логирование: (для всех соединений с указанными настройки информативности)

ekzorchik@srv-serv:~$ sudo ufw logging on

После чего нужно обновить файрвол перезагрузкой ufw:

ekzorchik@srv-serv:~$ sudo ufw reload

Firewall reloaded

  • Отобразить содержимое лога работы ufw можно так:

ekzorchik@srv-serv:~$ sudo tail -f /var/log/ufw.log

, но порой не всегда нужно логировать все и вся, достаточно сузить область поиска к примеру только для ssh соединений к текущему серверу:

ekzorchik@srv-serv:~$ sudo ufw allow log 22/tcp

Rule added

ekzorchik@srv-serv:~$ sudo ufw reload

Firewall reloaded

еще одно но — по умолчанию уровень логирования принимает значение «low

Синтаксис изменения уровня логирования:

ekzorchik@srv-serv:~$ sudo ufw logging low

Logging enabled

На заметку: уровни логирования

  • off – логирование отключено

ekzorchik@srv-serv:~$ sudo ufw logging off

Logging disabled

  • low – логировать только блокируемые пакеты, а также правила для которых активировано логирование
  • medium – то же что и low плюс все разрешенные пакеты
  • high – low + medium и все пакеты rate limiting
  • full – high, но без rate limiting

К примеру текущий размер логов, а это я только включил:

ekzorchik@srv-serv:~$ sudo dir -sh /var/log/ufw.log

60K /var/log/ufw.log

На заметку: следует побеспокоить об включенной опции ротации файлов журнала, т. к. при значительном уровне логирования место на системе можен как бы невзначай закончиться.

  • Разрешим доступ к текущей системе (полный доступ) с определенного IP адреса: (т. е. Доступ к Ubuntu 12.04.5 Server amd64 с Windows станции IP адрес которой 192.168.1.58)

ekzorchik@srv-serv:~$ sudo ufw allow from 192.168.1.58

Rule added

  • Отобразить текущие правила:

ekzorchik@srv-serv:~$ sudo ufw status numbered

Status: active

To Action From

— —— —-

[ 1] Anywhere ALLOW IN 192.168.1.58

  • Удалить правило:

ekzorchik@srv-serv:~$ sudo ufw delete 1

Deleting:

allow from 192.168.1.58

Proceed with operation (y|n)? y

Rule deleted

Еще интересным при использовании UFW является возможность использовать профили приложений, в которых можно использовать только те порты которые которые нужны для работы того или иного приложения:

  • Отобразить все профили приложений:

ekzorchik@srv-serv:~$ sudo ufw app list

Available applications:

OpenSSH

  • Отобразить информацию по профилю OpenSSH:

ekzorchik@srv-serv:~$ sudo ufw app info OpenSSH

Profile: OpenSSH

Title: Secure shell server, an rshd replacement

Description: OpenSSH is a free implementation of the Secure Shell protocol.

Port:

22/tcp

  • Местонахождение профилей:

ekzorchik@srv-serv:~$ ls -l /etc/ufw/applications.d/

Cинтаксис профиля OpenSSH приложения

ekzorchik@srv-serv:~$ cat /etc/ufw/applications.d/openssh-server

[OpenSSH]

title=Secure shell server, an rshd replacement

description=OpenSSH is a free implementation of the Secure Shell protocol.

ports=22/tcp

  • Создам профиль с именем Web:

ekzorchik@srv-serv:~$ sudo cp -r /etc/ufw/applications.d/openssh-server /etc/ufw/applications.d/web

ekzorchik@srv-serv:~$ sudo nano /etc/ufw/applications.d/web

[Web]

title=Web server (LAMP)

description=Web Server (LAMP).

ports=80,81,82/tcp|8080/tcp

  • Активирую созданный профиль Web:

ekzorchik@srv-serv:~$ sudo ufw allow Web

Rule added

  • Выключить созданный профиль Web:

ekzorchik@srv-serv:~$ sudo ufw deny Web

  • Отобразить информацию по профилю Web:

ekzorchik@srv-serv:~$ sudo ufw app info Web

Profile: Web

Title: Web server (LAMP)

Description: Web Server (LAMP).

Ports:

80,81,82/tcp

8080/tcp

  • Таким образом имея настроенные профили можно задействовать их для предоставления доступа определенному адресу с сервисам сервера на основе профиля, к примеру предоставляю для определенного IP адреса возможность подключать к порту 80 для доступа допустим к сервису: Zabbix, Asterisk:

ekzorchik@srv-serv:~$ sudo ufw allow from 192.168.1.58 to 192.168.1.50 app Web

Rule added

ekzorchik@srv-serv:~$ sudo ufw status | grep Web

192.168.1.50 Web ALLOW 192.168.1.58

На заметку: чтобы запретить доступ к системе определенным IP адресам то сперва нужно сделать правило запрета, а потом правило разрешения — потом как приоритет у правил запрета выше чем у правил разрешения, к примеру запретим доступ по порту Web для определенных IP адресов, но разрешим для всех остальных:

ekzorchik@srv-serv:~$ sudo ufw deny from 192.168.1.2 to any port 22

Rule added

ekzorchik@srv-serv:~$ sudo ufw deny from 192.168.1.3 to any port 22

Rule added

ekzorchik@srv-serv:~$ sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp

Rule added

  • Еще есть возможность принудительно запретить из системы/сети запросы из во вне:

ekzorchik@srv-serv:~$ sudo ufw default deny outgoing

Default outgoing policy changed to ‘deny’

(be sure to update your rules accordingly)

ekzorchik@srv-serv:~$ ping ya.ru

ping: unknown host ya.ru

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

ekzorchik@srv-serv:~$ sudo ufw default allow outgoing

Default outgoing policy changed to ‘allow’

(be sure to update your rules accordingly)

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

1) Запретиь все входящие запросы

ekzorchik@srv-serv:~$ sudo ufw default deny incoming

2) Запретить все исходящие запросы

ekzorchik@srv-serv:~$ sudo ufw default deny outgoing

3) Разрешить все входящие соединения на порт 22

ekzorchik@srv-serv:~$ sudo ufw allow in 22/tcp

4) Разрешить все исходящие соединения с порт 22

ekzorchik@srv-serv:~$ sudo ufw allow out 22/tcp

В итоге типовой шаблон правил для моей системы выглядит следующим образом:

  • ekzorchik@srv-serv:~$ sudo ufw default deny incoming
  • ekzorchik@srv-serv:~$ sudo ufw default allow outgoing
  • ekzorchik@srv-serv:~$ sudo ufw allow in 22/tcp
  • ekzorchik@srv-serv:~$ sudo ufw enable
  • запретить все ping запросы к системе
  • ekzorchik@srv-serv:~$ sudo nano /etc/ufw/before.rules

# ok icmp codes

-A ufw-before-input -p icmp –icmp-type destination-unreachable -j ACCEPT

-A ufw-before-input -p icmp –icmp-type source-quench -j ACCEPT

-A ufw-before-input -p icmp –icmp-type time-exceeded -j ACCEPT

-A ufw-before-input -p icmp –icmp-type parameter-problem -j ACCEPT

-A ufw-before-input -p icmp –icmp-type echo-request -j ACCEPT

чтобы запретить изменяем ACCEPT на DROP и не забываем сохранить внесенные изменения

  • ekzorchik@srv-serv:~$ sudo nano /etc/default/ufw

IPV6=no

  • ekzorchik@srv-serv:~$ sudo ufw reload

В итоге результирующая информацию по правила следующая:

ekzorchik@srv-serv:~$ sudo ufw status verbose

Status: active

Logging: on (low)

Default: deny (incoming), allow (outgoing)

New profiles: skip

To Action From

— —— —-

22/tcp ALLOW IN Anywhere

Конечно же по описанному в этой заметки нельзя охватить всех возможностей данного фронтенда, но как известно нужно начинать с малого и постепенно увеличивать сложность. Вот и я этой заметкой только начал его использование. Вывел базовые настройки по обеспечению безопасности системы, уж лучше хоть никакая но защита чем ее остутствие, поэтому считаю данную заметку завершенной и работоспособной, до встречи с уважением автор блога — ekzorchik.

От ekzorchik

Всем хорошего дня, меня зовут Александр. Я под ником - ekzorchik, являюсь автором всех написанных, разобранных заметок. Большинство вещей с которыми мне приходиться разбираться, как на работе, так и дома выложены на моем блоге в виде пошаговых инструкции. По сути блог - это шпаргалка онлайн. Каждая новая работа где мне случалось работать вносила новые знания и нюансы работы и соответственно я расписываю как сделать/решить ту или иную задачу. Это очень помогает. Когда сам разбираешь задачу, стараешься ее приподнести в виде структурированной заметки чтобы было все наглядно и просто, то процесс усвоения идет в гору. Также прошу на https://win.ekzorchik.ru https://lin.ekzorchik.ru https://net.ekzorchik.ru https://voip.ekzorchik.ru https;//home.ekzorchik.ru