Как правильно защитить VPS с помощью брандмауэра UFW?

Как правильно защитить VPS с помощью брандмауэра UFW?

Я настроил новый VPS на DO и теперь пытаюсь защитить свой сервер с помощью брандмауэра UFW. Но я немного запутался.

Итак, моя цель — разрешить только порты SSH, HTTP/HTTPS. Остальные должны быть закрыты. Что я сделал, чтобы это сделать:

# ufw allow ssh
# ufw allow http
# ufw allow https

# ufw enable

$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

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

Как видите, здесь все в порядке: весь входящий трафик запрещен, за исключением портов 22, 80, 443, как и ожидалось.

Кстати, я использую Docker для своего PHP Laravel-приложения. Для запуска контейнеров я использую команду: "docker-compose up -d".

$ docker-compose ps
  Name                Command              State                 Ports
------------------------------------------------------------------------------------
app        docker-php-entrypoint php-fpm   Up      9000/tcp
database   docker-entrypoint.sh mysqld     Up      0.0.0.0:3307->3306/tcp, 33060/tcp
web        nginx -g daemon off;            Up      0.0.0.0:81->80/tcp

На хост-машине доступны несколько портов: 3307, 81.

Чтобы убедиться, что брандмауэр работает правильно, я использую nmap:

$ nmap -Pn [server ip]
Starting Nmap 7.70 ( https://nmap.org ) at 2018-09-13 12:17 EEST
Nmap scan report for [server host] ([server ip])
Host is up (0.054s latency).
Not shown: 995 filtered ports
PORT    STATE  SERVICE
22/tcp  open   ssh
25/tcp  closed smtp
80/tcp  open   http
81/tcp  open   hosts2-ns
443/tcp closed https

Nmap done: 1 IP address (1 host up) scanned in 5.59 seconds

Здесь я не могу понять две вещи:

25/tcp  closed smtp

Почему это здесь?

81/tcp  open   hosts2-ns

Почему этот порт открыт?

Вероятно, мне нужно войти в веб-контейнер и явно указать ip-адрес 127.0.0.1 в разделе сервера nginx. Насколько мне известно, mysql по умолчанию открыт только для localhost (my.conf), поэтому в списке ниже мы не видим порт mysql. Но в любом случае, почему UFW не блокирует открытые порты docker?

Заранее спасибо всем, кто сможет мне объяснить, что это такое.

решение1

Вероятно ufw показывает только конфигурацию UFW, и любые правила, вставленные непосредственно в конфигурацию брандмауэра (с помощью iptablesили другого инструмента, такого как Docker) без прохождения через UFW, НЕ отображаются.

25/tcp  closed smtp

Почему это здесь?

Частой причиной является то, что многие (потребительские) интернет-провайдеры и организации блокируют исходящий SMTP-трафик.

81/tcp  open   hosts2-ns

Почему этот порт открыт?

Не только порт 81 открыт, nmap прекратил сканирование на порту 1024, но я ожидаю, что при дальнейшей проверке порт 3307 также будет открыт.

Он открывается Docker, поскольку Docker получил указание опубликовать порты 81 и 3307 и сопоставить их с вашими экземплярами Docker...

$ docker-compose ps
  Name                Command              State                 Ports
------------------------------------------------------------------------------------
app        docker-php-entrypoint php-fpm   Up      9000/tcp
database   docker-entrypoint.sh mysqld     Up      0.0.0.0:3307->3306/tcp, 33060/tcp
web        nginx -g daemon off;            Up      0.0.0.0:81->80/tcp

Осмотритефактическая активная конфигурация брандмауэрабез удобного интерфейса UFW, например iptables-save , или с iptables -L -v -n -t nat(большая часть интересных вещей Docker происходит в разделах NAT и маршрутизации) и, возможно,iptables -L -v -n

Соответствующие записи будут примерно такими:

# Generated by iptables-save v1.6.0 on Thu Sep 13 13:50:12 2018
*nat
:PREROUTING ACCEPT [21796:1434198]
:INPUT ACCEPT [9101:666864]
:OUTPUT ACCEPT [20943:1960461]
:POSTROUTING ACCEPT [118496:7063513]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER

-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 3307 -j DNAT --to-destination 172.17.0.3:33060
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 81   -j DNAT --to-destination 172.17.0.8:80

Если вы не хотите публиковать порты 81 и 3307 для всего Интернета, вам, вероятно, нужно изменить способ их публикации в Docker. https://docs.docker.com/config/containers/container-networking/

Связанный контент