#!/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