first commit

This commit is contained in:
Rodrigo Bertoldo de Sousa Martins committed 2026-09-13 20:49:33 -03:00
commit 01d7cb1a80
34 files changed
+5723

No files matched your search

+219
View File
@@ -0,0 +1,219 @@
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# rc.local — server-mv
# Reescrito para unificar o que antes estava dividido entre rc.local e
# test.sh (test.sh não é mais chamado a partir daqui — ver test.sh.old).
#
# Problemas do script antigo corrigidos aqui:
# - test.sh rodava "ip6tables -F" DEPOIS que este arquivo já tinha
# criado a regra de aceite de DHCPv6 (porta 546), apagando-a.
# - test.sh adicionava "ip6tables -A INPUT -j DROP" no meio do script,
# tornando toda regra de ICMPv6 adicionada depois dela morta (nunca
# era avaliada, pois o DROP já tinha batido antes).
# - DNAT de 80/443 estava duplicado (uma vez aqui, outra em test.sh,
# essa segunda sem porta de destino explícita).
# - Regra "-s 192.168.0.0/16 -j DROP" não estava restrita à interface
# WAN (enp0s6), então valeria para qualquer interface, inclusive
# futuras redes internas nesse range.
#
# Ordem importa em iptables: -A sempre anexa ao FIM da chain, então a
# ordem das linhas abaixo é a ordem de avaliação em tempo real.
set -e
# ==============================================================
# 1. FIREWALL — flush único, no início, de tudo (v4 e v6)
# ==============================================================
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
ip6tables -F
ip6tables -X
ip6tables -t nat -F
ip6tables -t nat -X
ip6tables -t mangle -F
ip6tables -t mangle -X
# Políticas padrão (definidas ANTES de qualquer regra ser criada)
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
ip6tables -P INPUT DROP
ip6tables -P FORWARD ACCEPT
ip6tables -P OUTPUT ACCEPT
# ==============================================================
# 2. IPv4 — chains auxiliares
# ==============================================================
iptables -N SYN_FLOOD
iptables -A SYN_FLOOD -m limit --limit 10/sec --limit-burst 24 -j RETURN
iptables -A SYN_FLOOD -j DROP
iptables -N BAD_PACKETS
iptables -A BAD_PACKETS -m recent --set --name BAD_IPS
iptables -A BAD_PACKETS -m recent --update --seconds 300 --hitcount 5 --name BAD_IPS -j DROP
iptables -N ICMPv4
iptables -A ICMPv4 -p icmp --icmp-type 0 -j ACCEPT
iptables -A ICMPv4 -p icmp --icmp-type 8 -m limit --limit 1/s --limit-burst 3 -j ACCEPT
iptables -A ICMPv4 -p icmp --icmp-type 8 -j DROP
iptables -A ICMPv4 -p icmp -j DROP
# ==============================================================
# 3. IPv4 — INPUT (ordem: mais barato/mais usado primeiro)
# ==============================================================
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# ICMP logo em seguida: medição real mostrou ~66k pacotes/dia, 2º maior
# volume do INPUT depois de established/related — não faz sentido deixar
# por último, obrigando todo ping a atravessar as demais regras primeiro.
iptables -A INPUT -p icmp -j ICMPv4
# Pacotes malformados / scan
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j BAD_PACKETS
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j BAD_PACKETS
iptables -A INPUT -f -j DROP
# Anti-spoof: só faz sentido na WAN (rede interna real é 10.15.0.0/16 e 10.99.1.0/24)
iptables -A INPUT -i enp0s6 -s 192.168.0.0/16 -j DROP
# SYN flood
iptables -A INPUT -p tcp --syn -j SYN_FLOOD
# Rate limit de conexões novas na porta de SSH (8117)
iptables -A INPUT -p tcp --dport 8117 -m conntrack --ctstate NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 8117 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 3 --name SSH -j DROP
# Túneis / VPN
iptables -A INPUT -i wg0 -j ACCEPT
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A INPUT -p udp --dport 1194 -j ACCEPT
# Serviços expostos na WAN
iptables -A INPUT -i enp0s6 -p tcp -m multiport --dports 80,443,8117 -j ACCEPT
iptables -A INPUT -i enp0s6 -p udp -m multiport --dports 32100,32101,32110,32400 -j ACCEPT
# ==============================================================
# 4. IPv4 — FORWARD
# ==============================================================
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A FORWARD -i wg0 -j ACCEPT
iptables -A FORWARD -p tcp -d 10.15.0.45 --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp -d 10.15.0.45 --dport 443 -j ACCEPT
# ==============================================================
# 5. IPv4 — NAT
# ==============================================================
iptables -t nat -A POSTROUTING -s 10.15.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wg3 -j MASQUERADE
# DNAT (WAN -> nginx reverso interno) — porta de destino explícita, sem duplicar
iptables -t nat -A PREROUTING -i enp0s6 -p tcp --dport 80 -j DNAT --to-destination 10.15.0.45:80
iptables -t nat -A PREROUTING -i enp0s6 -p tcp --dport 443 -j DNAT --to-destination 10.15.0.45:443
# Hairpin NAT para clientes locais acessando o IP público
iptables -t nat -A POSTROUTING -o enp0s6 -p tcp -d 10.15.0.45 --dport 80 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp0s6 -p tcp -d 10.15.0.45 --dport 443 -j MASQUERADE
# ==============================================================
# 6. IPv6 — chains auxiliares
# ==============================================================
ip6tables -N SYN_FLOOD
ip6tables -A SYN_FLOOD -m limit --limit 10/sec --limit-burst 24 -j RETURN
ip6tables -A SYN_FLOOD -j DROP
ip6tables -N BAD_PACKETS
ip6tables -A BAD_PACKETS -m recent --set --name BAD_IPS6
ip6tables -A BAD_PACKETS -m recent --update --seconds 300 --hitcount 5 --name BAD_IPS6 -j DROP
ip6tables -N ICMPv6
ip6tables -A ICMPv6 -p ipv6-icmp --icmpv6-type 1 -j ACCEPT
ip6tables -A ICMPv6 -p ipv6-icmp --icmpv6-type 2 -m limit --limit 5/min -j ACCEPT
ip6tables -A ICMPv6 -p ipv6-icmp --icmpv6-type 3 -m limit --limit 5/min -j ACCEPT
ip6tables -A ICMPv6 -p ipv6-icmp --icmpv6-type 128 -m limit --limit 1/s --limit-burst 3 -j ACCEPT
ip6tables -A ICMPv6 -p ipv6-icmp --icmpv6-type 129 -j ACCEPT
ip6tables -A ICMPv6 -p ipv6-icmp --icmpv6-type 133 -j ACCEPT
ip6tables -A ICMPv6 -p ipv6-icmp --icmpv6-type 135 -j ACCEPT
ip6tables -A ICMPv6 -p ipv6-icmp --icmpv6-type 136 -j ACCEPT
ip6tables -A ICMPv6 -p ipv6-icmp -j DROP
# ==============================================================
# 7. IPv6 — INPUT
# (NOTA: nenhuma regra "-j DROP" solta aqui — a policy INPUT DROP,
# já definida no passo 1, é o catch-all. Colocar um DROP explícito
# no meio da chain era o bug que matava as regras seguintes.)
# ==============================================================
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -p udp --dport 546 -j ACCEPT # DHCPv6 client
ip6tables -A INPUT -p tcp --tcp-flags ALL ALL -j BAD_PACKETS
ip6tables -A INPUT -p tcp --tcp-flags ALL NONE -j BAD_PACKETS
# Anti-spoof
ip6tables -A INPUT -i enp0s6 -s fe80::/10 -j DROP
ip6tables -A INPUT -i enp0s6 -s fd00::/8 -j DROP
ip6tables -A INPUT -d ff00::/8 -j DROP
ip6tables -A INPUT -p tcp --syn -j SYN_FLOOD
ip6tables -A INPUT -p ipv6-icmp -j ICMPv6
# Rate limit SSH (8117)
ip6tables -A INPUT -p tcp --dport 8117 -m conntrack --ctstate NEW -m recent --set --name SSH6
ip6tables -A INPUT -p tcp --dport 8117 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 3 --name SSH6 -j DROP
ip6tables -A INPUT -i wg0 -j ACCEPT
ip6tables -A INPUT -i enp0s6 -p tcp -m multiport --dports 80,443,8117 -j ACCEPT
ip6tables -A INPUT -i enp0s6 -p udp -m multiport --dports 32100,32400 -j ACCEPT
# ==============================================================
# 8. IPv6 — FORWARD / NAT
# ==============================================================
ip6tables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
ip6tables -A FORWARD -i wg0 -j ACCEPT
ip6tables -A FORWARD -p tcp -d 2001:db8:15::45 --dport 80 -j ACCEPT
ip6tables -A FORWARD -p tcp -d 2001:db8:15::45 --dport 443 -j ACCEPT
ip6tables -t nat -A POSTROUTING -s 2001:db8:15::/48 -j MASQUERADE
ip6tables -t nat -A PREROUTING -i enp0s6 -p tcp --dport 80 -j DNAT --to-destination [2001:db8:15::45]:80
ip6tables -t nat -A PREROUTING -i enp0s6 -p tcp --dport 443 -j DNAT --to-destination [2001:db8:15::45]:443
ip6tables -t nat -A POSTROUTING -o enp0s6 -p tcp -d 2001:db8:15::45 --dport 80 -j MASQUERADE
ip6tables -t nat -A POSTROUTING -o enp0s6 -p tcp -d 2001:db8:15::45 --dport 443 -j MASQUERADE
# ==============================================================
# 9. Ajustes de kernel dependentes de runtime (não cobertos por sysctl.conf)
# ==============================================================
echo deadline > /sys/block/sda/queue/scheduler
echo 64 > /sys/block/sda/queue/max_sectors_kb # melhor para SSD virtual
echo f > /sys/class/net/enp0s6/queues/tx-0/xps_cpus
echo f > /sys/class/net/enp0s6/queues/rx-0/rps_cpus
echo 4096 > /sys/class/net/enp0s6/queues/rx-0/rps_flow_cnt
#tc qdisc add dev enp0s6 root cake bandwidth 1000mbit besteffort
#tc qdisc add dev wg0 root cake bandwidth 500mbit besteffort dual-dsthost
touch /var/lock/subsys/local
# ==============================================================
# 10. XDP / eBPF
# ==============================================================
ip link set enp0s6 mtu 1500
ip link set dev enp0s6 xdp obj /home/rodrigo/xdp/xdp_ddos_filter.o sec xdp
ip link set dev wg0 xdp obj /home/rodrigo/xdp/xdp_wg_mtu_optimizer.o sec xdp
# A bridge do Docker muda de nome a cada recriação da rede (hash do ID),
# então esse link precisa ser reaplicado se a rede "dockernet" for recriada.
ip link set dev br-02f7820020b4 xdp obj /home/rodrigo/xdp/bridge_xdp.o sec xdp
cd /home/docker/ebpf-sockmap/ && make load