------------ iptables.sh
#!/bin/bash
# Como existem diferenças nos paths de algumas distribuições,
# vamos deixar o script achar o executável:
IPT=`which iptables`
# Se o seu iptables estiver configurado como módulos no kernel, é
# necessário carregar alguns deles:
MODULOS="ip_tables nf_conntrack_ipv4 nf_conntrack"
for mod in ${MODULOS}; do
modprobe ${mod}
done
# Também precisamos acertar alguns detalhes com o kernel
# Habilita o roteamento entre as interfaces
sysctl -q -w net.ipv4.ip_forward=1
# Habilita o syncookies que ajuda a minimizar ataques de SYN Flood
sysctl -q -w net.ipv4.tcp_syncookies=1
# Limita o ICMP para o maximo de 100 requisicoes por minuto
sysctl -q -w net.ipv4.icmp_ratelimit=100
# Ignora ICMPs enviados para broadcast
sysctl -q -w net.ipv4.icmp_echo_ignore_broadcasts=1
# Nega redirecionamento de ICMP
sysctl -q -w net.ipv4.conf.all.accept_redirects=0
# Nao envia redirecionamento de pacotes ICMP
sysctl -q -w net.ipv4.conf.all.send_redirects=0
# Habilita filtro de "caminho de retorno" para evitar spoof
sysctl -q -w net.ipv4.conf.all.rp_filter=0
sysctl -q -w net.ipv4.conf.eth0.rp_filter=0
sysctl -q -w net.ipv4.conf.eth1.rp_filter=0
# Habilita log de pacotes desconhecidos/esquisitos
sysctl -q -w net.ipv4.conf.all.log_martians=0
# Definimos algumas variaveis para uso no script
IFEXT="eth0"
IFINT="eth1"
REDE_INTERNA="192.168.1.0/24"
FWINT="192.168.50.1"
# Se tiver IP Fixo
# FWEXT="200.x.y.z"
SRVMAIL="200.x.y.t"
# Pode ainda definir outras variaveis a seu gosto
# Tabela Filter
# Habilita trafego local
# Libera o acesso ao localhost de conexoes originadas no proprio firewall
${IPT} -A INPUT -i lo -j ACCEPT
${IPT} -A OUTPUT -o lo -j ACCEPT
${IPT} -A FORWARD -i lo -o lo -j ACCEPT
# Libera acesso SSH a partir da rede interna
${IPT} -A INPUT -i ${IFINT} -p tcp --dport 22 -s ${REDE_INTERNA} -j ACCEPT
# Libera acesso ao Squid
${IPT} -A INPUT -i ${IFINT} -p tcp --dport 3128 -s ${REDE_INTERNA} -j ACCEPT
# Libera o squid para navegar na Internet
${IPT} -A OUTPUT -p tcp -m multiport --dports 21,80,443 -j ACCEPT
# Libera consultas DNS em todas as direções
${IPT} -A INPUT -p tcp --dport 53 -j ACCEPT
${IPT} -A OUTPUT -p tcp --dport 53 -j ACCEPT
${IPT} -A FORWARD -p tcp --dport 53 -j ACCEPT
${IPT} -A INPUT -p udp --dport 53 -j ACCEPT
${IPT} -A OUTPUT -p udp --dport 53 -j ACCEPT
${IPT} -A FORWARD -p udp --dport 53 -j ACCEPT
# Libera acesso pop e smtp ao e-mail
${IPT} -A FORWARD -d ${SRVMAIL} -p tcp -m multiport --dports 25,110 -j ACCEPT
# Tabela NAT
# Cria regras para tratar spoof e SYNFlood
# Mantem as conexoes estabelecidas e faz controle do estado de novas conexoes
${IPT} -t nat -A PREROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT
${IPT} -t nat -A PREROUTING -m state --state INVALID -j LOG --log-prefix "FW INVALID: "
${IPT} -t nat -A PREROUTING -m state --state INVALID -j DROP
${IPT} -t nat -A PREROUTING -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "FW NEWNOTSYN: "
${IPT} -t nat -A PREROUTING -p tcp ! --syn -m state --state NEW -j DROP
${IPT} -t nat -A PREROUTING -p tcp --syn -m state --state ! NEW -j LOG --log-prefix "FW SYNNOTNEW: "
${IPT} -t nat -A PREROUTING -p tcp --syn -m state --state ! NEW -j DROP
# Redireciona acessos HTTP para o Squid
${IPT} -t nat -A PREROUTING -p tcp -m multiport --dports 80,443 -j DNAT --to ${FWINT}:3128
# Faz masquerade dos pacotes que vão sair do firewall
${IPT} -t nat -A POSTROUTING -o ${IFEXT} -j MASQUERADE
# Se tiver IP Fixo, pode usar o SNAT
# ${IPT} -t nat -A POSTROUTING -o ${IFEXT} -j SNAT --to ${FWEXT}