A Kubernetes NetworkPolicy no Node.js controla quais conexões de entrada e saída são permitidas para os Pods da aplicação. Em vez de aceitar tráfego de qualquer workload do cluster, a equipe pode autorizar somente o gateway, o banco, o Redis, o DNS e serviços externos realmente necessários.
NetworkPolicy atua nas camadas 3 e 4, usando IPs, portas, Pods e namespaces. Ela não substitui autenticação, TLS ou autorização de negócio. Também depende de um plugin de rede compatível; criar o recurso em um cluster sem enforcement não altera o tráfego.
Neste guia, você aprenderá default deny, ingress, egress, selectors, DNS, banco, gateways, CIDRs, testes, rollout seguro e limitações importantes.
Pré-requisito: plugin compatível
A documentação oficial de Network Policies no Kubernetes afirma que a implementação é responsabilidade do plugin de rede. Calico, Cilium, Antrea e outras soluções podem aplicar o recurso, com extensões próprias.
Confirme o CNI instalado e execute um teste real. Um manifesto aceito pela API não prova enforcement.
Comportamento padrão
Quando nenhum NetworkPolicy seleciona um Pod, todo ingress e egress é permitido. A primeira policy que isola uma direção muda esse comportamento: somente regras permitidas por alguma policy aplicável continuam abertas.
Ingress e egress são independentes. Um Pod pode estar isolado para entrada, mas continuar com saída irrestrita.
Policies são aditivas
NetworkPolicies não têm ordem de prioridade. As permissões de todas as policies aplicáveis são combinadas. Uma policy não consegue negar uma conexão que outra policy permite.
Para uma conexão entre dois Pods ocorrer, o egress da origem e o ingress do destino precisam permitir.
Labels da aplicação
Um Deployment Node.js deve usar labels estáveis:
metadata:
labels:
app.kubernetes.io/name: orders-api
app.kubernetes.io/instance: production
app.kubernetes.io/component: apiNão use versão da imagem no selector da policy, pois o rollout criaria Pods que não correspondem.
Consulte Kubernetes Deployment no Node.js.
Default deny ingress
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
namespace: production
spec:
podSelector: {}
policyTypes:
- IngressEssa policy seleciona todos os Pods do namespace e não fornece regra de entrada. Todo ingress passa a ser bloqueado, salvo o permitido por outras policies.
Default deny egress
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-egress
namespace: production
spec:
podSelector: {}
policyTypes:
- EgressDepois de aplicar, Pods não conseguem resolver DNS, acessar banco ou chamar APIs externas até existirem permissões explícitas.
Default deny completo
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
- EgressImplemente primeiro em homologação. Aplicar diretamente em produção sem mapear dependências pode derrubar toda a aplicação.
Permitindo o gateway
Suponha que o Gateway Controller esteja no namespace gateway-system:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-gateway-to-orders-api
namespace: production
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: orders-api
app.kubernetes.io/component: api
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: gateway-system
podSelector:
matchLabels:
app.kubernetes.io/name: gateway-controller
ports:
- protocol: TCP
port: 3000Um único item com namespaceSelector e podSelector exige que os dois correspondam.
Cuidado com a indentação
Este YAML possui significado diferente:
from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: gateway-system
- podSelector:
matchLabels:
app.kubernetes.io/name: gateway-controllerEle permite qualquer Pod do namespace selecionado ou qualquer Pod com a label no namespace local. Use kubectl describe networkpolicy para revisar a interpretação.
Gateway API
NetworkPolicy controla tráfego entre o gateway e o Service, enquanto HTTPRoute define hosts e paths. Veja Kubernetes Gateway API no Node.js.
Permitindo DNS
Depois de default deny egress, a API pode perder resolução de nomes. Autorize CoreDNS:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-orders-api-dns
namespace: production
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: orders-api
policyTypes:
- Egress
egress:
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- protocol: UDP
port: 53
- protocol: TCP
port: 53Labels do DNS variam entre clusters. Confirme:
kubectl get pods -n kube-system --show-labelsNodeLocal DNSCache
Quando o cluster usa NodeLocal DNSCache, a consulta pode ir a um endereço local ou hostNetwork, e selectors de Pod podem não representar o caminho. Consulte a implementação e teste a policy.
Permitindo PostgreSQL no cluster
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-orders-api-postgres
namespace: production
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: orders-api
policyTypes:
- Egress
egress:
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: databases
podSelector:
matchLabels:
app.kubernetes.io/name: postgres
ports:
- protocol: TCP
port: 5432Crie também uma ingress policy no namespace do PostgreSQL selecionando os Pods do banco e permitindo a origem.
Permitindo PgBouncer
Quando a aplicação usa PgBouncer, autorize apenas a porta do pooler, normalmente 6432, e bloqueie acesso direto ao banco para o usuário da API.
Consulte PgBouncer no Node.js.
Permitindo Redis
egress:
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: cache
podSelector:
matchLabels:
app.kubernetes.io/name: redis
ports:
- protocol: TCP
port: 6379NetworkPolicy não autentica Redis. Continue usando ACL, TLS e credenciais de privilégio mínimo.
APIs externas com ipBlock
egress:
- to:
- ipBlock:
cidr: 203.0.113.0/24
ports:
- protocol: TCP
port: 443IPs de provedores SaaS podem mudar. NetworkPolicy padrão não seleciona FQDN. Fixar CIDRs sem processo de atualização causa indisponibilidade ou regras amplas demais.
FQDN policies
Alguns CNIs oferecem policies por DNS ou FQDN como extensão. Isso não faz parte do NetworkPolicy core. Documente a dependência do fornecedor e teste cache, TTL e resolução.
Service IP e NAT
O comportamento de ipBlock com ClusterIP, LoadBalancer e NAT pode variar porque a tradução de endereço pode ocorrer antes ou depois do enforcement. Prefira selectors de Pod e namespace para serviços internos.
Permitir saída HTTPS geral
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0
ports:
- protocol: TCP
port: 443Isso limita a porta, mas permite qualquer destino IPv4. É uma melhoria pequena em relação a egress totalmente aberto, porém não impede exfiltração para um servidor HTTPS do atacante.
Proxy de egress
Uma estratégia mais controlada permite saída apenas para um proxy, gateway ou serviço de egress. O proxy aplica hostname allowlist, logs, TLS e políticas adicionais.
IPv6
Em clusters dual-stack, uma policy para 0.0.0.0/0 não cobre IPv6. Adicione regras para ::/0 quando necessário e considere o impacto.
Portas nomeadas
ports:
- protocol: TCP
port: httpO suporte e a resolução de porta nomeada dependem do contexto. Portas numéricas são mais explícitas para policies compartilhadas.
Faixa de portas
ports:
- protocol: TCP
port: 3000
endPort: 3010endPort depende de suporte do plugin. Confirme antes de usar.
health checks do load balancer
Um load balancer pode enviar probes a partir de IPs ou nodes, não dos Pods do gateway. Depois de aplicar default deny, verifique se health checks continuam funcionando.
hostNetwork
Pods com hostNetwork: true possuem comportamento dependente do plugin. Algumas soluções tratam tráfego como node traffic, que pode não ser filtrado como Pod comum.
Tráfego do node
A especificação permite tráfego entre o Pod e o node onde ele está executando. NetworkPolicy não é uma barreira completa contra comprometimento do node.
NetworkPolicy não controla tudo
O recurso core não oferece de forma portátil:
- regras por domínio DNS;
- bloqueio explícito com prioridade;
- logging padronizado;
- inspeção HTTP por path;
- TLS identity;
- controle do tráfego entre containers do mesmo Pod;
- todos os casos de hostNetwork;
- service mesh authorization.
Autenticação continua necessária
Uma conexão autorizada pela rede não deve receber confiança automática. O backend continua validando JWT, sessão, tenant, RBAC ou ReBAC.
TLS e mTLS
NetworkPolicy limita quem pode tentar conectar. TLS protege conteúdo e autentica endpoints. Para comunicação sensível, use os dois.
Veja mTLS no Node.js.
Namespace labels
Use a label imutável fornecida pelo Kubernetes:
kubernetes.io/metadata.name: productionLabels customizadas podem ser alteradas por usuários com permissão no Namespace. Restrinja RBAC para evitar que alguém se inclua em uma policy.
Multi-tenancy
NetworkPolicy ajuda a isolar namespaces, mas não é a única barreira. Use RBAC, quotas, Pod Security, secrets separados e isolamento de dados.
Consulte Multi-Tenancy no Node.js.
Estratégia de rollout
Uma abordagem segura:
- inventarie conexões da aplicação;
- habilite observabilidade do CNI;
- crie allow policies explícitas;
- teste em homologação;
- aplique default deny ingress;
- valide tráfego;
- aplique default deny egress;
- monitore drops e erros;
- tenha rollback pronto.
Não aplique deny primeiro
Se default deny entra antes das permissões, o rollout pode interromper DNS, banco, métricas e readiness. Em GitOps, envie allow policies e deny na mesma mudança quando o controller aplica de forma previsível, ou faça em etapas controladas.
Testando ingress
De um Pod autorizado:
kubectl run allowed-client \
--rm -it \
--image=curlimages/curl:8.12.1 \
-n gateway-system \
--labels=app.kubernetes.io/name=gateway-controller \
-- curl -f http://orders-api.production.svc.cluster.local/health/liveRepita de um namespace e Pod não autorizados; a conexão deve falhar.
Testando egress
kubectl exec -n production deploy/orders-api -- \
node -e "fetch('https://example.com').then(r=>console.log(r.status)).catch(console.error)"Teste DNS, banco, Redis e cada serviço externo permitido.
Debug com Pod temporário
Um Pod de debug precisa das mesmas labels e namespace do workload para sofrer as mesmas policies. Caso contrário, o resultado não representa a aplicação.
Conexões existentes
O efeito em conexões já estabelecidas pode variar conforme o plugin. Depois de alterar policies, teste novas conexões e, se necessário, recicle Pods.
Observabilidade do CNI
Dependendo do plugin, monitore:
- flows permitidos e negados;
- source e destination labels;
- porta e protocolo;
- DNS queries;
- drops por policy;
- latência de dataplane;
- policies sem endpoints.
Controle cardinalidade e retenção, pois flows podem gerar alto volume.
Sintomas no Node.js
Uma policy bloqueando tráfego aparece como:
ETIMEDOUT;ECONNREFUSEDem alguns caminhos;- falha de DNS;
- pool PostgreSQL esgotado;
- readiness falhando;
- retries crescentes;
- fila acumulando.
Não aumente timeouts antes de verificar o dataplane.
Readiness e dependências
Se a policy bloqueia uma dependência obrigatória, readiness pode remover todos os Pods do Service. Mantenha uma rota de diagnóstico e monitore eventos.
Helm
Um chart pode expor:
networkPolicy:
enabled: true
ingress:
gatewayNamespace: gateway-system
egress:
dns: true
postgresNamespace: databasesMantenha defaults seguros e valide o YAML renderizado. Consulte Helm para Node.js.
Kustomize
Use uma base com policies comuns e overlays para CIDRs ou namespaces específicos. Não duplique toda a política por ambiente.
CI e validação
Renderize e valide:
kubectl kustomize k8s/overlays/production \
| kubeconform -strict -summaryAdicione policy-as-code para exigir default deny e proibir 0.0.0.0/0 sem exceção aprovada.
Erros comuns
- CNI sem suporte: o recurso não faz nada.
- Default deny sem DNS: todos os hostnames deixam de resolver.
- Selectors com OR acidental: origens extras são autorizadas.
- Label de versão: novos Pods não correspondem.
- ipBlock para Service interno: NAT produz comportamento inesperado.
- Egress HTTPS global: exfiltração continua possível.
- Confiar só na rede: um Pod autorizado acessa dados sem autenticação.
- Sem testes negativos: a equipe confirma apenas o tráfego permitido.
Conclusão
A Kubernetes NetworkPolicy no Node.js reduz a superfície de rede ao permitir somente fluxos necessários. Default deny, selectors de Pod e namespace e regras por porta criam segmentação entre gateway, aplicação, banco e cache.
Confirme o suporte do CNI, permita DNS e dependências antes de isolar e teste conexões autorizadas e negadas. Combine policies com TLS, identidade e autorização da aplicação. Assim, um Pod comprometido encontra menos caminhos para movimentação lateral e exfiltração.




