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

Há algum tempo atrás precisei ativar 2 links dedicados e de fornecedores diferentes. Quando meu segundo link foi ativado, começou minha 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!

[ Hits: 144.645 ]

Por: Wenderson Souza em 21/05/2008


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.

    Próxima página

Páginas do artigo
   1. Introdução
   2. Fazendo alguns ajustes antes do iproute2
   3. O iproute2 (coração do assunto)
   4. O iptables
   5. O SQUID
   6. O script final
   7. Referências
   8. Sobre o autor
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Criando cluster com o PFSense

Implementando prioridade nos serviços com TOS no Iptables

Segurança com iptables

Monitorando e bloqueando P2P com IPTABLES e IPP2P

Revisão atualizada de instalação do Iptables com Layer7

  
Comentários
[1] Comentário enviado por removido em 21/05/2008 - 13:33h

Muito bom
:)

[2] Comentário enviado por removido em 21/05/2008 - 17:31h

Ola Wenderson,

Muito legal seu artigo. Parabens kr!!

Quando o seu link1 cair, os hosts da lista /etc/ips.link1 ficam sem acesso a internet? Voce manobra manualmente os ips para o link2 ou tem algum script que checa isto e faz automaticamente a manobra?

Abraços

[3] Comentário enviado por neon_ em 21/05/2008 - 17:46h

micnet, infelizmente nesse script não tem ativado o fail-over. mas pode-se fazer isso apenas com algumas alteracoes no script e colocando-o no crontab.

exemplo: faz-se um teste se o gateway do link1 esta "roteando" se sim ativa o link 1, faz-se o teste se o gateway do link2 está "roteando" se sim ativa o link 2. e se nao estiver roteando um dos dois ativa os clientes apenas para um link específico. se nao tiver os 2, infelizmente nao tem como resolver. :)

se quiser posso postar o artigo com fail-over depois. :)

[4] Comentário enviado por aprendiz_ce em 22/05/2008 - 22:01h

Ótimo artigo!

E sem falar que eu andava procurando por algo do tipo e que fosse atual... Se possível, posta um artigo/dica de como criar o "fail-over", pois será de grande vália para todos.

Outra coisa: Não sei se posso perguntar sobre isso!!! Mas... Quanto se deve COBRAR por um solução dessa junto ao cliente?

Muito obrigado e parabéns pelo artigo.

[5] Comentário enviado por neon_ em 22/05/2008 - 22:14h

mardonio, primeiramente obrigado pelas parebenizações.

vou conseguir um tempo pra montar o artigo ou dica com "fail-over" esta semana.


sobre preços, deve-se cobrar o valor que se cobrar para montar um firewall e isso depender muito da realidade de sua cidade/estado.

[6] Comentário enviado por gersonraymond em 25/05/2008 - 11:37h

Muito bom este artigo, parabéns pela dedicação e consideração com a comunidade Linux, um abraço.

[7] Comentário enviado por dailson em 26/05/2008 - 13:49h

Excelente artigo neon_

Didaticamente exemplar.

Estamos esperando o artigo sobre fail-over ;)

[8] Comentário enviado por dailson em 26/05/2008 - 13:49h

Excelente artigo neon_

Didaticamente exemplar.

Estamos esperando o artigo sobre fail-over ;)

[9] Comentário enviado por faroots_gnu em 01/08/2008 - 03:27h

Parabens... tive muita dor de cabeça pra fazer isso (após ler seu artigo me ajudou muito, alias fez todo o serviço. Como sou quase um leigo) agora... Pode me matar algumas duvidas?? O server ta rodando direitinho com DHPC e DNS.

1- A velocidade será das 2 interfaces no servidor? (ex. link1 + link2, 1Mb + Mb = 2Mb no servidor?) ou apenas nos clientes que são divididos nas duas listas?
2 - Meu servidor só traça uma rota, a do link 1 pq? Axei q ele teria que enviar nos 2 gateways!
3 - Como testar e reconhecer realmente se esta funcionando?? alguma ferramenta, comando, algo no sentido?

Muito obrigado mesmo, é de grande valia o artigo e a resposta dessas questões e novamente parabens neon_!!

[10] Comentário enviado por neon_ em 01/08/2008 - 16:20h

>> 1- A velocidade será das 2 interfaces no servidor? (ex. link1 + link2, 1Mb + Mb = 2Mb no servidor?) ou apenas nos clientes que são divididos nas duas listas?

O servidor terá as velocidades somadas sim, mas nao quer dizer que você sempre terá 2Mbits disponíveis. Isso porque você determina por onde os clientes vao sair.
Por exemplo: se o link1 estiver cheio, nao tem como fazer ele comecar a utilizar a banda do link2, pois vc determinou que os clientes do arquivo etc/ips.link1 saiam apenas pelo link1.

Iso poderia ser resolvido com balanceamento dos links, mas dá muito problema com conexões seguras (bancos, jogos, etc)

2 - Meu servidor só traça uma rota, a do link 1 pq? Axei q ele teria que enviar nos 2 gateways!
Ele deveria tracar a rota pelo link1 de quem esta no arquivo /etc/ips.link1 e pelo link2 de quem esta no arquivo /etc/ips.link2.

3 - Como testar e reconhecer realmente se esta funcionando?? alguma ferramenta, comando, algo no sentido?
Pode configurar seu ip para sair pelo link1 e testar com um traceroute mesmo. para uol por exemplo:
no linux - traceroute www.uol.com.br
no windows - tracert www.uol.com.br

E depois vc configura seu ip para sair pelo link2 e faz o mesmo teste. O resultado deve ser por rotas direrentes a partir do seu servidor. Já que são links distintos.

Espero ter ajudado.

[11] Comentário enviado por faroots_gnu em 04/08/2008 - 18:00h

Amigo esta ajudando d++...
mais algumas duvidas, duvidas rsrs (espero que não estar chateando)

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

---> etc/sysconfig/network-scripts/ifcfg-eth0
no Debian esses arquivos (no caso é um apenas certo?) e ele fica em etc/network/interfaces ?? é nele que mudo as configurações das eth ?

2 - Para que eu use o iproute2 para controlar a nova rota eu preciso dessabilitar a padrão certo? (no caso do Cent OS fica em etc/sysconfig/network), onde fica esse arquivo no DEBIAN?

3 - no script do Iptables, eu crio ou altero algum script ja definido? item 4 do tutorial?

4 - O item 5 do tutorial mostra o script do Squid, edito o Squid.conf ou crio outro script? Como colcoar o squid pra iniciar depois disso?

5 - Entendi o script Final, apenas o (no SQUID basta adicionar o que está no item 6 e pronto), add o que? onde?


Amigo, se pudesse me ajudar, fiz tudo direitinho num Kurumin e funcionou legal no primeiro dia, no outro dia o link 2 não funcionava parou tudo. Resolvi mudar de distribuição (DEBIAN) alem de mais instavel, mais seguro... Agora to tendo problemas pra fazer funcionar dessa forma que esta no tutorial... Agradeço a ajuda!! Obrigadoo!

[12] Comentário enviado por neon_ em 04/08/2008 - 19:08h

>>1 - no Debian esses arquivos (no caso é um apenas certo?) e ele fica em
>> /etc/network/interfaces ?? é nele que mudo as configurações das eth ?

isso

>> 2 - Para que eu use o iproute2 para controlar a nova rota eu preciso dessabilitar
a padrão certo? (no caso do Cent OS fica em etc/sysconfig/network), onde fica esse
arquivo no DEBIAN?

apesar de utilizar apenas distribuições RedHat-Like. :), dei uma "googlada"
o gateway no debian fica no próprio /etc/network/interfaces, onde vc encontrar a expressão gateway, você remove a linha.

mas se prestar atencao, no script do iproute2, ja existem as funcoes para remover o gateway padrão, independente de existir no arquivo ou nao.

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

>> 3 - no script do Iptables, eu crio ou altero algum script ja definido? item 4 do tutorial?

pode apenas alterar seu script de firewall (se já tiver algum), o que importa é compreender que o que vai controlar por onde o pacote vai sair vai ser o DNAT (Destination NAT), que será o IP local do seu gateway do link que quer que saia (eita, ficou meio enrolado mas acho que dá pra entender).

>> 4 - O item 5 do tutorial mostra o script do Squid, edito o Squid.conf ou crio outro script?
>> Como colcoar o squid pra iniciar depois disso?

pode editar o squid.conf apenas e adicionar as ACLs referenciadas no item 5.
para recarregar o squid pode fazer "squid -k reconfigure"

>> 5 - Entendi o script Final, apenas o (no SQUID basta adicionar o que está no item 6 e
>> pronto), add o que? onde?

desculpe, só agora que vi que está errado, leia-se "no SQUID basta adicionar o que está no item 5 e pronto". que seria:

# 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


>> Amigo, se pudesse me ajudar, fiz tudo direitinho num Kurumin e funcionou legal
>> no primeiro dia, no outro dia o link 2 não funcionava parou tudo. Resolvi mudar
>> de distribuição (DEBIAN) alem de mais instavel, mais seguro... Agora to tendo
>> problemas pra fazer funcionar dessa forma que esta no tutorial...
>> Agradeço a ajuda!! Obrigadoo!

primeiramente, confirme se seus modems estão como router, se você for fazer este tutorial com conexão pppX (modem em bridge) o tutorial nao fica 100%, porque a interface muda de ip quando cai e volta.

agora se estiver tudo ok (modems em router) e você nao tiver fazendo os testes em servidor de produção. recomendo usar CentOS, que foi de onde surgiu otutorial e funcionava 100%.

qualquer coisa. estamo aí.

[13] Comentário enviado por nuvem_negra em 04/09/2008 - 13:48h

Excelente.

[14] Comentário enviado por joysson em 10/09/2008 - 11:26h

Obrigado pela iniciativa. Estou tentando montar este artigo em Debian.
Alguem conseguiu?
Obrigado.

[15] Comentário enviado por joysson em 10/09/2008 - 13:01h

Boa tarde. Montei o Servidor em Debian Etch 4.0 stable.
Quando rodo o script me retorna o erro abaixo:

------------ FIREWALL ------------
Carregando móos...
Limpando regras antigas...
Liberando acesso local...
Liberando acesso aos serviç...
/sbin/fw: line 146: `$ip': not a valid identifier
/sbin/fw: line 155: `$ip': not a valid identifier
/sbin/fw: line 170: `$ip': not a valid identifier
/sbin/fw: line 179: `$ip': not a valid identifier
RTNETLINK answers: File exists
Liberando acesso para clientes.....
----------------------------------
debian:~#

Alguma sugestao??

JJ

[16] Comentário enviado por evadog em 29/01/2009 - 16:08h

ola ... Adorei o artigo muito bem elaborado ... tive alguns problemas para colocar para funcionar mas ta quase tudo resolvido.
O meu script funciona sem erros mas a minha conecção só sai pelo link 1
adicionei as linhas no squid mas acho que não ta certo

uso ubuntu 8.04

[17] Comentário enviado por grferreira em 29/01/2009 - 17:10h

Ótimo artigo ...

O problema do joysson eu tb enfrentei aqui , mas está no momento de fazer o "for" para as tabelas:

or $ip in `cat /etc/ips.link1` ------------------- nesta linha é a declaração da variável, então não se coloca o $ antes de "ip"
do
ip rule del from $ip &> /dev/null
done

Joysson, siga o mesmo raciocínio onde aparecer a sintaxe de loop for...in...do

Abs



[18] Comentário enviado por neon_ em 29/01/2009 - 17:30h

Extamente pessoal, houve algum erro na hora de passar o script para o artigo.

Onde tem o for

for $ip in `cat /etc/ips.link1`

deve-se tirar o $ da variavel $ip, pois o for em si que tornará ip em uma variável.

deve ficar assim:

for ip in `cat /etc/ips.link1`

em todos os quatro for's.

vou pedir para o adm do site mudar isso.

grato pela atencao no erro.

[19] Comentário enviado por arroiz em 31/01/2009 - 18:48h

Olá neon_
Estou tentando implementar em um Mandriva 2008, mas não dá certo!
Fiz tudo conforme indicado, mas ninguém da rede consegue navegar na internet quando ativo este firewall.
Já tenho funcionando com 1 link normalmente, em outro tipo de script de firewall, mas agora com dois links não consigo mesmo!
O script eu fiz igual, só ajustando as "variáveis". Só que meus links são: 1 virtua c/ modem ligado direto em 1 placa de rede e o outro é 1 speedy c/ modem roteado, também ligado em outra placa de rede direto. Será que é por isso que não funciona? Por ter os modens ligados direto? Eu peguei todos os ip's certinho das conexões e inseri nas variáveis.
Bem, uma outra dúvida que tenho é: Não é possível criar regras somente para 1 dos links e todo o restante das conexões saírem pelo outro link automaticamente?
Por exemplo: cria todas as tabelas para usuários do link 1, conforme seu artigo, e adiciona uma regra básica de "ip route add..." para todos os outros usuários?

[20] Comentário enviado por cleibson em 17/03/2009 - 01:18h

Olá pessoal. Estou usando esse tutorial Funciona tudo blz. Porém faço controle de banda com CBQ(cbq.init-v0.7.3).
Com essa solução rodando meu cbq não controle banda direito mais. Começa a fazer o download e logo fixa em 5k por segundo.
Alguma idéia de como resolver isso? URGENTE!!!

[21] Comentário enviado por neon_ em 17/03/2009 - 09:07h

Cleibson,

Como respondido pelo e-mail, veja se você nao esta aplicando o CBQ na interface errada.

Vc deve aplicar o CBQ na interface LOCAL e nao nas interfaces onde os links chegam.

Grato,

Wenderson Souza

[22] Comentário enviado por neon_ em 17/03/2009 - 09:09h

arroiz,

Você tem que ter os modem (todos, visto que o script nao tem limitação de links), roteados.

Se tiver o modem em bridge, com autenticação no linux, nao funciona.

Sobre a pergunta de determinar IPs para o link1 e o resto para o link2, so me responda uma pergunta, que o linux deverá saber também, quais os outros ips que sairão pelo link 2?

E a rota para esses ips dentro da rede local?

Por isso a lista com ips "informados".

Grato,

Wenderson Souza

[23] Comentário enviado por cleibson em 30/05/2009 - 09:56h

Olá pessoal. as regras na seção "mascaramento - radio uol" é necessário cria essas regras para cada cliente? Não pode ser criada somente uma vez, especificando só o destino?

[24] Comentário enviado por neon_ em 31/05/2009 - 16:58h

Cleibson,

Pode sim ser criada uma vez apenas.

Mas, no meu caso que sou um ISP, isso força a liberação apenas para clientes que estão na lista de IPS.

Evitando que IPs de "não clientes" consigam acessar, sacas?

Atenciosamente,

Wenderson Souza

[25] Comentário enviado por vinicius_argolo em 15/06/2009 - 01:26h

Como eu posso implementar um servidor pppoe + radius nesse sistema?

[26] Comentário enviado por xloko em 26/06/2009 - 16:34h

olá !!
parabens !! é tudo que estava procurando desesperadamenteee! vai salvar a minha vida !!
estou testando, e me surgiram algumas duvidas e erros.. tenho umas perguntas !! (de leigo)

1 - como faco para todos os servico passarem pelo link 1 e algums servicos pelo link 2?
ex:
o servico de smtp e pop de todos vao sair pelo link 2, pois o link 2 é fixo, e a outra ponta autentica o ip.
com isso é necessario o ips.link1 e oips.link2? no squid e fire

2 - uso o openfire, e quero que a outra ponta se conect pelo ip fixo, o openfire esta no mesmo server.

Segue a baixo o que eu testei !
quando rodo ele, meu ssh é bloqueado!
e nao consigo pingar ip e nome , pelos clientes
segue a baixo -- o fw.sh




#!/bin/bash
# 2606091200T
clear

echo "------------ FIREWALL - 2606091200T ------------"

## iptables
ipt=iptables
## link1
link1_iface=eth0 # interface do seu link1
link1_rede=192.168.0.0/24 # aqui você coloca sua rede, com máscara
link1_gw=192.168.1.254 # o gateway do seu link1
link1_ip_local=192.168.1.3 # o ip do seu server do link1
## link2
link2_iface=eth1 # interface do seu link2
link2_rede=200.200.0.88/24 # aqui você coloca sua rede, com máscara
link2_gw=200.200.0.89 # o gateway do seu link2
link2_ip_local=200.200.0.93 # 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.9 # 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 "----------------------------------"

----------------------------------------------------------------------------------------
obs! para libera o meu squid eu uso a seguinte regra:
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
iptables -t nat -A PREROUTING -s 192.168.0.0/255.255.255.0 -p tcp --dport 80 -j REDIRECT --to-port 3128
devo substituir por essa?


os ips validos eu troquei -- os internos .. nem precisa !! ou precisa?

se puder ajudar !! agradeço desde já
obrigado !!

[27] Comentário enviado por xloko em 30/06/2009 - 08:59h

opa!! ainda estou tentando !! ja procurei por 3 scripst difrente, esse é o mais completo.. e me atende .. mas ainda n consegui fazzer ele funfar!!

quando puder ..

valeus!

[28] Comentário enviado por halleybr em 29/07/2009 - 11:25h

então amigo estou com a mesma duvida do Xloko....

como o "linux" é o gateway, eu preciso ter uma rota default pra conseguir acessar pop, smtp e algumas portas correto? E como teria q ser feito??? o que eu incrementaria ao script pra ele liberar o email (outlook express e etc) q nao passam pelo squid...

obrigadao amigo

[29] Comentário enviado por neon_ em 29/07/2009 - 12:10h

halleybr,

POP, SMTP é conexao NATeada.

Basta que o ip esteja na lista de ips liberados que ele terá acesso.

Para o squid esta sendo redirecionado apenas as portas 80 e 8080, o resto é tudo NAT.

Wenderson Souza

[30] Comentário enviado por halleybr em 29/07/2009 - 14:11h

Wenderson,
valeu pela resposta amigo... eu rodo o script ele "para" tudo... ai eu reinicio volta a funcionar...

Ah, amigo e FTP (cliente do Filezilla por ex) pra fazer funcionar é tambem so estar no ips lá? eu coloquei nos ips assim: 192.168.211.1/24 estao no link1 e 192.168.0.1/24 e 192.168.1.1/24 no link2...

Mas o e-mail nao funciona...

[31] Comentário enviado por neon_ em 29/07/2009 - 15:09h

Tudo que nao for porta 80 ou 8080 vai sair por NAT.

Nos arquivos ips.link1 e ips.link2 vc deve colocar apenas o ip, sem a máscara.

exemplo:

192.168.0.1
192.168.0.2

blz?

[32] Comentário enviado por halleybr em 29/07/2009 - 15:45h

Fala amigo, então eu entendi que tem que por os ips... eu botei a mascara e ele pegava tb na boa.... pq se nao vou ter q colocar 500 ips na mão fora as outras vlans.... sacou? pq usamos dhcp... mas o q eu disse é que quando eu rodo o script ele "trava" tudo e total internet, ninguem navega nem nada.... estranho demais isso... antes tinha funcionado eu dividia o link mas precisei rodar outro script ele limpou o seu... e agora nao consigo mais rodar o seu e funcionar, simplesmente ninguem trafega nada, para...

[33] Comentário enviado por neon_ em 29/07/2009 - 15:53h

mas vc colocou apenas o ip 192.168.0.1/24 e toda a rede acessou? acho meio difícil.

se fosse 192.168.0.0/24 ai sim talvez.

mas se tiver colocado na mao ja os 254 ips na "Unha" e nao quiser fazer de novo, nada que um cut -d/ -f1 nao resolva.

sobre o bloqueio, tem q veerificar com calma o que pode estar travando o acesso, o nosso amigo xloko ainda nao conseguiu colocar ele para rodar.

mas eu tenho aqui rodando e tem várias pessoas daqui do VOL que ja conseguiu colocar pra rodar tb.

o problema é que geralmente os cenários são diferentes.

ai vc teria que estudar e entender o funcionamento do script, do iptables, do iproute nessa história para poder funcionar.

mas tem q colocar ip por ip, nao apenas 192.168.0.0/24, senao o iproute vai ficar doido na hora dos rules (possivelmente).

falows.

[34] Comentário enviado por halleybr em 29/07/2009 - 16:21h

Entao amigo tava 192.168.0.0/23 e no outro link os ips da galera...

vou fazer na unha mesmo....

entao amigo eu rodo o script ele para geral.... ai eu reinicio ele volta.... mas somente a eth2 sobe a eth1 nao trafega.....

[35] Comentário enviado por riroxi em 03/08/2009 - 11:28h

Olá Neon.

Primeiramente parabens pelo artigo.

Consegui fazer tudo certinho aqui. Só que estou com um problema em um site hospedado em uma das maquinas da rede interna.

tentei de tudo já... o site roda na maquina com ip 192.168.5.3 na porta 8010

tentei essa regra:

iptables -t nat -A PREROUTING -p tcp -s 0/0 -d 189.20.45.199 --dport 8010 -j DNAT --to-destination 192.168.5.3
iptables -t nat -A POSTROUTING -o eth -p tcp -s 192.168.5.3 --sport 8010 -d 0/0 --dport 8010 -j SNAT --to 189.20.45.199

189.20.45.199 é o ip real ligado a eth3 onde os clientes de fora acessam o site.

Detalhe, se o acesso vier de fora, entra na boa... se eu tentar acessar da rede interna, não vai...

pode me ajudar?

Grato!

[36] Comentário enviado por jokerman em 05/11/2009 - 12:48h

Caro Wenderson,

parabéns pelo artigo. Pra mim funcionou tudo ok no CentOS 5.2, EXCETO....o squid!

Na verdade, pelos testes que eu fiz observei que todo o direcionamento que eu faço, vale para as estações, mas não para o proprio servidor.

Como teste fiz o seguinte:

Criei uma regra para a porta 23, para que o meu telnet para fora, saisse pelo LINK2:

100.100.1.100, ETH2

Se eu vou na estaçao de trabalho da rede e abro um putty, faço o telnet normal e vejo pelo "w" que realmente eu "vim" do ip ligado

na ETH2. Ate aí tudo bem.

Se eu tento fazer um telnet estando logado no proprio servidor, ele simplesmente trava.

Ora, como a origem do squid é o proprio servidor está acontecendo com ele o mesmo travamento.
A minha pergunta seria a seguinte: como criar regras no iptables para determinar a mudança de trafego não só para o que vem das estações de trabalho , mas também para o que vem do proprio servidor?

Agradecido.

[37] Comentário enviado por neon_ em 05/11/2009 - 16:27h

Boa tarde,

Seu problema deve estar na rota Default.

Seu linux tem que ter uma rota Default. Senão nao tem como o próprio linux (e o squid) saber por onde eles vão sair.

O proprio linux não pode estar na lista de ips.link1 ou ips.link2, pois ele sai pela rota default apenas.

Veja se não é isso.

Wenderson Souza

[38] Comentário enviado por jokerman em 09/11/2009 - 09:41h

Caro Wenderson,

obrigado pela resposta. Na verdade, o servidor tem a rota default apontando para o

LINK1 (eth1)

e estou tentando fazer com que todo o trafego de navegação saia pelo

LINK2 (eth2)

Ficou tudo funcionando sem squid, saindo pela porta 80. Se eu ativo o squid

pára tudo...

Provavelmente porque o squid fica tentando sair pelo link1 que é o gateway default, e

o iptables está setando o trafego da porta 80 para o LINK2.


Estou quebrando a cabeça há alguns dias, mas até agora nada...


At.,

[39] Comentário enviado por removido em 24/10/2010 - 21:33h

Estamos esperando o artigo sobre fail-over ;)

[40] Comentário enviado por viniciuspedra em 14/02/2011 - 10:47h

me parece ser mto bom o script... parabéns!
uso debian 6 e já testei vários aqui descritos no VOL porém nehum deles funcionou em dois links...
irei testar este nesta noite e informo aqui se deu tudo certo!

[41] Comentário enviado por zentsor em 07/03/2011 - 10:55h

muito bom esse seu artigo porem estou tendo o seguinte problema:

The following error was encountered while trying to retrieve the URL: www.google.com.br/">http://www.google.com.br/

Unable to determine IP address from host name "www.google.com.br"

The DNS server returned:

Timeout

This means that the cache was not able to resolve the hostname presented in the URL. Check if the address is correct.

Your cache administrator is webmaster.

e colocquei o dns do google no meu resolv.com 8.8.8.8, e tentei colocar esse dns no squid tbm, mas ainda assim da esse erro ao tentar acessar qualquer pagina, alguem pode me ajudar?

[42] Comentário enviado por pakitao em 04/05/2011 - 09:34h

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.

[43] Comentário enviado por joorlando3 em 12/09/2011 - 09:03h

Bom dia!

Tenho uma dúvida como posso montar redirecionamento de uma conexão externa que entra por um link usando uma porta específica. Utilizando apenas um link é facil, e tenho feito da seguinte maneira:

$ipt -A FORWARD -p tcp --dport 4432 -d 192.168.0.244 -j ACCEPT
$ipt -t nat -A PREROUTING -p tcp --dport 4432 -j DNAT --to 192.168.0.244

Agora com três placas a situação muda muda e não tenho idéia do que é necessário, se alguém puder me ajudar serei grato.


[44] Comentário enviado por neon_ em 13/09/2011 - 14:52h

zentsor,

desculpe pela demora, estava meio ausente do mundo linux, agora estou de FreeBSD, mas vamos lá:

se você colocou o dns no resolv.conf ou mesmo no squid e está tendo esse tipo de mensagem, então você não possui rota padrão no linux.

vi /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=srv.localhost
GATEWAY=coloque.aqui.o.ip.do.seu.gateway

Wenderson Souza

[45] Comentário enviado por neon_ em 13/09/2011 - 14:54h

pakitao,

neste caso já seria um fail-over, ai teria que criar algum script para ficar monitorando o link default, se ele cair rodar um script que muda o gateway padrão e roda um squid configurado (squid2.conf) para apenas o link 2. etc.


essa solução não cheguei a desenvolver.

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


Wenderson Souza

[46] Comentário enviado por neon_ em 13/09/2011 - 15:01h

joorlando3,

conforme lhe respondi por e-mail segue a solução:

suponhamos:

interno=eth0
link1=eth1
link2=eth2

# redirecionar a entrada pelo link 2 para a porta 4432
# entrada
$ipt -A INPUT -i $link1 -p tcp -d IP.PUBLICO.DO.LINK.1 --dport 4432 -j ACCEPT
$ipt -t nat -i $link1 -A PREROUTING -p tcp --dport 4432 -j DNAT --to 192.168.0.244
# forward
$ipt -A FORWARD -i $link1 -p tcp --dport 4432 -d 192.168.0.244 -j ACCEPT
$ipt -A FORWARD -i $link1 -p tcp --sport 4432 -s 192.168.0.244 -j ACCEPT
# saida
$ipt -t nat -o $link1 -A POSTROUTING -p tcp -s 192.168.0.244 --sport 4432 -j SNAT IP.PUBLICO.DO.LINK.1

Acho que seria isso.

Estou um tempo sem mexer em iptables. Se não der certo me avise.

Wenderson Souza

[47] Comentário enviado por joorlando3 em 27/10/2011 - 10:35h

Bom dia !

Wenderson Souza, muito obrigado por responder, pois o problema de redirecionamento foi resolvido com sucesso.

resolvi assim
iptables -t nat -I PREROUTING -i eth1 -p tcp --dport 4432 -j DNAT --to-dest 192.168.0.244
iptables -t nat -A POSTROUTING -p tcp -s 192.168.0.244 -sport 4432 -d 0/0 -j SNAT --to $link1


Muito obrigado
joorlando3

[48] Comentário enviado por joorlando3 em 02/02/2012 - 11:10h

Bom dia!

Seguindo esse script como poderia fazer para que determinado ip da rede tivesse apenas acesso a email (pop3 e smtp)?

[49] Comentário enviado por neon_ em 11/02/2012 - 12:17h

Bom dia joorlando3,

Sobre controlar o tráfego de certos IPS, você poderia criar uma terceira lista, especifica para o seu caso, chamada ips.email e fazer a liberação no script antes da regra de bloqueio.

Mas você precisará definir por qual link esses clientes com acesso a e-mail irão sair:

Exemplo 1: Clientes com acesso apenas a e-mail saindo pelo link1

# aqruivo com os ips
# vi /etc/ips.email
xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx


# INICIO - SCRIPT
# liberando acesso clientes com acesso apenas a e-mail
echo -n "Liberando acesso para clientes - acesso e-mail..."
# clientes email
for ip in `cat /etc/ips.email`
do

# liberação de FORWARD - DNS
$ipt -A FORWARD -p tcp -s $ip --dport 53 -j ACCEPT
$ipt -A FORWARD -p udp -s $ip --dport 53 -j ACCEPT


# liberação de FORWARD - EMAIL
$ipt -A FORWARD -p tcp -s $ip --dport 25 -j ACCEPT
$ipt -A FORWARD -p tcp -d $ip --sport 25 -j ACCEPT
$ipt -A FORWARD -p tcp -s $ip --dport 110 -j ACCEPT
$ipt -A FORWARD -p tcp -d $ip --sport 110 -j ACCEPT
# se tiver outra porta como POPs basta adicionar a linha com a porta especifica
# não esqueça de fazer a regra de entrada e a de saida, 2 regras por porta.

# 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

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

echo -n "."

done
## FIM

Basta criar o arquivo /etc/ips.email e colocar dentro deles os ips que vao ter acesso ao e-mail.

Não precisa adicionar os ips da lista email na lista ips.link1 ou ips.link2, pois no script acima ele automaticamente vai sair pelo link1, se quiser que saia pelo link 2 basta mudar na regra...
$ipt -t nat -A POSTROUTING -s $ip -d 0/0 -j SNAT --to $link1_ip_local
$link1_ip_local para $link2_ip_local

Acho que é isso.. como nao estou mais usando linux e sim freebsd nao tenho um laboratorio para testar aqui e mandar a solução 100% pronta e correta!.

Até mais,

Wenderson Souza

[50] Comentário enviado por joorlando3 em 29/02/2012 - 09:49h

Bom dia!

Wenderson Souza, sua dica funcionou perfeitamente, eu havia testado outras formas, mas sem sucesso, ao acrescentar a sua dica funcionou perfeitamente.

[51] Comentário enviado por elciofr em 15/04/2012 - 23:15h

Wenderson parabens pelo artigo.
Existe um modo na sua opiniáo de fazer a tarefa a seguir:
a partir da minha estacao que tem default gateway 10.27.4.10 quero que todo o acesso ao IP 200.189.102.145 seja feito pelo firewall 10.27.4.13. o que fazer no meu firewall 10.27.4.10 para que ele roteie este host para o ip 10.27.4.13?
adicionei uma rota estatica ao ip 10.27.4.10 mas o tracert nao funciona, ou seja, nao chega ate o 10.27.4.13.
Hoje acrescento rota local em todas as minhas estacoes mas nao acho isso muito pratico.
Grato pela ajuda

Elcio.

[52] Comentário enviado por neon_ em 19/04/2012 - 10:59h

Se 10.27.4.10 tiver acesso direto a 10.27.4.13 pode fazer com uma rota estática no 10.27.4.10 junto com um SNAT:

Adiciona um rota assim:

# route add 200.189.102.145 10.27.4.13

Isso torna o destino a 200.189.102.145 sempre por 10.27.4.13.

Mas não se esqueça que tem que fazer um SNAT (Source NAT em 10.27.4.10)

# iptables -t nat -A POSTROUTING -d 200.189.102.145 -j SNAT --to 10.27.4.10

Assim todo pacote com destino a 200.189.102.145 será nateado como "origem" do ip 10.27.4.10 e onde você está determinando "neste host do ip 10.27.4.10" que a rota será por 10.27.4.13

E em 10.27.4.13 não se esqueça de fazer o NAT geral onde 10.27.4.10 esteja abrangido.

Algo como ...

iptables -t nat -A POSTROUTING -s 10.27.4.0/24 -o interfacedesaidadainternet -j MASQUERADE

Acho que seria isso.

Wenderson Souza

[53] Comentário enviado por ttcosta em 07/10/2012 - 13:18h

Inicialmente gostaria de parabenizar o Wenderson Souza pelo artigo de excelente qualidade.

No intuito de melhorar sempre o VOL, existe um ajuste no script para pleno funcionamento ( pelo menos comigo só funcionou assim)

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

O numero das rotas tem que ser diferente na tabela senao o funcionamento fica prejudicado.

Outro problema encontrado foi que o presente artigo só funciona no CENTOS, ja no debian nao consegui faze-lo funcionar ... ele somente permite conexao pelo primeiro link. Alguem teria uma sugestao ?

[54] Comentário enviado por neon_ em 08/10/2012 - 08:48h

Obrigado pela correção ttcosta, vou tentar entrar em contato com a equipe do VOL e fazer a modificação no artigo.

[55] Comentário enviado por sabha em 04/12/2012 - 23:00h

Pessoal,

Faz tempo que não posto nada! Falta tempo!

Faz algum tempo eu pesquisei e montei (baseado em alguns scripts) um script similar a esse, porém ele monitora 03 links externos e se baseia, para marcar os pacotes, a rede de origem do pacote.

Hoje eu precisei mudar o meu script e usei esse do wenderson como base, tem algumas pequenas alterações, e nao controlo o squid por ele. Mas igualmente ao outro que criei controla 03 links externos e esta escrito para debian.

Parabéns wenderson, muito bom seu script!

Se alguém ainda estiver precisam do script para debian, me de um alo!


[56] Comentário enviado por lafiera em 09/11/2013 - 23:03h

Pessoal, blz? Primeiramente parabens pelo artigo Wenderson.
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

[57] Comentário enviado por lafiera em 11/11/2013 - 18:16h

Pessoal, depois de muito bater cabeça resolvi os problemas que eu tinha:

1- Estava com problema para pingar no meu gateway:
Resolvi adicionando as seguintes regras no script:
# coloque aqui para permitir acesso aos seus serviços internos
$ipt -A INPUT -i $lan_iface -p icmp --icmp-type 0 -j ACCEPT
$ipt -A INPUT -i $lan_iface -p icmp --icmp-type 8 -j ACCEPT

2-Quando eu ativava o squid as maquinas nao navegavam..para isso tive que ativar duas rotas default:
[root@localhost ~]# route add default gw 100.100.100.1
[root@localhost ~]# route add default gw 200.200.200.1
Com as duas rotas estaticas funcionou perfeitamente os acessos com squid nos dois links; So tenho uma duvida..porque no artigo é informado que tem que tirar as rotas..pq quem ira controla-las sera o iproute2..mas axo que quando ativa o squid tem que ativa-las..sem o squid realmente nao é necessario;

3- O proprio firewall nao acessava a internet:
Foi resolvido ao adiconar as rotas estaticas;

[58] Comentário enviado por rengaf1 em 15/03/2014 - 10:03h

cara muito bem explicado, mais o que preciso no momento é redundancia de links, podes me ajudar? Uso CentOS.

[59] Comentário enviado por schüler em 22/05/2015 - 13:39h

Olá... possuo no meu servidor 3 links (3 interfaces) eth0 = link1, eth1=link2 e eth2=lan... Quero fazer com que determinados sites sejam redirecionados para o link1(eth0) e o resto para o link2(eth1)...
ex, se um usuário da minha rede interna acessar o site www.vivaolinux.com.br o firewall vai jogar o acesso para o link1(eth0), mas se ele acessar o www.google.com.br o firewall vai jogar o acesso para o link2(eth1)...
você poderia me ajudar????

[60] Comentário enviado por JULLYANNAGOMES em 22/04/2016 - 16:10h

VENDO LINK DEDICADO PARA TODO O BRASIL 84 -9 8782-8564


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts