Mantém /phpmyadmin/ e rotas sensíveis bloqueadas para a internet inteira. Libera acesso apenas para o IP detectado via SSH, com Auto-Off automático. Zero dependências externas.
| porteiro-on [tempo] | Detecta o IP via $SSH_CLIENT (fallback: who am i). Injeta no
porteiro_ips.conf, valida com nginx -t e recarrega. Aceita
30, 30m, 2h. |
| porteiro-off | Limpa o arquivo de IPs e recarrega o Nginx. Fecha o acesso para todos os IPs imediatamente. |
| porteiro-status | Exibe estado atual, IPs ativos, rotas protegidas e últimas entradas do log. Notifica via Telegram se configurado. |
| porteiro-list | Lista todos os IPs autorizados no momento com data e hora de abertura. Lê direto do
porteiro_ips.conf e do log — sem banco de dados. |
| porteiro-revoke <IP> | Remove o acesso de um IP específico sem afetar os demais. Valida formato IPv4, escapa input
antes do sed, registra REVOGADO no log. |
| Auto-Off por IP | Timer individual por admin via at, com tag #porteiro-IP. O Auto-Off de
um admin não cancela o dos outros nem afeta jobs externos do servidor. |
| Multi-rota | Proteja /phpmyadmin/, /adminer/, /wp-admin/ ou qualquer
rota. Um arquivo porteiro_ips.conf compartilhado — um comando libera tudo. |
| Nginx validado | Roda nginx -t antes de qualquer reload. Se a config estiver quebrada,
aborta com mensagem clara — nunca derruba o servidor. |
| Log de auditoria | Cada evento registrado em /var/log/porteiro.log. Logrotate configurado
automaticamente — rotação mensal, retenção de 6 meses. |
| Telegram (opcional) | Notificação a cada on, off e status. Configure
TELEGRAM_TOKEN e TELEGRAM_CHAT_ID no porteiro.conf. Deixe
em branco para desativar. |
A variável $SSH_CLIENT expõe o IP da sessão automaticamente. Fallback para
who am i — funciona em tmux, screen e sudo su.
IP injetado em /etc/nginx/porteiro_ips.conf. Nginx validado com
nginx -t e recarregado. Multi-IP: cada admin tem sua própria entrada.
Todos os blocos location com include porteiro_ips.conf ficam acessíveis
para o IP autorizado. O resto do mundo recebe 403.
O at agenda porteiro-revoke <IP> com tag
#porteiro-IP. Timer individual por admin. Esqueceu? O Porteiro não esquece.
| Recurso | Sem Porteiro | Com Porteiro |
|---|---|---|
| /phpmyadmin/ exposto | ✗ Sempre | ✓ 403 |
| Força bruta | ✗ Possível | ✓ Bloqueado |
| Esqueceu a porta | ✗ Problema | ✓ Auto-Off |
| Multi-rota | ✗ Manual | ✓ Wizard |
| Revogação por IP | ✗ Não | ✓ porteiro-revoke |
| Log de auditoria | ✗ Não | ✓ Sim |
| Dependências | — | ✓ Zero |
"Código aberto.
Porta fechada."
Não — ele age na camada HTTP do Nginx; o firewall age na camada de rede. Os dois se complementam. Use ambos.
Sim. O porteiro-on sempre lê o IP atual da sessão SSH ativa. Cada execução adiciona
o novo IP sem remover os anteriores.
Não. Cada porteiro-on agenda um porteiro-revoke <IP> com tag
#porteiro-IP específica. Quando o timer expira, só aquele IP é revogado.
Não. Deixe TELEGRAM_TOKEN e TELEGRAM_CHAT_ID em branco no
porteiro.conf. As notificações são ignoradas silenciosamente.
O arquivo /etc/nginx/porteiro_ips.conf é compartilhado por todos os blocos
location. Um porteiro-on libera tudo; um porteiro-off
bloqueia tudo.
O Auto-Off fecha após o tempo configurado (padrão: 1 hora), mesmo que você feche o terminal.
Sim: sudo SSH_CLIENT='SEU_IP 0 0' porteiro-on. A variável $SSH_CLIENT
normalmente só existe em sessões SSH remotas.