
Configurei um novo VPS no DO e agora estou tentando proteger meu servidor usando o firewall UFW. Mas estou um pouco confuso.
Portanto, meu objetivo é permitir as únicas portas relacionadas a SSH e HTTP/HTTPS. O resto deveria ser fechado. O que eu fiz para conseguir:
# 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)
Como você pode ver, está tudo bem aqui: todo o tráfego de entrada é negado, exceto 22, 80, 443 portas, conforme esperado.
A propósito, eu uso Docker para meu aplicativo PHP Laravel. Para iniciar containers eu uso o comando: "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
Algumas portas estão disponíveis na máquina host: 3307, 81.
Para garantir que o firewall funcione corretamente, eu uso o 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
Aqui não consigo entender duas coisas:
25/tcp closed smtp
Por que isso está aqui?
81/tcp open hosts2-ns
Por que esta porta está aberta?
Provavelmente preciso entrar no contêiner da web e especificar explicitamente o endereço IP 127.0.0.1 na seção do servidor nginx. Até onde eu sei, o mysql por padrão é aberto apenas para localhost (my.conf), então como resultado não vemos a porta mysql na lista abaixo. Mas de qualquer forma, por que o UFW não bloqueia as portas expostas do docker?
Desde já agradeço a todos que puderem me explicar o que é isso.
Responder1
Provavelmente ufw
mostra apenas a configuração do ufw e quaisquer regras inseridas diretamente na configuração do seu firewall (com iptables
ou outra ferramenta como o docker) sem passar pelo ufw NÃO são exibidas.
25/tcp closed smtp
Por que isso está aqui?
Um motivo frequente é que muitos ISPs e organizações (consumidores) bloqueiam o tráfego SMTP de saída.
81/tcp open hosts2-ns
Por que esta porta está aberta?
Não apenas a porta 81 está aberta, o nmap parou de verificar na porta 1024, mas espero que, quando você verificar mais detalhadamente, a porta 3307 também esteja aberta.
Ele é aberto pelo docker, pois seu docker é instruído a publicar as portas 81 e 3307 e mapeá-las para suas instâncias do 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
Inspecione oconfiguração real do firewall ativosem a interface ufw amigável com, por exemplo, iptables-save
ou com iptables -L -v -n -t nat
(a maior parte das coisas interessantes do docker acontecem nas seções NAT e roteamento) e talveziptables -L -v -n
As entradas relevantes seriam algo como:
# 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
O que você provavelmente precisará fazer, se não quiser publicar as portas 81 e 3307 em toda a Internet, é alterar a forma como você as publica no docker. https://docs.docker.com/config/containers/container-networking/