Коротко о файрволлах
ubuntu
ufw
1 053 | Ноя 28, 2012 | Alan Holt | 4 Comments | How-to, Безопасность
Файрволлы это тема для диссертации, а не для статьи в блоге, но кое-что все таки можно написать и помочь соискателям защитить свои сервера. И не важно будь то сервер дома или на работе. В статье я приведу самые популярные примеры использования стандартных (и не совсем) средств защиты для дома и малого бизнесса, а именно это пару примеров про 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
Первое правило запрещает ВСЕ входящие соединения. Второе правило разрешает ВСЕ исходящие соединения. Третье правило гласит — нужно вести логи =)
Если работаете по удаленке с сервером (через SSH) то можете не боятся вводить эти правила, пока вы не включите файрвол правила не активируются.
Теперь когда есть стандартные политики, можно начать открывать нужные нам порты, адреса, сети, протоколы и т.д.
Я работаю на домашнем сервере с внешним IP. На сервере крутится много сервисов:
-
- Web Server
-
- MySQLPHP
-
- SSH
-
- SAMBA
-
- NFS
-
- FTP
-
- Webmin
-
- Облачный сервис (OwnCloud)
-
- Система видео наблюдения motion со своим маленьким web-server’ом
Первое, что-бы иметь доступ к серверу нужно открыть SSH (порт 22):
$ sudo ufw allow ssh/tcp
Открыть миру доступ к 80 порту
$ sudo ufw allow www
Открыть доступ миру к порту 10000 (Webmin)
$ sudo ufw allow webmin/tcp
Я этого не делал, а открыл адрес только для 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
Для системы видео наблюдения motion также открыл доступ только с работы:
ПРИМЕР:
$ sudo ufw allow from 49.156.47.255 to any port 8081
Теперь можно активировать ufw и заодно проверить его статус:
$ sudo ufw enable
$ sudo ufw status
Более полный вывод инфы:
$ 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)
Как видно выше вывод информации полный, аккуратный и исчерпывающий.
ОДНАКО, из вывода видно что порты 22 и 80 открыты так же и для протокола 6-ый версии. Непорядок! Первое что нужно сделать, если конечно вы не пользуетесь IPv6, отключить его поддержку в системе:
$ 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
Загрузите новые настройки:
$ sudo sysctl -p
На всякий случай перезапустите систему:
$ sudo init 6
Теперь когда поддержка ipv6 отключена в системе, нужно отрубить ее в настройках ufw что-бы зря глаза не мазолило, открываем файл /etc/default/ufw:
$ sudo vi /etc/default/ufw
Там ищем опцию: IPV6=yes
и понятное дело меняем на: IPV6=no
Рестартуем файрвол:
$ 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
IPv6 пропал из виду.
ПРИМЕРЫ
Теперь давайте пробежимся по примерам, для общего развития:
Включить ufw:
$ sudo ufw enable
Выключить ufw:
$ sudo ufw disable
Проверить статус:
$ sudo ufw status
$ sudo ufw status verbose
Открыть порт:
$ sudo ufw allow ssh
$ sudo ufw allow 22
Открыть для протокола tcp:
$ sudo ufw allow 22/tcp
Закрыть порт 53 для протокола UDP:
$ sudo ufw deny 53/udp
Закрыть порт полностью:
$ sudo ufw deny 53
Посмотреть список сервисов:
$ sudo ufw app list
Открыть определенный порт для определенного IP:
$ sudo ufw allow from <ip address> to <protocol> port <port number></port></protocol></ip>
Включить ведение логов:
$ sudo ufw logging on
Сбросить все правила:
$ sudo ufw reset
Удалить существующее правило:
$ sudo ufw delete deny 80/tcp
Открыть все для специфичного IP:
$ sudo ufw allow from <ip address></ip>
Открыть доступ пакетов с целой подсети:
$ sudo ufw allow from 192.168.1.0/24
Отключить пинг:
$ 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
В каждой строчке, слово ACCEPT заменить на DROP.
Разрешить доступ к MySQL с вашей локальной сети:
$ sudo ufw allow from 10.0.0.0/8 to any port 3306/tcp
Открыть MySQL миру:
$ sudo ufw allow mysql
У вас на серврере есть торрент? Открываем так (Transmission):
$ 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 log 22/tcp
Если на сервере больше чем один интерфейс, то полезно разрешать сервис или порт не для всех интерфейсов (так ufw делает по дефолту) а только для того интерфейса, который к примеру слушает ваш веб сервер:
$ sudo ufw allow in on eth0 to any port 80 proto tcp
Посмотреть номера правил:
$ sudo ufw status numbered
Открыть 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
Но помним про активный и пассивный режим FTP соединения. В данном случае речь идет об АКТИВНОМ соединении. Это значит, что если ваш клиент открывает соединение с своего порта 1024+ на порт 21 на сервере, инфушка вернется клиенту на 20 порт и проскочит без проблем.
В противном случае (ПАССИВНЫЙ режим) сервер у себя откроет 20 порт а к клиенту ломанется на 1024+ порт ну и понятно там его обламает ufw.
Думаю что-бы понять что к чему я привел достаточно примеров. В данной статье получилось слишком много текста и что-бы не отпугивать читателя и не утомлять, я решил сделать цикл статей. Эта будет первой, в следующей рассмотрим работу чистого IPtables в кратце и посмотрим пару занимательных примеров для Debian & Fedora. Удачи!
Многое подчерпнул тут: http://manpages.ubuntu.com/manpages/precise/en/man8/ufw.8.html