Controlando 2 links de internet (roteados) em um gateway Linux com SQUID


Há algum tempo atrás um amigo meu precisou ativar 2 links dedicados e de fornecedores diferentes. Quando o segundo link foi ativado, começou a dor de cabeça. Não é simplesmente colocar o ip da nova operadora e ponto. Deve-se fazer muitas configurações para que isso funcione. E através de pesquisas consegui colocar essa solução para funcionar perfeitamente, veja aqui como ficou e espero que lhe ajude!

Introdução

Este artigo tem por finalidade, mostrar como se deve configurar o iproute, iptables e SQUID para que os mesmos funcionem de forma correta com 2 links de internet roteados (dedicados ou não).

Para que o mesmo funcione corretamente você deve ter instalados os seguintes pacotes:

  • iproute2
  • iptables
  • squid

Na elaboração deste tutorial foi utilizada a distribuição CentoOS 5.

Configurando as Interfaces

Para esta solução nosso servidor deve ter no mínimo 3 (três) interfaces de rede, as quais serão organizadas da seguinte forma:

  • eth0 – link1 com ip 100.100.100.2 e gateway (roteador) 100.100.100.1
  • eth1 – link2 com ip 200.200.200.2 e gateway (roteador) 200.200.200.2001
  • eth2 – rede local com ip 192.168.0.254

No CentOS, os arquivos de configuração das interfaces são respectivamente:

  • eth0 – /etc/sysconfig/network-scripts/ifcfg-eth0
  • eth1 – /etc/sysconfig/network-scripts/ifcfg-eth1
  • eth2 – /etc/sysconfig/network-scripts/ifcfg-eth2

Vamos abrir (criar) um por um com o seu editor de textos predileto, eu particularmente prefiro o “vi”.

# vi /etc/sysconfig/network-scripts/ifcfg-eth0

# Esse será o conteúdo do arquivo ifcfg-eth0
# para a interface ser carregada no BOOT do sistema
ONBOOT=yes
# descrição da interface no sistema
DEVICE=eth0
# rede da interface
NETWORK=100.100.100.0
# máscara da rede
NETMASK=255.255.255.252
# endereço ip da interface
IPADDR=100.100.100.2
# broadcast da rede
BROADCAST=100.100.100.3
# endereço mac da interface
# muito bom, para evitar que em um novo boot
# as interfaces fiquem mudando de posição
HWADDR=00:01:02:03:04:05

# vi /etc/sysconfig/network-scripts/ifcfg-eth1

# Esse será o conteúdo do arquivo ifcfg-eth1
# para a interface ser carregada no BOOT do sistema
ONBOOT=yes
# descrição da interface no sistema
DEVICE=eth1
# rede da interface
NETWORK=200.200.200.0
# máscara da rede
NETMASK=255.255.255.252
# endereço ip da interface
IPADDR=200.200.200.2
# broadcast da rede
BROADCAST=200.200.200.3
# endereço mac da interface
# muito bom, para evitar que em um novo boot
# as interfaces fiquem mudando de posição
HWADDR=01:02:03:04:05:06

# vi /etc/sysconfig/network-scripts/ifcfg-eth2

# Esse será o conteúdo do arquivo ifcfg-eth2
# para a interface ser carregada no BOOT do sistema
ONBOOT=yes
# descrição da interface no sistema
DEVICE=eth2
# rede da interface
NETWORK=192.168.0.0
# máscara da rede
NETMASK=255.255.255.0
# endereço ip da interface
IPADDR=192.168.0.254
# broadcast da rede
BROADCAST=192.168.0.255
# endereço mac da interface
# muito bom, para evitar que em um novo boot
# as interfaces fiquem mudando de posição
HWADDR=02:03:04:05:06:07

Pronto, as interfaces já estão configuradas.

Fazendo alguns ajustes antes do iproute2

Para evitar conflitos de configuração, como vamos passar a utilizar o iproute2 para controlar as rotas, devemos fazer as seguintes alterações:

Rota padrão

Quando não utilizamos o iproute2 para controlar a rota, nossa configuração de rota padrão fica gravada no arquivo /etc/sysconfig/network. Vamos editá-lo:

# vi /etc/sysconfig/network

# em rede
NETWORKING=yes
# em rede IPv6
NETWORKING_IPV6=no
# hostname do Linux
HOSTNAME=srv.localhost
# gateway da rede
# isto aqui vamos tirar, pois o gateway agora será controlado pelo iproute
GATEWAY=100.100.100.1

:wq (para gravar e sair do vi)

Nosso arquivo /etc/sysconfig/network ficará assim:

NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=srv.localhost

rp_filter

Deve-se desativar também o rp_filter, senão o kernel do Linux pensa que há uma tentativa de “ip-spoofing” e bloqueia o tráfego.

if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 0 > $f
done
fi

Obs: Vamos adicionar isto em um script no final do artigo.

O ip_forward e ip_dynaddr

O ip_forward e o ip_dynaddr devem ser ativados, pois sem eles os pacotes não serão repassados através do firewall.

echo 1 > /proc/sys/net/ipv4/ip_dynaddr
echo 1 > /proc/sys/net/ipv4/ip_forward

Obs: Vamos adicionar isto em um script no final do artigo.

O iproute2 (coração do assunto)

O iproute2 é o pacote responsável pelo controle de rotas dentro de um firewall/gateway Linux.

Na união do iproute, iptables e marcação de pacotes (eu acho marcação uma gambiarra), podemos fazer “n” coisas imagináveis com esse conjunto de ferramentas.

Como o escopo desse artigo é o roteamento estático, de links roteados (não funciona com modem em bridge) sem balanceamento de carga (precisa-se de marcações de pacotes), vamos ao que interessa.

Obs.: Todas as variáveis aqui apresentadas serão adicionadas no final do artigo em um script único para uma melhor aplicação dos ensinamentos.

As variáveis de roteamento

## link1
link1_iface=eth0 # interface do seu link1
link1_rede=100.100.100.0/30 # aqui você coloca sua rede, com máscara
link1_gw=100.100.100.1 # o gateway do seu link1
link1_ip_local=100.100.100.2 # o ip do seu server do link1 

## link2
link2_iface=eth1 # interface do seu link2
link2_rede=200.200.200.0/30 # aqui você coloca sua rede, com máscara
link2_gw=200.200.200.1 # o gateway do seu link2
link2_ip_local=200.200.200.2 # o ip do seu server do link2

## rede local
lan_iface=eth2
lan_rede=192.168.0.0/24 # aqui você coloca sua rede com máscara
lan_gw=192.168.0.254 # aqui coloca o gw da rede local

Configurações das tabelas de rotas do iproute2

### resetar tabelas de rotas
echo “255 local” > /etc/iproute2/rt_tables
echo “254 main” >> /etc/iproute2/rt_tables
echo “253 default” >> /etc/iproute2/rt_tables
echo “0 unspec” >> /etc/iproute2/rt_tables
echo “30 link1” >> /etc/iproute2/rt_tables
echo “30 link2” >> /etc/iproute2/rt_tables

Arquivo com ips dos clientes

Você deverá adicionar no arquivo /etc/ips.link1 os ips dos clientes que devem sair pelo link1 e no arquivo /etc/ips.link2 os ips dos clientes que devem sair pelo link2.

# vi /etc/ips.link1

192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.4
192.168.0.5

# vi /etc/ips.link2

192.168.0.6
192.168.0.7
192.168.0.8
192.168.0.9
192.168.0.10

Configurações do iproute2 (o coração)

### remover rotas padrão – se houver
ip route del default &> /dev/null
ip route del default &> /dev/null
ip route del default &> /dev/null 

### remover tabelas
ip rule del lookup link1 &> /dev/null
ip rule del lookup link1 &> /dev/null
ip rule del lookup link1 &> /dev/null
ip rule del lookup link2 &> /dev/null
ip rule del lookup link2 &> /dev/null
ip rule del lookup link2 &> /dev/null

### adicionar rotas nas tabelas
# tabela link1
# remover regras
# detalhe antes de cat é uma crase “`” e não uma aspas simples
for $ip in `cat /etc/ips.link1`
do
ip rule del from $ip &> /dev/null
done
ip rule del from $link1_ip_local &> /dev/null
# adicionar regras
# detalhe antes de cat é uma crase “`” e não uma aspas simples
for $ip in `cat /etc/ips.link1`
do
ip rule add from $ip table link1 prio 30 &> /dev/null
done
ip rule add from $link1_ip_local table link1 prio 30
# adicionar rotas
ip route add $link1_ip_local via $link1_gw dev $link1_iface table link1
ip route add default via $link1_gw table link1

# tabela link2
# remover regras
# detalhe antes de cat é uma crase “`” e não uma aspas simples
for $ip in `cat /etc/ips.link2`
do
ip rule del from $ip &> /dev/null
done
ip rule del from $link2_ip_local &> /dev/null
# adicionar regras
# detalhe antes de cat é uma crase “`” e não uma aspas simples
for $ip in `cat /etc/ips.link2`
do
ip rule add from $ip table link2 prio 30 &> /dev/null
done
ip rule add from $link2_ip_local table link2 prio 30
# adicionar rotas
ip route add $link2_ip_local via $link2_gw dev $link2_iface table link2
ip route add default via $link2_gw table link2

### aplicar mudanças no iproute
ip route flush cache

O iptables

Agora vamos partir para o iptables, é onde iremos determinar com qual ip os clientes vão sair, e se você tiver o SQUID é aqui que vamos redirecionar o tráfego dos clientes para o Squid.

O iptables é que comanda

Quando você tinha apenas um link, para permitir acesso externo bastava usar o mascaramento no iptables (MASQUERADE), mas com o iproute e 2 links na jogada as regras do negócio mudam.

A partir de agora será utilizado no NAT do iptables o “alvo” SNAT (Source NAT).

Como criamos no item anterior, os arquivos /etc/ips.link1 e /etc/ips.link2 que é onde guardamos os ips dos clientes que vão sair pelo link1 e pelo link2 respectivamente, agora vamos determinar no iptables como eles serão “NATeados”.🙂

### script do iptables

# cuidado aqui é crase e não aspas simples
for ip in `cat /etc/ips.link1`
do
iptables -t nat -A POSTROUTING -s $ip -d 0/0 -j SNAT –to $link1_ip_local
done

for ip in `cat /etc/ips.link2`
do
iptables -t nat -A POSTROUTING -s $ip -d 0/0 -j SNAT –to $link2_ip_local
done

Sobre o tratamento no iptables é basicamente isto. Agora se você utiliza o proxy SQUID, vamos ter que adicionar as seguintes regras antes destas regras acima:

for ip in `cat /etc/ips.link1`
do
iptables -t nat -A PREROUTING -s $ip -d 0/0 –dport 80 -j REDIRECT –to 3128
donefor ip in `cat /etc/ips.link2`
do
iptables -t nat -A PREROUTING -s $ip -d 0/0 –dport 80 -j REDIRECT –to 3128
done

Assim o tráfego para a porta 80 será redirecionada para a porta do SQUID.

O SQUID

No Squid, deveremos determinar com qual ip cada cliente sairá também.

Senão ao redirecionar a porta 80 para o Squid, os clientes sairão por apenas um link.

Antes das acls comuns, crie as seguintes acls:

# os ips devem ser os ips das interfaces dos links
# os ips devem existir no servidor (localmente) senão dá erro.# criando as acls
acl ips_link1 src “/etc/ips.link1”
tcp_outgoing_address 100.100.100.2 ips_link1
acl ips_link2 src “/etc/ips.link2”
tcp_outgoing_address 200.200.200.2 ips_link2# aqui entram seus filtros se tiver, tipo.
acl sexo url_regex -i “/etc/squid/lst_sexo.txt”
http_access allow ips_link1 !sexo # por exemplo 

# e no final das regras de http_access antes do deny all
http_access allow ips_link1
http_access allow ips_link2

Pronto, não há muito mistério no SQUID.

Agora vamos para a parte mais interessante de tudo, o script do iptables + iproute2 completos e unidos em um único arquivo.

O script final

Edite o arquivo /etc/fw e coloque nele o conteúdo abaixo:

#!/bin/bash 

clear

echo “———— FIREWALL ————”

## iptables
ipt=iptables
## link1
link1_iface=eth0 # interface do seu link1
link1_rede=100.100.100.0/30 # aqui você coloca sua rede, com máscara
link1_gw=100.100.100.1 # o gateway do seu link1
link1_ip_local=100.100.100.2 # o ip do seu server do link1
## link2
link2_iface=eth1 # interface do seu link2
link2_rede=200.200.200.0/30 # aqui você coloca sua rede, com máscara
link2_gw=200.200.200.1 # o gateway do seu link2
link2_ip_local=200.200.200.2 # o ip do seu server do link2
## rede local
lan_iface=eth2
lan_rede=192.168.0.0/24 # aqui você coloca sua rede com máscara
lan_gw=192.168.0.254 # aqui coloca o gw da rede local

# carregar módulos
echo “Carregando módulos…”
modprobe ip_tables
modprobe iptable_nat
modprobe iptable_mangle
modprobe ip_nat_ftp
modprobe ip_nat_h323
modprobe ipt_limit
modprobe ipt_tos

# limpar regras
echo “Limpando regras antigas…”
$ipt -F
$ipt -t nat -F
$ipt -t mangle -F
$ipt -X
$ipt -t nat -X
$ipt -t mangle -X

# ação padrão – dropar tudo
$ipt -P INPUT DROP
$ipt -P FORWARD DROP
$ipt -P OUTPUT ACCEPT

# aceitar pacotes de retorno
$ipt -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
$ipt -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT

# proteções
# anti-ip spoofing – desativar por causa do iproute2
if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 0 > $f
done
fi
$ipt -A INPUT -i $link1_iface -s 192.168.0.0/255.255.0.0 -j DROP
$ipt -A INPUT -i $link2_iface -s 192.168.0.0/255.255.0.0 -j DROP
$ipt -A INPUT -i $link1_iface -s 172.0.0.0/255.0.0.0 -j DROP
$ipt -A INPUT -i $link2_iface -s 172.0.0.0/255.0.0.0 -j DROP
$ipt -A INPUT -i $link1_iface -s 10.0.0.0/255.0.0.0 -j DROP
$ipt -A INPUT -i $link2_iface -s 10.0.0.0/255.0.0.0 -j DROP

# ativando repasse de pacotes
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
echo 1 > /proc/sys/net/ipv4/ip_forward

# QoS
$ipt -I FORWARD -p tcp –tcp-flags SYN,RST SYN –dport 1863 -j TCPMSS –clamp-mss-to-pmtu
$ipt -I FORWARD -p tcp –tcp-flags SYN,RST SYN –dport 5190 -j TCPMSS –clamp-mss-to-pmtu
$ipt -I FORWARD -p tcp –tcp-flags SYN,RST SYN –dport 7001 -j TCPMSS –clamp-mss-to-pmtu

# liberar acesso interno
echo “Liberando acesso local…”
$ipt -A INPUT -i loopback -j ACCEPT
$ipt -A INPUT -s 127.0.0.1 -j ACCEPT
$ipt -A INPUT -s $link1_ip_local -j ACCEPT
$ipt -A INPUT -s $link2_ip_local -j ACCEPT

# serviços externos
echo “Liberando acesso aos serviços…”
# dns
$ipt -A INPUT -p tcp –dport 53 -j ACCEPT
$ipt -A INPUT -p udp –dport 53 -j ACCEPT
$ipt -A INPUT -p tcp –sport 53 -j ACCEPT
$ipt -A INPUT -p udp –sport 53 -j ACCEPT
# retorno proxy
$ipt -A INPUT -p tcp –dport 3128 –sport 80   -j ACCEPT
$ipt -A INPUT -p tcp –dport 3128 –sport 8080 -j ACCEPT

# serviços internos
# coloque aqui para permitir acesso aos seus serviços internos
$ipt -A INPUT -i $lan_iface -p tcp –dport 22   -j ACCEPT
$ipt -A INPUT -i $lan_iface -p tcp –dport 53   -j ACCEPT
$ipt -A INPUT -i $lan_iface -p udp –dport 53   -j ACCEPT
$ipt -A INPUT -i $lan_iface -p tcp –dport 80   -j ACCEPT
$ipt -A INPUT -i $lan_iface -p tcp –dport 3128 -j ACCEPT

### rotas
# resetar tabelas de rotas
echo “255 local” > /etc/iproute2/rt_tables
echo “254 main” >> /etc/iproute2/rt_tables
echo “253 default” >> /etc/iproute2/rt_tables
echo “0 unspec” >> /etc/iproute2/rt_tables
echo “30 link1” >> /etc/iproute2/rt_tables
echo “30 link2” >> /etc/iproute2/rt_tables
# remover rotas padrão – se houver
ip route del default &> /dev/null
ip route del default &> /dev/null
ip route del default &> /dev/null
# remover tabelas
ip rule del lookup link1 &> /dev/null
ip rule del lookup link1 &> /dev/null
ip rule del lookup link1 &> /dev/null
ip rule del lookup link2 &> /dev/null
ip rule del lookup link2 &> /dev/null
ip rule del lookup link2 &> /dev/null

# adicionar rotas nas tabelas
# tabela link1
# remover regras
# detalhe antes de cat é uma crase “`” e não uma aspas simples
for $ip in `cat /etc/ips.link1`
do
ip rule del from $ip &> /dev/null
done
ip rule del from $link1_ip_local &> /dev/null
# adicionar regras
# detalhe antes de cat é uma crase “`” e não uma aspas simples
for $ip in `cat /etc/ips.link1`
do
ip rule add from $ip table link1 prio 30 &> /dev/null
done
ip rule add from $link1_ip_local table link1 prio 30
# adicionar rotas
ip route add $link1_ip_local via $link1_gw dev $link1_iface table link1
ip route add default via $link1_gw table link1

# tabela link2
# remover regras
# detalhe antes de cat é uma crase “`” e não uma aspas simples
for $ip in `cat /etc/ips.link2`
do
ip rule del from $ip &> /dev/null
done
ip rule del from $link2_ip_local &> /dev/null
# adicionar regras
# detalhe antes de cat é uma crase “`” e não uma aspas simples
for $ip in `cat /etc/ips.link2`
do
ip rule add from $ip table link2 prio 30 &> /dev/null
done
ip rule add from $link2_ip_local table link2 prio 30
# adicionar rotas
ip route add $link2_ip_local via $link2_gw dev $link2_iface table link2
ip route add default via $link2_gw table link2

# aplicar mudanças no iproute
ip route flush cache

# liberando acesso clientes
echo -n “Liberando acesso para clientes…”
# clientes link1
for ip in `cat /etc/ips.link1`
do

# liberação de FORWARD
$ipt -A FORWARD -s $ip -j ACCEPT

# marcar pacotes para gráfico de consumo de banda
$ipt -t mangle -A PREROUTING -s $ip -j ACCEPT # down
$ipt -t mangle -A POSTROUTING -d $ip -j ACCEPT # up

# mascaramento – radio uol
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.5.71 -j ACCEPT
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.74 -j ACCEPT
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.75 -j ACCEPT
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.118 -j ACCEPT

# nat caixa econômica federal (conectividade)
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.201.0.0/16 –dport 80 -j ACCEPT

# redirecionamento para o proxy
$ipt -t nat -A PREROUTING -p tcp -s $ip –dport 80 -j REDIRECT –to-port 3128
$ipt -t nat -A PREROUTING -p tcp -s $ip –dport 8080 -j REDIRECT –to-port 3128

$ipt -t nat -A POSTROUTING -s $ip -d 0/0 -j SNAT –to $link1_ip_local

echo -n “.”

done
# clientes link2
for ip in `cat /etc/ips.link2`
do

# liberação de FORWARD
$ipt -A FORWARD -s $ip -j ACCEPT

# marcar pacotes para gráfico de consumo de banda
$ipt -t mangle -A PREROUTING -s $ip -j ACCEPT # down
$ipt -t mangle -A POSTROUTING -d $ip -j ACCEPT # up

# mascaramento – radio uol
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.5.71 -j ACCEPT
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.74 -j ACCEPT
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.75 -j ACCEPT
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.118 -j ACCEPT

# nat caixa econômica federal (conectividade)
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.201.0.0/16 –dport 80 -j ACCEPT

# redirecionamento para o proxy
$ipt -t nat -A PREROUTING -p tcp -s $ip –dport 80 -j REDIRECT –to-port 3128
$ipt -t nat -A PREROUTING -p tcp -s $ip –dport 8080 -j REDIRECT –to-port 3128

$ipt -t nat -A POSTROUTING -s $ip -d 0/0 -j SNAT –to $link2_ip_local

echo -n “.”

done
echo “”
echo “———————————-”

Script pronto, agora temos que torná-lo executável: 

# chmod +x /etc/fw

Vamos colocar ele no patch pra poder executar apenas digitando “fw” no prompt.

# ln -s /etc/fw /sbin/fw

Pronto. Agora basta testar e correr para o abraço.

Obs: No SQUID basta adicionar o que está no item 6 e pronto.

Espero que tenha ajudado alguém!

Não esqueçam de dar feedback!
Créditos: Wenderson Souza (Viva O Linux)

14 Responses to Controlando 2 links de internet (roteados) em um gateway Linux com SQUID

  1. ICL disse:

    Se a necessidade for redundância o que muda. Ou seja: dois links, um fica em funcionamento e caso ele caia o outro assume. Antecipadamente agradeço.

    • admin disse:

      A necessidade é única e exclusivamente para fazer com que os dois links funcionem como um único link, por exemplo, dois links de 2mb, com essas configurações seria apenas um link de 4mb, mas não há limitações para implementar essa sua idéia, afinal seria interessante, verificarei com o autor a possibilidade para adaptar de forma a fazer essa redundância.

      Obrigado pela visita.

      • ICL disse:

        Olá Admin, tive pesquisando e esperando uma solução para a redudancia (soma dos dois links), Vocês possuem alguma novidade?

        • admin disse:

          Até o momento ainda não tenho novidade, eles sugeriu que seja utilizado o fail-over. Ele estará postando uma dica ou outro artigo de como utilizar o fail-over nesse seu caso.

        • admin disse:

          Bom estive fazendo uma consulta com o autor e fui informado que como neste caso já seria um fail-over, aí teria que criar algum script para ficar monitorando o link default, se ele cair roda um script que muda o gateway padrão e roda um squid configurado (squid2.conf) para apenas o link 2. etc.

          Essa solução AINDA não foi desenvolvida.

          Mas uns fluxogramas (estudo do problema) e um pouco de shell-script dá pra fazer isso rodar.

  2. joorlando3 disse:

    Bom seguindo essa dica como eu faria para em determinado ip apenas liberar o email e bloquear dos demais serviços?

    • root disse:

      Olá amigo, bom é o seguinte: como estou um pouco parado com Linux (estou usando FreeBSD), aconselha você a usar o pfSense, ele segue essa mesma linha de raciocinio deste post, e ainda tem administração via web browser, pesquisa sobre ele.

      Não me arrependi ainda.

      Fica dica.

  3. Fernando disse:

    Ola, boa tarde, cara segui todos os passos porém estou tendo problemas, para mim esta aparecendo “Network Unreachable”, muito provavel que fiz algo errado…
    só um detalhe uso 1 placa virtual, ou seja, fisica eth0 virtual eth0:1…. tem como me dar uma ajuda?

    • root disse:

      Esse erro “Network Unreachable” acontece quando não há comunicação entre o PC cliente e o PC de destino, ou seja, não há nenhuma comunicação de rede, não há uma rede ativa.

  4. maykonmeira disse:

    Prezado, tudo funcionou perfeitamente o unico detalhe é que tenho alguns redirecionamento externos e eles pararam de funcionar. Eu consigo conectar no ip externo de fora. Alguam dica ?

  5. Thanks for another magnificent post. The place else could anyone get that
    kind of info in such a perfect manner of writing? I’ve a presentation subsequent week, and I’m at the search for such
    information.

  6. I have fun with, lead to I discovered just what
    I was having a look for. You’ve ended my 4 day long hunt! God Bless you man. Have a nice day. Bye

  7. marluzio disse:

    Pessoal, blz? Primeiramente parabens pelo artigo.
    Estou testando no CentOS 5.10(final) mas estou com 2 problemas:

    1 – a saida so funciona por um link..mesmo invertendo os mesmos. Exemplo:
    Minha conf. esta assim:
    ## iptables
    ipt=iptables
    ## link1
    link1_iface=eth1 # interface do seu link1
    link1_rede=192.168.10.0/24 # aqui você coloca sua rede, comm áscara
    link1_gw=192.168.10.1 # o gateway do seu link1
    link1_ip_local=192.168.10.2 # o ip do seu server do link1
    ## link2
    link2_iface=eth2 # interface do seu link2
    link2_rede=192.168.100.0/24 # aqui você coloca sua rede, com máscara
    link2_gw=192.168.100.1 # o gateway do seu link2
    link2_ip_local=192.168.100.2 # o ip do seu server do link2
    ## rede local
    lan_iface=eth0
    lan_rede=10.85.5.0/24 # aqui você coloca sua rede com máscara
    lan_gw=10.85.5.1 # aqui coloca o gw da rede local

    A saida pelo LINK1 funciona perfeitamente..mas os ips do link dois nao funionam. Ai se eu inverter e deixar assim:

    ## iptables
    ipt=iptables
    ## link2
    link2_iface=eth1 # interface do seu link1
    link2_rede=192.168.10.0/24 # aqui você coloca sua rede, comm áscara
    link2_gw=192.168.10.1 # o gateway do seu link1
    link2_ip_local=192.168.10.2 # o ip do seu server do link1
    ## link1
    link1_iface=eth2 # interface do seu link2
    link1_rede=192.168.100.0/24 # aqui você coloca sua rede, com máscara
    link1_gw=192.168.100.1 # o gateway do seu link2
    link1_ip_local=192.168.100.2 # o ip do seu server do link2
    ## rede local
    lan_iface=eth0
    lan_rede=10.85.5.0/24 # aqui você coloca sua rede com máscara
    lan_gw=10.85.5.1 # aqui coloca o gw da rede local

    Dessa forma so funciona a saida pelo Link2… a saida pela interface eth2 nao funfa…muito esquisito…ate agora nao consegui solucionar..se alguem tiver alguma luz..

    2 – O outro problema é que os ips da rede local nao pingam o ip do firewall;

    Abaixo segue meu script completo:

    #!/bin/bash
    clear
    echo “———— FIREWALL ————”

    ## iptables
    ipt=iptables
    ## link1
    link1_iface=eth1 # interface do seu link1
    link1_rede=192.168.10.0/24 # aqui você coloca sua rede, comm áscara
    link1_gw=192.168.10.1 # o gateway do seu link1
    link1_ip_local=192.168.10.2 # o ip do seu server do link1
    ## link2
    link2_iface=eth2 # interface do seu link2
    link2_rede=192.168.100.0/24 # aqui você coloca sua rede, com máscara
    link2_gw=192.168.100.1 # o gateway do seu link2
    link2_ip_local=192.168.100.2 # o ip do seu server do link2
    ## rede local
    lan_iface=eth0
    lan_rede=10.85.5.0/24 # aqui você coloca sua rede com máscara
    lan_gw=10.85.5.1 # aqui coloca o gw da rede local

    # carregar módulos

    echo “Carregando módulos…”
    modprobe ip_tables
    modprobe iptable_nat
    modprobe iptable_mangle
    modprobe ip_nat_ftp
    modprobe ip_nat_h323
    modprobe ipt_limit
    modprobe ipt_tos

    # limpar regras

    echo “Limpando regras antigas…”
    $ipt -F
    $ipt -t nat -F
    $ipt -t mangle -F
    $ipt -X
    $ipt -t nat -X
    $ipt -t mangle -X

    # ação padrão – dropar tudo

    $ipt -P INPUT DROP
    $ipt -P FORWARD DROP
    $ipt -P OUTPUT ACCEPT

    # aceitar pacotes de retorno
    $ipt -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
    $ipt -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT

    # proteções
    # anti-ip spoofing – desativar por causa do iproute2
    if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
    for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
    echo 0 > $f
    done
    fi

    $ipt -A INPUT -i $link1_iface -s 192.168.0.0/255.255.0.0 -j DROP
    $ipt -A INPUT -i $link2_iface -s 192.168.0.0/255.255.0.0 -j DROP
    $ipt -A INPUT -i $link1_iface -s 172.0.0.0/255.0.0.0 -j DROP
    $ipt -A INPUT -i $link2_iface -s 172.0.0.0/255.0.0.0 -j DROP
    $ipt -A INPUT -i $link1_iface -s 10.0.0.0/255.0.0.0 -j DROP
    $ipt -A INPUT -i $link2_iface -s 10.0.0.0/255.0.0.0 -j DROP

    # ativando repasse de pacotes
    echo 1 > /proc/sys/net/ipv4/ip_dynaddr
    echo 1 > /proc/sys/net/ipv4/ip_forward
    # QoS
    $ipt -I FORWARD -p tcp –tcp-flags SYN,RST SYN –dport 1863 -j TCPMSS –clamp-mss-to-pmtu
    $ipt -I FORWARD -p tcp –tcp-flags SYN,RST SYN –dport 5190 -j TCPMSS –clamp-mss-to-pmtu
    $ipt -I FORWARD -p tcp –tcp-flags SYN,RST SYN –dport 7001 -j TCPMSS –clamp-mss-to-pmtu
    # liberar acesso interno

    echo “Liberando acesso local…”
    $ipt -A INPUT -i loopback -j ACCEPT
    $ipt -A INPUT -s 127.0.0.1 -j ACCEPT
    $ipt -A INPUT -s $link1_ip_local -j ACCEPT
    $ipt -A INPUT -s $link2_ip_local -j ACCEPT

    # serviços externos
    echo “Liberando acesso aos serviços…”
    # dns
    $ipt -A INPUT -p tcp –dport 53 -j ACCEPT
    $ipt -A INPUT -p udp –dport 53 -j ACCEPT
    $ipt -A INPUT -p tcp –sport 53 -j ACCEPT
    $ipt -A INPUT -p udp –sport 53 -j ACCEPT

    # retorno proxy

    $ipt -A INPUT -p tcp –dport 3128 –sport 80 -j ACCEPT
    $ipt -A INPUT -p tcp –dport 3128 –sport 8080 -j ACCEPT
    # serviços internos
    # coloque aqui para permitir acesso aos seus serviços internos
    $ipt -A INPUT -i $lan_iface -p tcp –dport 22 -j ACCEPT
    $ipt -A INPUT -i $lan_iface -p tcp –dport 53 -j ACCEPT
    $ipt -A INPUT -i $lan_iface -p udp –dport 53 -j ACCEPT
    $ipt -A INPUT -i $lan_iface -p tcp –dport 80 -j ACCEPT
    $ipt -A INPUT -i $lan_iface -p tcp –dport 3128 -j ACCEPT

    ### rotas

    # resetar tabelas de rotas
    echo “255 local” > /etc/iproute2/rt_tables
    echo “254 main” >> /etc/iproute2/rt_tables
    echo “253 default” >> /etc/iproute2/rt_tables
    echo “0 unspec” >> /etc/iproute2/rt_tables
    echo “30 link1” >> /etc/iproute2/rt_tables
    echo “31 link2” >> /etc/iproute2/rt_tables

    # remover rotas padrão – se houver
    ip route del default &> /dev/null
    ip route del default &> /dev/null
    ip route del default &> /dev/null
    # remover tabelas

    ip rule del lookup link1 &> /dev/null
    ip rule del lookup link1 &> /dev/null
    ip rule del lookup link1 &> /dev/null
    ip rule del lookup link2 &> /dev/null
    ip rule del lookup link2 &> /dev/null
    ip rule del lookup link2 &> /dev/null

    # adicionar rotas nas tabelas
    # tabela link1
    # remover regras
    # detalhe antes de cat é uma crase “`” e não uma aspas simples
    for ip in `cat /etc/ips.link1`
    do
    ip rule del from $ip &> /dev/null

    done
    ip rule del from $link1_ip_local &> /dev/null
    # adicionar regras
    # detalhe antes de cat é uma crase “`” e não uma aspas simples
    for ip in `cat /etc/ips.link1`
    do
    ip rule add from $ip table link1 prio 30 &> /dev/null
    done
    ip rule add from $link1_ip_local table link1 prio 30
    # adicionar rotas

    ip route add $link1_ip_local via $link1_gw dev $link1_iface table link1
    ip route add default via $link1_gw table link1
    # tabela link2
    # remover regras
    # detalhe antes de cat é uma crase “`” e não uma aspas simples
    for ip in `cat /etc/ips.link2`
    do
    ip rule del from $ip &> /dev/null
    done
    ip rule del from $link2_ip_local &> /dev/null

    # adicionar regras
    # detalhe antes de cat é uma crase “`” e não uma aspas simples
    for ip in `cat /etc/ips.link2`
    do
    ip rule add from $ip table link2 prio 30 &> /dev/null
    done
    ip rule add from $link2_ip_local table link2 prio 30
    # adicionar rotas
    ip route add $link2_ip_local via $link2_gw dev $link2_iface table link2
    ip route add default via $link2_gw table link2

    # aplicar mudanças no iproute
    ip route flush cache

    # liberando acesso clientes
    echo -n “Liberando acesso para clientes…”
    # clientes link1
    for ip in `cat /etc/ips.link1`
    do

    # liberação de FORWARD
    $ipt -A FORWARD -s $ip -j ACCEPT

    # marcar pacotes para gráfico de consumo de banda
    $ipt -t mangle -A PREROUTING -s $ip -j ACCEPT # down
    $ipt -t mangle -A POSTROUTING -d $ip -j ACCEPT # up

    # mascaramento – radio uol

    $ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.5.71 -j ACCEPT
    $ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.74 -j ACCEPT
    $ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.75 -j ACCEPT
    $ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.118 -j ACCEPT

    # nat caixa econômica federal (conectividade)
    $ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.201.0.0/16 –dport 80 -j ACCEPT

    # redirecionamento para o proxy
    #$ipt -t nat -A PREROUTING -p tcp -s $ip –dport 80 -j REDIRECT –to-port 3128
    #$ipt -t nat -A PREROUTING -p tcp -s $ip –dport 8080 -j REDIRECT –to-port 3128
    $ipt -t nat -A POSTROUTING -s $ip -d 0/0 -j SNAT –to $link1_ip_local
    echo -n “.”

    done

    # clientes link2
    for ip in `cat /etc/ips.link2`
    do
    # liberação de FORWARD
    $ipt -A FORWARD -s $ip -j ACCEPT
    # marcar pacotes para gráfico de consumo de banda
    $ipt -t mangle -A PREROUTING -s $ip -j ACCEPT # down
    $ipt -t mangle -A POSTROUTING -d $ip -j ACCEPT # up

    # mascaramento – radio uol

    $ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.5.71 -j ACCEPT
    $ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.74 -j ACCEPT
    $ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.75 -j ACCEPT
    $ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.118 -j ACCEPT

    # nat caixa econômica federal (conectividade)
    $ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.201.0.0/16 –dport 80 -j ACCEPT

    # redirecionamento para o proxy
    #$ipt -t nat -A PREROUTING -p tcp -s $ip –dport 80 -j REDIRECT –to-port 3128
    #$ipt -t nat -A PREROUTING -p tcp -s $ip –dport 8080 -j REDIRECT –to-port 3128
    $ipt -t nat -A POSTROUTING -s $ip -d 0/0 -j SNAT –to $link2_ip_local

    echo -n “.”

    done
    echo “”
    echo “———————————-”

    Tirei o squid so a carater de teste..mas esta funcionando com ele da mesma forma..so sai por um link..se alguem tiver uma luz rs

    Abracoo

Conte-nos o que achou...

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: