# Nesta parte denominamos variáveis para as interfaces como segue. # Denominamos que o nome LAN seja referente à Interface ETH0 que no nosso # script é a da rede interna. Verifique no seu Firewall qual é a interface # correta. IF_LAN='eth0' # Aqui denominamos as variáveis dos LINKS 1 e 2, e os chamamos de LINK1 e LINK2 # É claro que você poderá chamá-los do que quiser. Exemplo: ADSL1 e ADSL2, # mas não esqueça de alterar as variáveis no restante do script. IF_LINK1='eth1' IF_LINK2='eth2' # Aqui colocamos os Gateways dos Links de Internet. # Geralmente, os Default Gateways dos Links são os IP´S dos roteadores de # Internet. GW_LINK1='IP1' GW_LINK2='IP2' # Nesta parte, utilizamos o comando IPTABLES para mascarar os IPs, ou seja, # fazemos um NAT (Network Address Translation) para que os pacotes que venham da # Interface ETH0 com IPs da rede interna, ou mesmo pacotes gerados dentro do # próprio Firewall, possam sair para a Internet com endereços trocados, usando # os IPs das interfaces ligadas aos Links de Internet. # O MASQUERADE ao final do comando faz exatamente isto. # Caso contrário, utilizaria ACCEPT, mas aí os pacotes sairiam para a Internet # com IPs da rede interna e jamais retornariam ao Firewall. iptables -t nat -A POSTROUTING -o $IF_LINK1 -j MASQUERADE iptables -t nat -A POSTROUTING -o $IF_LINK2 -j MASQUERADE # Aqui começamos a marcar os pacotes diferenciando-os pela porta utilizada. # Observe que escolhemos os pacotes com destino às portas 80 (HTTP) 443 (HTTPS) # 25 (SMTP) 110 (POP) # Todo pacote que passar pelo Firewall com estas particularidades receberão # uma "marca", uma espécie de carimbo. Pacotes destinados à porta 80 # recebem "carimbo" de número 2, pacotes com destino à porta 25 # recebem "carimbo" número 3. # Desta forma, podemos diferenciá-los para que mais à frente no script tenhamos # controle do que saiu/entrou e por onde saiu/entrou. iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 22 -j MARK --set-mark 2 iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 80 -j MARK --set-mark 2 iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 443 -j MARK --set-mark 2 iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 25 -j MARK --set-mark 3 iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 110 -j MARK --set-mark 3 # A diferença entre o PREROUTING e o OUTPUT é que, PREROUTING abrange os # pacotes que foram originados fora do FIREWALL, por exemplo Interface ETH0 # ($IF_LAN), enquanto OUTPUT são os pacotes originados no Firewall, ou seja, na # própria console. iptables -t mangle -A OUTPUT -p tcp --dport 22 -j MARK --set-mark 2 iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 2 iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 2 iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 3 iptables -t mangle -A OUTPUT -p tcp --dport 110 -j MARK --set-mark 3 # Aqui montamos as tabelas dinâmicas a partir das marcas (carimbos) que fizemos # lá em cima no nosso script. # Pacotes que foram marcados com 2 vão para a tabela "table 20" e os marcados # com 3, vão para a tabela "table 21", com a mesma prioridade. Perceba o PRIO 20 # após os comandos. ip rule add fwmark 2 table 20 prio 20 ip rule add fwmark 3 table 21 prio 20 # se quisermos condicionar esta marcação de outra forma, podemos utilizar o # comando das seguintes formas: # Este condiciona que todos os pacotes que vierem da rede 192.160.0.0 vão para # a tabela 20. # O comando está comentado. Caso queira utilizá-lo, apenas retire o sinal de "#" # da frente. # ip rule add from 192.160.0.0/24 table 20 # Este outro condiciona os pacotes da rede 192.170.0.0 a irem para a tabela 21 # O comando está comentado. Caso queira utilizá-lo, apenas retire o sinal de # "#" da frente do comando. # ip rule add from 192.170.0.0/24 table 21 # Agora sim daremos rumo aos pacotes que foram marcados e cadastrados na tabela # dinâmica. # Veja que os pacotes que foram enviados para a tabela 20 têm como DEFAULT # GATEWAY o LINK1. Sendo assim, os pacotes serão enviados para o LINK1 na # Interface ETH1 com o IP 200.70.0.1. # Já os pacotes da tabela 21 serão enviados para o LINK2 na Interface ETH1, com # o IP 200.80.0.1 ip route add default via $GW_LINK1 dev $IF_LINK1 table 20 ip route add default via $GW_LINK2 dev $IF_LINK2 table 21 # Este último comando limpa a tabela, caso ela já tenha sido utilizada # anteriormente, ou apenas para termos certeza de que quando você resetar as # regras todas, o Firewall não guarde nenhum tipo de informação na # memória (cache). Daí o nome FLUSH CACHE. ip route flush cache