Коротко о файрволлах

Файрволлы это тема для диссертации, а не для статьи в блоге, но кое-что все таки можно написать и помочь соискателям защитить свои сервера. И не важно будь то сервер дома или на работе. В статье я приведу самые популярные примеры использования стандартных (и не совсем) средств защиты для дома и малого бизнесса, а именно это пару примеров про IPtables, пару примеров про его fronted в Ubuntu – ufw (UncomplicatedFirewall) и совсем немного поговорим об отдельных свободных решениях, в частности Monowall. В статье будут примеры для Ubuntu Server 12.04, Debian Server и Fedora 17 Linux. Далее полезные примеры на все случаи жизни. Поехали

UFW

Начнем пожалуй с простого. Самым простым в теме, будет начать с Uncomplicated Firewall для Ubuntu Server 12.04.1 Реально все просто и понятно. Как мы уже знаем по умолчанию IPtables отключен в Ubuntu. Для тех кто еще не понял, или не внимательно читал повторюсь ufw это надстройка (fronted ) для IPtables.

Прежде чем начать закрывать или открывать что-либо нужно определится с политиками по умолчанию. Обычно политика защиты по умолчанию такая:
– Allow all outgoing connections (разрешить ВСЕ исходящие)
– Allow established connections (разрешить ВСЕ установленные)
– Deny all incoming connections (запретить ВСЕ входящие, т.е. все кроме того что мы откроем должно пресекаться на корню без суда и следствия)

Начать стоит с трех простых вышеописанных правил:

$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing
$ sudo ufw logging on
$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing
$ sudo ufw logging on

Первое правило запрещает ВСЕ входящие соединения. Второе правило разрешает ВСЕ исходящие соединения. Третье правило гласит – нужно вести логи =)

Если работаете по удаленке с сервером (через SSH) то можете не боятся вводить эти правила, пока вы не включите файрвол правила не активируются.

Теперь когда есть стандартные политики, можно начать открывать нужные нам порты, адреса, сети, протоколы и т.д.
Я работаю на домашнем сервере с внешним IP. На сервере крутится много сервисов:

  • – Web Server
  • – MySQL\PHP
  • – SSH
  • – SAMBA
  • – NFS
  • – FTP
  • – Webmin
  • – Облачный сервис (OwnCloud)
  • – Система видео наблюдения motion со своим маленьким web-server’ом

Первое, что-бы иметь доступ к серверу нужно открыть SSH (порт 22):

$ sudo ufw allow ssh/tcp
$ sudo ufw allow ssh/tcp

Открыть миру доступ к 80 порту

$ sudo ufw allow www
$ sudo ufw allow www

Открыть доступ миру к порту 10000 (Webmin)

$ sudo ufw allow webmin/tcp
$ sudo ufw allow webmin/tcp

Я этого не делал, а открыл адрес только для IP с работы:

$ sudo ufw allow from <ip address> to <protocol> port <port number></port></protocol></ip>
$ sudo ufw allow from <ip address> to <protocol> port <port number></port></protocol></ip>

ПРИМЕР:

$ sudo ufw allow from 211.225.81.62 to any port 10000
$ sudo ufw allow from 211.225.81.62 to any port 10000

Для системы видео наблюдения motion также открыл доступ только с работы:

ПРИМЕР:

$ sudo ufw allow from 49.156.47.255 to any port 8081
$ sudo ufw allow from 49.156.47.255 to any port 8081

Теперь можно активировать ufw и заодно проверить его статус:

$ sudo ufw enable
$ sudo ufw status
$ sudo ufw enable
$ sudo ufw status

Более полный вывод инфы:

$ ufw status verbose
$ ufw status verbose

ВЫВОД:

root@server:/home/user# ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)
New profiles: skip
 
To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
10000                      ALLOW IN    49.156.47.255
8081                       ALLOW IN    49.156.47.255
22/tcp                     ALLOW IN    Anywhere (v6)
80/tcp                     ALLOW IN    Anywhere (v6)
[email protected]:/home/user# ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
10000                      ALLOW IN    49.156.47.255
8081                       ALLOW IN    49.156.47.255
22/tcp                     ALLOW IN    Anywhere (v6)
80/tcp                     ALLOW IN    Anywhere (v6)

Как видно выше вывод информации полный, аккуратный и исчерпывающий.
ОДНАКО, из вывода видно что порты 22 и 80 открыты так же и для протокола 6-ый версии. Непорядок! Первое что нужно сделать, если конечно вы не пользуетесь IPv6, отключить его поддержку в системе:

$ sudo vi /etc/sysctl.conf
$ sudo vi /etc/sysctl.conf

Теперь впишите туда:

# IPv6 disable
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
# IPv6 disable
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

Загрузите новые настройки:

$ sudo sysctl -p
$ sudo sysctl -p

На всякий случай перезапустите систему:

$ sudo init 6
$ sudo init 6

Теперь когда поддержка ipv6 отключена в системе, нужно отрубить ее в настройках ufw что-бы зря глаза не мазолило, открываем файл /etc/default/ufw:

$ sudo vi /etc/default/ufw
$ sudo vi /etc/default/ufw

Там ищем опцию: IPV6=yes
и понятное дело меняем на: IPV6=no

Рестартуем файрвол:

$ sudo ufw disable
$ sudo ufw enable
$ sudo ufw disable
$ sudo ufw enable

И смотрим статус:

root@server:/home/user# ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)
New profiles: skip
 
To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
10000                      ALLOW IN    49.156.47.255
8081                       ALLOW IN    49.156.47.255
[email protected]:/home/user# ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
10000                      ALLOW IN    49.156.47.255
8081                       ALLOW IN    49.156.47.255

IPv6 пропал из виду.

ПРИМЕРЫ

Теперь давайте пробежимся по примерам, для общего развития:

Включить ufw:

$ sudo ufw enable
$ sudo ufw enable

Выключить ufw:

$ sudo ufw disable
$ sudo ufw disable

Проверить статус:

$ sudo ufw status
$ sudo ufw status verbose
$ sudo ufw status
$ sudo ufw status verbose

Открыть порт:

$ sudo ufw allow ssh
$ sudo ufw allow 22
$ sudo ufw allow ssh
$ sudo ufw allow 22

Открыть для протокола tcp:

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

Закрыть порт 53 для протокола UDP:

$ sudo ufw deny 53/udp
$ sudo ufw deny 53/udp

Закрыть порт полностью:

$ sudo ufw deny 53
$ sudo ufw deny 53

Посмотреть список сервисов:

$ sudo ufw app list
$ sudo ufw app list

Открыть определенный порт для определенного IP:

$ sudo ufw allow from <ip address> to <protocol> port <port number></port></protocol></ip>
$ sudo ufw allow from <ip address> to <protocol> port <port number></port></protocol></ip>

Включить ведение логов:

$ sudo ufw logging on
$ sudo ufw logging on

Сбросить все правила:

$ sudo ufw reset
$ sudo ufw reset

Удалить существующее правило:

$ sudo ufw delete deny 80/tcp
$ sudo ufw delete deny 80/tcp

Открыть все для специфичного IP:

$ sudo ufw allow from <ip address></ip>
$ sudo ufw allow from <ip address></ip>

Открыть доступ пакетов с целой подсети:

$ sudo ufw allow from 192.168.1.0/24
$ sudo ufw allow from 192.168.1.0/24

Отключить пинг:

$ sudo vi /etc/ufw/before.rules
$ sudo vi /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
# 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.

Разрешить доступ к MySQL с вашей локальной сети:

$ sudo ufw allow from 10.0.0.0/8 to any port 3306/tcp
$ sudo ufw allow from 10.0.0.0/8 to any port 3306/tcp

Открыть MySQL миру:

$ sudo ufw allow mysql
$ sudo ufw allow mysql

У вас на серврере есть торрент? Открываем так (Transmission):

$ sudo ufw allow 9091
$ sudo ufw allow 20500:20599/tcp
$ sudo ufw allow 20500:20599/udp
$ sudo ufw allow 9091
$ sudo ufw allow 20500:20599/tcp
$ sudo ufw allow 20500:20599/udp

Обезопасить SSH, а именно от брут форса (brute-force) ufw будет запрещать соединения если IP сделал 6ть или более попыток установить соединение в течении 30 секунд.

$ sudo ufw limit ssh/tcp
$ sudo ufw limit ssh/tcp

или с логами (в том случае если ведение логов в общем выключено):

$ sudo ufw limit log 22/tcp
$ sudo ufw limit log 22/tcp

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

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

Посмотреть номера правил:

$ sudo ufw status numbered
$ sudo ufw status numbered

Открыть FTP для мира (полная жопа, не делайте так):

$ sudo ufw allow ftp
$ sudo ufw allow ftp

Открыть FTP для спец IP (уже лучше):

$ sudo ufw allow from 49.156.47.255 port 21
$ sudo ufw allow from 49.156.47.255 port 20
$ sudo ufw allow from 49.156.47.255 port 21
$ sudo ufw allow from 49.156.47.255 port 20

Но помним про активный и пассивный режим FTP соединения. В данном случае речь идет об АКТИВНОМ соединении. Это значит, что если ваш клиент открывает соединение с своего порта 1024+ на порт 21 на сервере, инфушка вернется клиенту на 20 порт и проскочит без проблем.

В противном случае (ПАССИВНЫЙ режим) сервер у себя откроет 20 порт а к клиенту ломанется на 1024+ порт ну и понятно там его обламает ufw.

Думаю что-бы понять что к чему я привел достаточно примеров. В данной статье получилось слишком много текста и что-бы не отпугивать читателя и не утомлять, я решил сделать цикл статей. Эта будет первой, в следующей рассмотрим работу чистого IPtables в кратце и посмотрим пару занимательных примеров для Debian & Fedora. Удачи!

Многое подчерпнул тут: http://manpages.ubuntu.com/manpages/precise/en/man8/ufw.8.html