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!
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
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.
### 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
[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?
[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?
[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.
[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.
# 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%.
[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:~#
[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
[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
[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!!!
[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?
[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?
[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
## 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
# 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
# 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
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
----------------------------------------------------------------------------------------
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?
[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...
[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...
[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...
[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?
[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!
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?
[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:
[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.
[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
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!.
[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
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.
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 ?
[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;
## 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
$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
# 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
# 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
[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;
[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????