Configure a firewall for Discourse

If you are using a standard Docker based Discourse install, the following Uncomplicated Firewall rules will protect any non-Docker services on your server:

ufw allow http
ufw allow https
ufw allow ssh
ufw enable

That is, allow HTTP (port 80), HTTPS (port 443), and SSH (port 22), and nothing else.

:warning: Note: Docker manipulates iptables directly and bypasses ufw rules. This means ufw cannot block or restrict access to ports exposed by Docker containers (ports 80 and 443 in a standard Discourse install). The ufw rules above will only protect non-Docker services running on your host.

Check the current status of your firewall with

ufw status verbose

Sample output:

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
80                         ALLOW IN    Anywhere
443                        ALLOW IN    Anywhere
22                         ALLOW IN    Anywhere
80 (v6)                    ALLOW IN    Anywhere (v6)
443 (v6)                   ALLOW IN    Anywhere (v6)
22 (v6)                    ALLOW IN    Anywhere (v6)

And if you ever want to turn it off

ufw disable

A default Docker install of Discourse only exposes ports 80 and 443, so a host firewall is not strictly necessary. But if you have other services running on the host that listen on additional ports, adding a firewall provides an extra layer of “belt and suspenders” security for those services.

Last edited by @JammyDodger 2024-05-25T11:25:44Z

Check documentPerform check on document:
33 лайка

Насколько я понимаю, в Docker-контейнере открыто очень мало портов для хост-системы, поэтому Discourse фактически изолирован брандмауэром от сервера, на котором он работает.

Конечно, если на хост-системе запущены другие службы, то, как говорит капитан Очевидность, необходимо принять разумные меры предосторожности.

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

1 лайк

Тема не совсем точна. Если UFW используется вне Docker, как «обычно» на VPS, то к Discourse он неприменим как таковой. Я могу отключить порт 80, но доступ к Discourse/Docker всё равно останется открытым.

Конечно, он защищает всё остальное, но если других служб, слушающих порты, нет, то это излишне.

Я не знаю, как работают UFW или iptables, если их использовать после команды enter app, или можно ли вообще применять фаервол таким образом.

Я ссылаюсь на эту тему:

3 лайка

Мне определенно было бы интересно услышать эту историю, возможно, в отдельной теме :slight_smile:

Кстати, обсуждения взаимосвязи между Docker и ufw/файрволами ведутся почти с самого появления Docker. Вот одна из заметных тем с множеством интересных инсайтов:

Команда Docker в последние годы значительно улучшила документацию по соответствующим деталям: Packet filtering and firewalls | Docker Docs

Не хочу слишком засорять тему ссылками, но если вас интересует тема файрволов, эти материалы кажутся очень полезными для ознакомления, а также стоит провести общий поиск в Google для получения дополнительной информации.

Исходя из некоторых из этих мнений и из очень полезной темы, на которую ссылается @Jagster, кажется, что конфигурация установки Discourse по умолчанию с Docker может быть достаточной сама по себе? В конце концов, моя выглядит так:

$ docker ps
CONTAINER ID   IMAGE                 COMMAND        CREATED      STATUS        PORTS                                                                      NAMES
5dd4a572cd8e   local_discourse/app   "/sbin/boot"   6 days ago   Up 16 hours   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app

Так что, если я не ошибаюсь, и если на сервере не используются другие порты другим программным обеспечением, я думаю, что единственный входящий трафик должен быть на указанных портах 80 и 443.

Если вы хотите проверить это, вы можете использовать netstat, чтобы проверить прослушиваемые порты на вашем сервере ( How to Install netstat on Ubuntu ; https://linuxize.com/post/check-listening-ports-linux/ )

netstat -tunlp

Для ещё более тщательной проверки вы можете запустить второй небольшой сервер Linux и попробовать просканировать открытые порты вашего сервера Discourse: How To Use Nmap to Scan for Open Ports | DigitalOcean

# сканирование всех портов; вставьте здесь ваш IP-адрес
sudo nmap -n -PN -sT -sU -p- 1.2.3.4
  • Посмотрите включённую ссылку на документацию DigitalOcean для получения дополнительных команд для сканирования и т. д.

Я думаю, что если вы обеспокоены настройкой файрвола для вашего сервера Discourse, эти ресурсы и инсайты должны быть очень полезны :slight_smile:

3 лайка

Мелочь, но эта ссылка, кажется, не работает.

1 лайк

В последнем Ubuntu LTS ufw используется ALLOW, а не ALLOW IN.

Это вызывает раздражение у администратора mail-receiver, так как подготовка API завершается ошибкой в ./launcher logs mail-receiver, даже если порт 25 открыт в ufw.

Решением было разрешить весь входящий и исходящий трафик, а затем запретить нужные порты.

Я пока недостаточно хорошо разбираюсь в iptables, чтобы настроить его более точно.