Я установил новый 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 не блокирует открытые порты докеров?
Заранее спасибо всем, кто может мне объяснить, что это такое.
Наверное ufw
показывает только конфигурацию ufw и любые правила, вставленные непосредственно в конфигурацию вашего брандмауэра (с iptables
или другой инструмент, такой как docker) без прохождения ufw НЕ отображаются.
25/tcp closed smtp
Почему это здесь?
Частой причиной является то, что многие (потребительские) интернет-провайдеры и организации блокируют исходящий SMTP-трафик.
81/tcp open hosts2-ns
Почему этот порт открыт?
Nmap прекратил сканирование не только порта 81, но и порта 1024, но я ожидаю, что, когда вы проверите дальше, порт 3307 также будет открыт.
Он открывается докером, поскольку вашему докеру предписано публиковать порты 81 и 3307 и сопоставлять их с вашими экземплярами докеров ...
$ 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
(большая часть интересных вещей с докерами происходит в разделах 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 для всего Интернета, так это изменить способ их публикации в докере. https://docs.docker.com/config/containers/container-networking/