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에는 여전히 열려 있습니다.

다른 서비스를 보호하는 것은 맞지만, 다른 리스닝 중인 서비스가 없다면 불필요합니다.

enter app 명령을 실행한 후 UFW나 iptables가 어떻게 동작하는지, 또는 방화벽이 그런 방식으로 사용할 수 있는지 잘 모르겠습니다.

이 주제에 대한 참고:

3개의 좋아요

저는 이 이야기를 꼭 듣고 싶습니다. 가능하다면 별도의 스레드에서 이야기해 주시면 좋겠습니다 :slight_smile:

참고로, Docker와 ufw / 방화벽의 관계에 대한 토론은 Docker 자체와 거의 같은 만큼 오래되었습니다. 여기 흥미로운 통찰을 많이 담은 꽤 유명한 토론이 있습니다.

Docker 자체도 최근 몇 년 동안 관련 세부 사항을 문서화하는 데 더 신경 쓰고 있습니다. Packet filtering and firewalls | Docker Docs

링크로 토픽을 너무 많이 오염시키고 싶지는 않지만, 방화벽이라는 주제에 관심이 있다면 위 링크들과 함께 일반적인 Google 검색을 통해 더 많은 세부 정보를 찾는 것이 매우 유용할 것입니다.

이러한 의견들과 @Jagster 님이 링크해 주신 매우 유용한 스레드를 바탕으로, Docker를 사용한 기본 Discourse 설치 구성이 자체적으로 충분할 수도 있다고 생각합니다. 결국 제 서버의 상태는 다음과 같습니다.

$ 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 관리자에게 번거로움을 초래하고 있으며, ufw에서 25번 포트가 열려 있더라도 ./launcher logs mail-receiver에서 API 준비가 실패하는 문제가 발생하고 있습니다.

모든 수신 및 송신 트래픽을 허용한 다음 원하는 포트를 거부하는 것이 해결책이었습니다.

아직 iptables에 대해 충분히 알지 못해 더 세밀하게 조정하지는 못했습니다.