first commit
This commit is contained in:
commit
01d7cb1a80
34 files changed
+5723
No files matched your search
Executable
+219
@@ -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
|
||||
Reference in new issue
Block a user