Настройка UFW в Ubuntu Server 16.04 на примере BigBlueButton

    UFW (Uncomplicated Firewall) – это интерфейс iptables, предназначенный для упрощения процесса настройки брандмауэра. Инструмент iptables надёжный и гибкий, но новичку будет непросто настроить его самостоятельно. Я как раз новичок в этом деле.

    По умолчанию в iptables включена политика ACCEPT и выглядет это так:



    В нашем примере нет никаких ограничений. Политика по умолчанию — ACCEPT.

    INPUT – ВХОДЯЩИЕ СОЕДИНЕНИЯ.
    OUTPUT – ИСХОДЯЩИЕ СОЕДИНЕНИЯ.
    FORWARD – МАРШРУТИЗАЦИЯ (НАПРИМЕР, НЕОБХОДИМО ПРОПИСАТЬ МАРШРУТ к компьютеру за шлюзом).

    Включить ufw можно командой sudo ufw enable
    И сразу же после этой команды политика iptables поменяется.
    Вот как она выглядит на BigBlueButton после включения ufw:

    Chain INPUT (policy DROP)
    target     prot opt source               destination
    ufw-before-logging-input  all  --  anywhere             anywhere
    ufw-before-input  all  --  anywhere             anywhere
    ufw-after-input  all  --  anywhere             anywhere
    ufw-after-logging-input  all  --  anywhere             anywhere
    ufw-reject-input  all  --  anywhere             anywhere
    ufw-track-input  all  --  anywhere             anywhere
    
    Chain FORWARD (policy DROP)
    target     prot opt source               destination
    ufw-before-logging-forward  all  --  anywhere             anywhere
    ufw-before-forward  all  --  anywhere             anywhere
    ufw-after-forward  all  --  anywhere             anywhere
    ufw-after-logging-forward  all  --  anywhere             anywhere
    ufw-reject-forward  all  --  anywhere             anywhere
    ufw-track-forward  all  --  anywhere             anywhere
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination
    ufw-before-logging-output  all  --  anywhere             anywhere
    ufw-before-output  all  --  anywhere             anywhere
    ufw-after-output  all  --  anywhere             anywhere
    ufw-after-logging-output  all  --  anywhere             anywhere
    ufw-reject-output  all  --  anywhere             anywhere
    ufw-track-output  all  --  anywhere             anywhere
    
    Chain ufw-after-forward (1 references)
    target     prot opt source               destination
    
    Chain ufw-after-input (1 references)
    target     prot opt source               destination
    ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:netbios-ns
    ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:netbios-dgm
    ufw-skip-to-policy-input  tcp  --  anywhere             anywhere             tcp dpt:netbios-ssn
    ufw-skip-to-policy-input  tcp  --  anywhere             anywhere             tcp dpt:microsoft-ds
    ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:bootps
    ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:bootpc
    ufw-skip-to-policy-input  all  --  anywhere             anywhere             ADDRTYPE match dst-type BROADCAST
    
    Chain ufw-after-logging-forward (1 references)
    target     prot opt source               destination
    LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW BLOCK] "
    
    Chain ufw-after-logging-input (1 references)
    target     prot opt source               destination
    LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW BLOCK] "
    
    Chain ufw-after-logging-output (1 references)
    target     prot opt source               destination
    
    Chain ufw-after-output (1 references)
    target     prot opt source               destination
    
    Chain ufw-before-forward (1 references)
    target     prot opt source               destination
    ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
    ACCEPT     icmp --  anywhere             anywhere             icmp destination-unreachable
    ACCEPT     icmp --  anywhere             anywhere             icmp source-quench
    ACCEPT     icmp --  anywhere             anywhere             icmp time-exceeded
    ACCEPT     icmp --  anywhere             anywhere             icmp parameter-problem
    ACCEPT     icmp --  anywhere             anywhere             icmp echo-request
    ufw-user-forward  all  --  anywhere             anywhere
    
    Chain ufw-before-input (1 references)
    target     prot opt source               destination
    ACCEPT     all  --  anywhere             anywhere
    ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
    ufw-logging-deny  all  --  anywhere             anywhere             ctstate INVALID
    DROP       all  --  anywhere             anywhere             ctstate INVALID
    ACCEPT     icmp --  anywhere             anywhere             icmp destination-unreachable
    ACCEPT     icmp --  anywhere             anywhere             icmp source-quench
    ACCEPT     icmp --  anywhere             anywhere             icmp time-exceeded
    ACCEPT     icmp --  anywhere             anywhere             icmp parameter-problem
    ACCEPT     icmp --  anywhere             anywhere             icmp echo-request
    ACCEPT     udp  --  anywhere             anywhere             udp spt:bootps dpt:bootpc
    ufw-not-local  all  --  anywhere             anywhere
    ACCEPT     udp  --  anywhere             224.0.0.251          udp dpt:mdns
    ACCEPT     udp  --  anywhere             239.255.255.250      udp dpt:1900
    ufw-user-input  all  --  anywhere             anywhere
    
    Chain ufw-before-logging-forward (1 references)
    target     prot opt source               destination
    
    Chain ufw-before-logging-input (1 references)
    target     prot opt source               destination
    
    Chain ufw-before-logging-output (1 references)
    target     prot opt source               destination
    
    Chain ufw-before-output (1 references)
    target     prot opt source               destination
    ACCEPT     all  --  anywhere             anywhere
    ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
    ufw-user-output  all  --  anywhere             anywhere
    
    Chain ufw-logging-allow (0 references)
    target     prot opt source               destination
    LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW ALLOW] "
    
    Chain ufw-logging-deny (2 references)
    target     prot opt source               destination
    RETURN     all  --  anywhere             anywhere             ctstate INVALID limit: avg 3/min burst 10
    LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW BLOCK] "
    
    Chain ufw-not-local (1 references)
    target     prot opt source               destination
    RETURN     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL
    RETURN     all  --  anywhere             anywhere             ADDRTYPE match dst-type MULTICAST
    RETURN     all  --  anywhere             anywhere             ADDRTYPE match dst-type BROADCAST
    ufw-logging-deny  all  --  anywhere             anywhere             limit: avg 3/min burst 10
    DROP       all  --  anywhere             anywhere
    
    Chain ufw-reject-forward (1 references)
    target     prot opt source               destination
    
    Chain ufw-reject-input (1 references)
    target     prot opt source               destination
    
    Chain ufw-reject-output (1 references)
    target     prot opt source               destination
    
    Chain ufw-skip-to-policy-forward (0 references)
    target     prot opt source               destination
    DROP       all  --  anywhere             anywhere
    
    Chain ufw-skip-to-policy-input (7 references)
    target     prot opt source               destination
    DROP       all  --  anywhere             anywhere
    
    Chain ufw-skip-to-policy-output (0 references)
    target     prot opt source               destination
    ACCEPT     all  --  anywhere             anywhere
    
    Chain ufw-track-forward (1 references)
    target     prot opt source               destination
    
    Chain ufw-track-input (1 references)
    target     prot opt source               destination
    
    Chain ufw-track-output (1 references)
    target     prot opt source               destination
    ACCEPT     tcp  --  anywhere             anywhere             ctstate NEW
    ACCEPT     udp  --  anywhere             anywhere             ctstate NEW
    
    Chain ufw-user-forward (1 references)
    target     prot opt source               destination
    
    Chain ufw-user-input (1 references)
    target     prot opt source               destination
    <b>ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
    ACCEPT     udp  --  anywhere             anywhere             udp dpt:ssh
    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:1935
    ACCEPT     udp  --  anywhere             anywhere             udp dpt:1935
    ACCEPT     udp  --  anywhere             anywhere             multiport dports 16384:32768
    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
    ACCEPT     udp  --  anywhere             anywhere             udp dpt:https
    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
    ACCEPT     udp  --  anywhere             anywhere             udp dpt:http
    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:5090
    ACCEPT     udp  --  anywhere             anywhere             udp dpt:5090
    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:sip
    ACCEPT     udp  --  anywhere             anywhere             udp dpt:sip
    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:5066
    ACCEPT     udp  --  anywhere             anywhere             udp dpt:5066
    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:tproxy
    ACCEPT     udp  --  anywhere             anywhere             udp dpt:8081
    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:8082
    ACCEPT     udp  --  anywhere             anywhere             udp dpt:8082
    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:3000
    ACCEPT     udp  --  anywhere             anywhere             udp dpt:3000
    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:2855
    ACCEPT     udp  --  anywhere             anywhere             udp dpt:2855
    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:2856
    ACCEPT     udp  --  anywhere             anywhere             udp dpt:2856</b>
    
    Chain ufw-user-limit (0 references)
    target     prot opt source               destination
    LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 5 LOG level warning prefix "[UFW LIMIT BLOCK] "
    REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
    
    Chain ufw-user-limit-accept (0 references)
    target     prot opt source               destination
    ACCEPT     all  --  anywhere             anywhere
    
    Chain ufw-user-logging-forward (0 references)
    target     prot opt source               destination
    
    Chain ufw-user-logging-input (0 references)
    target     prot opt source               destination
    
    Chain ufw-user-logging-output (0 references)
    target     prot opt source               destination
    
    Chain ufw-user-output (1 references)
    target     prot opt source               destination

    Выделенная область – это место для правил пользователя, они прописываются командами:

    Для порта:

    sudo ufw allow ssh (по названию порта)
    sudo ufw allow 22 (конкретно указать номер порта)
    sudo ufw allow 80/udp (конкретно с указанием номера порта и протокола tcp или udp)

    Для диапазона портов:

    sudo ufw allow 16384:32768/udp

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

    sudo ufw delete allow 80

    Выкладываю порядок действий по настройке ufw на примере bbb.

    Во-первых, смотрим какие сервисы какие порты слушают:

    netstat -ntlp | grep LISTEN

    tcp 0 0 xxx.xxx.xxx.x:5090 0.0.0.0:* LISTEN 1258/freeswitch
    tcp 0 0 127.0.0.1:8100 0.0.0.0:* LISTEN 1720/soffice.bin
    tcp 0 0 xxx.xxx.xxx.x:5060 0.0.0.0:* LISTEN 1258/freeswitch
    tcp 0 0 127.0.0.1:8101 0.0.0.0:* LISTEN 1766/soffice.bin
    tcp 0 0 127.0.0.1:8102 0.0.0.0:* LISTEN 1811/soffice.bin
    tcp 0 0 127.0.0.1:8103 0.0.0.0:* LISTEN 1856/soffice.bin
    tcp 0 0 xxx.xxx.xxx.x:2855 0.0.0.0:* LISTEN 1258/freeswitch
    tcp 0 0 127.0.0.1:8104 0.0.0.0:* LISTEN 1902/soffice.bin
    tcp 0 0 xxx.xxx.xxx.x:2856 0.0.0.0:* LISTEN 1258/freeswitch
    tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 1186/mongod
    tcp 0 0 xxx.xxx.xxx.x:5066 0.0.0.0:* LISTEN 1258/freeswitch
    tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1227/redis-server 1
    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1359/nginx -g daemo
    tcp 0 0 xxx.xxx.xxx.x:8081 0.0.0.0:* LISTEN 1258/freeswitch
    tcp 0 0 xxx.xxx.xxx.x:8082 0.0.0.0:* LISTEN 1258/freeswitch
    tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1176/sshd
    tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 1195/node
    tcp6 0 0 ::1:5090 :::* LISTEN 1258/freeswitch
    tcp6 0 0 ::1:5060 :::* LISTEN 1258/freeswitch
    tcp6 0 0 127.0.0.1:8005 :::* LISTEN 1341/java
    tcp6 0 0 :::5070 :::* LISTEN 1461/java
    tcp6 0 0 :::9999 :::* LISTEN 1461/java
    tcp6 0 0 :::1935 :::* LISTEN 1461/java
    tcp6 0 0 :::8080 :::* LISTEN 1341/java
    tcp6 0 0 :::80 :::* LISTEN 1359/nginx -g daemo
    tcp6 0 0 ::1:8081 :::* LISTEN 1258/freeswitch
    tcp6 0 0 ::1:8082 :::* LISTEN 1258/freeswitch
    tcp6 0 0 :::8021 :::* LISTEN 1258/freeswitch
    tcp6 0 0 :::22 :::* LISTEN 1176/sshd
    tcp6 0 0 :::5080 :::* LISTEN 1461/java


    Нас интересуют строчки с xxx.xxx.xxx.x (xxx.xxx.xxx.x – ip-адрес вашего сервера), так как это указывает что сервис слушает сетевую карту на наличие входящих запросов из всех сетей (0.0.0.0:*). Строчки с 127.0.0.1 нас не интересуют так как это внутренний интерфейс, так же нас интересует сточки с 0.0.0.0 в 4 столбце (выделен жирным), например

    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1359/nginx -g daemo

    так как это говорит, что 80 порт открыт для всех интерфейсов сервера и принимает запросы со всех сетей.

    Итак, согласно этому составляем правила:

    sudo ufw allow 22 для ssh
    sudo ufw allow 80 для вебсервера nginx или apache

    Целый ряд правил для freeswitch:

    sudo ufw allow 5060
    sudo ufw allow 5090
    sudo ufw allow 2855
    sudo ufw allow 2856
    sudo ufw allow 5066
    sudo ufw allow 8081
    sudo ufw allow 8082

    для сервиса node:

    sudo ufw allow 3000
    Далее необходимо посмотреть все-таки документацию, в которой мы увидим что необходимо открыть следующие порты:

    sudo ufw allow 16384:32768/udp — для работы WebRTC
    sudo ufw allow 443
    sudo ufw allow 1935

    На этом базовая настройка ufw для сервера BigBlueButton 2.0 закончена.

    Добавлю только то, что желательно или отключать ssh или менять порт, или разрешить этот порт только для определенной сети, например для сети вашего предприятия.

    К примеру, ваш шлюз имеет два сетевых интерфейса один виртуальный (к пользователям) 192.168.3.2, а другой реальный 105.ххх.ххх.ххх (к провайдеру), вот для правила ufw берем реальный ip, а точнее указываем сеть, которой принадлежит этот ip.

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

    vim /etc/ssh/sshd_config

    Затем удаляем правило, разрешающее 22 порт:

    Sudo ufw delete allow 22 – иногда называется OpenSSH.

    Создаем правило разрешающее подключение к новому порту только из сети предприятия:

    sudo ufw allow from 105.ххх.ххх.ххх/26 to any port 4321

    Затем перезагружаем ssh сервис:

    /etc/init.d/ssh restart

    И смотрим результат

    netstat -ntlp | grep LISTEN

    tcp   0    0.0.0.0:4321    0.0.0.0:*     listen   5676/sshd

    а в правилах ufw увидим, кто имеет доступ к порту:

    ufw status

    4321      ALLOW       105.xxx.xxx.xxx/26

    Уважаемые читатели прошу Вас писать дополнения в комментариях: Как вы считаете, все ли правильно здесь описано, или же необходимо что-то добавить или убрать?
    Поделиться публикацией

    Похожие публикации

    Комментарии 8

      0
      По моему скромнейшему мнению.
      1) В Visio или схожем редакторе стоило бы накидать схему сети. Вот мол внешний интерфейс (ip), вот внутренняя сеть (192.168.0.0/24 — знаю знаю что не феншуйная подсеть для энтерпрайза но новичку понятней), вот сервер/файлопомойка. А уже в листинге не звездочками ip писать.
      2) ИМХО опять же. Я бы в конфигах ssh не менял бы порт. Проще сделать natmap на нужны порт. Мало ли какое количество одинаковых сервисов у тебя будет. Проще править конфиг в одном месте чем прыгать потом по серверам и в конфигах руками менять что то.
        0

        Согласен с обоими пунктами

        0

        Самое время рассказывать про файрволл 16-й убунты, когда 18-я уже вовсю в продакшн. Можете на мои бу-бу-бу не обращать внимания

          0

          НАПРИМЕР, НЕОБХОДИМО ПРОПИСАТЬ МАРШРУТ к компьютеру за шлюзом


          Что? Маршруты и файрволл относятся друг к другу — постольку-посколько. Я не отрицаю, что при работе в качестве машрутизатора, на нем нужно грамотно настраивать цепочки FORWARD, но фраза из статьи уж очень сбивает с толку

            0
            ufw — надстройка над iptables, которая в Ubuntu c 8.04, то есть 10 лет уже. И все что применимо в 16.04 так же применимо в 18.04
              0
              В теории — да, но лучше уж рассматривать на самом актуальном (не пишу — самом свежем, т.к. это ошибочно).
              Касательно ufw — не очень люблю его. Еще отдельный вопрос как он с docker уживается (если речь про разработку). Голый iptables — наше все.
              0
              А вот не согласен. Саппорт 16 LTS будет до 2021 и я не вижу смысла обновляться «вотпрямщас» на 18-ю.
                0
                Я не говорил обновляться — я имел в виду делать новые проекты уже на 18.04 lts.

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое