Roteamento de entrada/saída com iproute e iptables

Na internet tem muita documentação relacionada com o balanceamento de saída com 2 ou mais links de internet, mas nenhuma documentação relacionada quando você quer ter seus servidores ( email, web, terminal service etc) respondendo para a internet por todos seus links disponíveis.

[ Hits: 44.087 ]

Por: Tiago Henrique Pires em 15/11/2008 | Blog: http://tiagonux.blogspot.com


Script de roteamento



Abaixo está o script que usa iptables e iproute, qualquer problema encontrado com ele por favor relatem para correção. Estou trabalhando em uma outra versão desse script para ficar transparente até a navegação da rede interna caso o link principal de comunicação dela com a internet sai do ar.

Nesse cenário tenho 3 servidores:
  • 192.168.1.2 - servidor web - porta 80
  • 192.168.1.3 - servidor de email - portas 25 e 110
  • 192.168.1.4 - servidor de terminal service - porta 3389

#!/bin/bash

# Por tiagonux
# Script que faz um servidor GNU/Linux com mais de um link de internet
# rotear os pacotes destinados a sua DMZ. Sua DMZ ficará respondendo
# a partir da internet pela quantidade de links que tiver.
# Envolve os softwares iproute e iptables
# O script não cobre regras de mascaramento de pacotes e nem redirecionamento
# de portas.
# Esse script pode ser chamado pelo script de firewall atual do seu sistema, sendo
# que as regras da tabela mangle são resetadas.


# Variáveis
#
# Gateways de cada link

LINK1_GW="200.200.xx.1"
LINK2_GW="189.40.xx.1"
#
# Interface de rede ligada aos links e interface ligada a DMZ e rede interna
#

LINK_WAN1="eth1"
LINK_INT1="eth0"
#
# IPs de cada Link. Lembrando que se estiver usando apenas uma placa de rede conectada
# em um switch que tem os 2 links (ou mais) deve-se configurar os IPs válidos
# virtualmente na mesma placa de rede.
#

LINK1_IP="200.200.xx.2"
LINK2_IP="189.40.xx.2"
#
IPTABLES=`which iptables`
#
# Você pode chamar esse script de dentro do seu script de firewall atual, mas fazendo
# as devidas alterações de redirecionamento de portas.
# Regras de marcação de pacotes com iptables e seu módulo CONNMARK
#
# Reseto tudo da tabela Mangle

$IPTABLES -t mangle -F
$IPTABLES -t mangle -X
$IPTABLES -t mangle -Z
#
# Você deve ter um redirecionamento de portas para cada pacote entrando em cada link
# para seu servidor específico.
# Aqui marco o pacote que entra pelo link1 com o mark 1 com destino ao IP do LINK1_IP
# e a porta 25 .

$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -p tcp --dport 25 -d $LINK1_IP -m conntrack --ctorigdst $LINK1_IP -j MARK --set-mark 1 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link2 com mark 2 com destino ao IP do LINK2_IP
# e a porta 25

$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN2 -p tcp --dport 25 -d $LINK2_IP -m conntrack --ctorigdst $LINK2_IP -j MARK --set-mark 2 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link1 com mark 3 com destino ao IP do LINK1_IP
# e a porta 110 .

$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -p tcp --dport 110 -d $LINK1_IP -m conntrack --ctorigdst $LINK1_IP -j MARK --set-mark 3 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link2 com mark 4 com destino ao IP do LINK2_IP
# e a porta 110

$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -p tcp --dport 110 -d $LINK2_IP -m conntrack --ctorigdst $LINK2_IP -j MARK --set-mark 4 -m mark --mark
#
# Aqui marco o pacote que entrar pelo link1 com mark 5 com destino ao IP do LINK1_IP
# e a porta 80

$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -p tcp --dport 80 -d $LINK1_IP -m conntrack --ctorigdst $LINK1_IP -j MARK --set-mark 5 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link2 com mark 6 com destino ao IP do LINK2_IP
# e a porta 80

$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -p tcp --dport 80 -d $LINK2_IP -m conntrack --ctorigdst $LINK2_IP -j MARK --set-mark 6 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link1 com mark 7 com destino ao IP do LINK1_IP
# e a porta 3389

$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -p tcp --dport 3389 -d $LINK1_IP -m conntrack --ctorigdst $LINK1_IP -j MARK --set-mark 7 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link2 com mark 8 com destino ao IP do LINK2_IP
# e a porta 3389

$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -p tcp --dport 3389 -d $LINK2_IP -m conntrack --ctorigdst $LINK2_IP -j MARK --set-mark 8 -m mark --mark 0
#

# Aqui é onde acontece a mágica. Quando simplesmente marcamos um pacote que entra
# por um link de internet ele perde sua marca quando passa pela tabela NAT. É nesse
# ponto que todo mundo fica perdido, pois em todos os fóruns que li a dúvida maior é
# essa, o porque do pacote não retorna pelo link que ele entrou se eu marquei ele na
# sua entrada.
#
# Acontece que ao passar de uma tabela (mangle) para outra (nat) ele perde a marca.
# Descobri isso lendo a documentação do iptables e com ajuda do tcpdump concluí isso.
# Mas sempre tem uma maneira de resolver esse problema.
# Simplesmente vamos dizer que queremos que seja lembrado a marca anterior do
# pacote.
# Como pode ser visto na regra abaixo, na chain PREROUTING da mangle salvo a marca
# do pacote jogando para o ALVO CONNMARK
#

$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -j CONNMARK --save-mark
#
# E quando o pacote retorna entrando pela interface interna é lembrado sua marca
# anterior.
# Isso tudo ocorre pela --save-mark da regra anterior e --restore-mark da regra abaixo.
#

$IPTABLES -t mangle -A PREROUTING -i $LINK_INT1 -p tcp -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark
#
# Regras de roteamento com iproute
#
# Deletando as regras atuais de roteamento
#

ip route del default
ip rule del prio 10 table main
ip rule del prio 19 fwmark 1 from 192.168.1.3 table link1
ip rule del prio 20 fwmark 2 from 192.168.1.3 table link2
ip rule del prio 21 fwmark 3 from 192.168.1.3 table link1
ip rule del prio 22 fwmark 4 from 192.168.1.3 table link2
ip rule del prio 23 fwmark 5 from 192.168.1.2 table link1
ip rule del prio 24 fwmark 6 from 192.168.1.2 table link2
ip rule del prio 25 fwmark 7 from 192.168.1.4 table link1
ip rule del prio 26 fwmark 8 from 192.168.1.4 table link2
ip rule add prio 30 table link1
#
# Configurando se necessário o /etc/iproute2/rt_tables com as tabelas de cada link.
#

if ! cat /etc/iproute2/rt_tables | grep -q '^250'
then
echo "250 link1" >> /etc/iproute2/rt_tables
fi
#
if ! cat /etc/iproute2/rt_tables | grep -q '^251'
then
echo "251 link2" >> /etc/iproute2/rt_tables
fi
#
# Flush nas tabelas

ip route flush table link1
ip route flush table link2
#
# Falo que prioridade a tabela main tem.
ip rule add prio 10 table main
#
# Falo quem é o gateway da tabela link1
ip route add default proto static via $LINK1_GW src $LINK1_IP table link1
#
# Falo quem é o gateway da tabela link2
ip route add default proto static via $LINK2_GW src $LINK1_IP table link2
#
# Crio a regra de roteamento para cada tabela de acordo com a marcação do pacote
#
# pacotes smtp que entraram pela tabela link1
ip rule add fwmark 1 from 192.168.1.3 table link1 prio 19
#
# pacotes smtp que entraram pela tabela link2
ip rule add fwmark 2 from 192.168.1.3 table link2 prio 20
#
# pacotes pop3 que entraram pela tabela link1
ip rule add fwmark 3 from 192.168.1.3 table link1 prio 21
#
# pacotes pop3 que entraram pela tabela link2
ip rule add fwmark 4 from 192.168.1.3 table link2 prio 22
#
# pacotes web que entraram pela tabela link1
ip rule add fwmark 5 from 192.168.1.2 table link1 prio 23
#
# pacotes web que entraram pela tabela link2
ip rule add fwmark 6 from 192.168.1.2 table link2 prio 24
#
# pacotes rdp que entraram pela tabela link1
ip rule add fwmark 7 from 192.168.1.4 table link1 prio 25
#
# pacotes rdp que entraram pela tabela link2
ip rule add fwmark 8 from 192.168.1.4 table link2 prio 26
#
# Caso você queira que o resto da rede interna se comunique com a internet pela
# tabela link1
ip rule add prio 30 table link1
#
# Atualizando o cache de roteamento
ip route flush cache

Espero ajudar alguém com esse artigo, até mais.

Tiagonux

Página anterior    

Páginas do artigo
   1. Introdução
   2. Script de roteamento
Outros artigos deste autor

Montando um servidor X com o Linux

Shared Config com Apache a la brasileira

Firewall/Proxy (solução completa)

Leitura recomendada

Bloqueando programas P2P com iptables

Manual do IPtables - Comentários e sugestões de regras

Criando cluster com o PFSense

Um pouco sobre IPtables

Firewall invisível com Proxy ARP

  
Comentários
[1] Comentário enviado por renato.leite em 15/11/2008 - 20:11h

Otimo artigo, ta muito bom mesmo =]

[2] Comentário enviado por cassimirinho em 15/11/2008 - 20:31h

Belo trabalho!

Sensacional!

[3] Comentário enviado por downloadd em 17/11/2008 - 09:39h

Dúvidas...
1. Como é possível fazer o DNS reverso funcionar com dois links?

2. Neste script você mostra como fazer a priorização de certas portas e diz por qual link tal porta irá sair, mas pelo que vi, esta faltando a divisão de carga entre os links.
Como ficaria por exemplo se caso eu quisesse somar os dois links WAN com a marcação de pacotes?

3. Fazendo a marcação de pacotes em um link muito requisitado, irá ocupar uma maior taxa de processamento? Lentidão?

4. Quem tem mais prioridade, a regra 0 ou a 255?
Parabéns pelo artigo, esta bem explicado.

[4] Comentário enviado por danilotm em 17/11/2008 - 10:31h

Olá Tiago, tinha um sistema parecido, porém tive alguns problemas para efetuar este tipo de roteamento.
Acredito que esse artigo me auxiliará bastante a reatar esse sistema com dois links de Internet.

Parabéns e abraços.

Danilo

[5] Comentário enviado por tiagonux em 17/11/2008 - 15:00h

Olá a todos

Em resposta das dúvidas de downloadd :

1 - O DNS reverso será configurado nos servidores de DNS para cada IP. Você pode ter configurar normalmente em seu servidor caso a operadora de telecom tenha passado isso para você. Ou pedir para as operadoras de Telecom configurar o DNS reverso para cada IP.

2 - O Script não faz priorização de pacotes, o objetivo dele é rotear os pacotes na entrada pelos links. Ele marca o pacote quando ele entrar por um determinado link e assim o pacote voltar pelo link que entrou.

3 - Você pode até fazer um load balance, mas ai ele se encaixa na saída. No script é feito um roteamento mais avançado na entrada do pacote. Você poderá até usar o cbq para criar regras de controle de banda por protocolo ( smtp,pop3) para diminuir a carga de um link.

4 - As regras de roteamento são lidas apartir da prioridade 0. Caso um pacote se encaixe em uma regra de roteamento ele é processado caso não ele vai até o final e poderá ser processado pela ultima regra.

Obrigado a todos que gostaram do artigo, qualquer dúvida estou a disposição.

[6] Comentário enviado por clovesjr em 18/11/2008 - 08:50h

Muito bom....

Eu já uso o balanceamento de saída para dois links na empresa onde trabalho mas sempre tive este problema para o tráfego de entrada... Ŕealmente é como vc disse, tem muita documentação dizendo como fazer o balanceamento de saída mas não como tratar corretamente o tráfego de entrada...

Seu artigo me ajudou muito...

Parabéns...

[]s

Cloves Jr

[7] Comentário enviado por alvaromo em 18/11/2008 - 09:54h

Rapaz, achei show este teu artigo. Creio que quem já passou por situação semelhante e não conseguiu resolver, sabe dar real valor ao teu artigo.

Muito show!!!

Alvaro Mendes

[8] Comentário enviado por sebastianosilva em 18/11/2008 - 23:36h

caro amigo estou com um modem Gi-Link WL-2404BRG AP-Plus e nao estou conserguido configura ele come e que eu fasso ,para internete vida

[9] Comentário enviado por bluesball em 19/11/2008 - 10:31h

Gostei muito... estou adaptando para implementar aqui na empresa...

qualquer dúvida ... sei onde t encontrar...heheh

[]' s

[10] Comentário enviado por danusio em 15/05/2009 - 19:14h

Gostaria de Saber onde foi declarado a variavel LINK_WAN2?

[11] Comentário enviado por tiagonux em 19/05/2009 - 21:27h


Hahhaha vendo pela figura eu tenho os 2 links em um switch. Assim não é necessário inserir uma outra placa de rede.

[12] Comentário enviado por terranova em 29/06/2009 - 11:02h

Alguém já conseguiu rotear conexões da porta 80, porta 25 para outros servidores usando load bance ?

[13] Comentário enviado por gi em 13/07/2009 - 10:17h

olá..
preciso de ajuda, para configurar a seguinte regra no meu firewall iptables..
é o seguinte tem um portal dentro da minha rede interna que esta funcionando neste endereço .72.16.1.21 na porta 8080, e quero que ele redirecione para a máquina 182.16.1.2.
quando eu clico no link da pagina onde ele tem que fucionar diz o seguinte este endereço 200.101.122.43:8090 não pode conectar.
como eu faço para poder funcionar na rede interna quando eu clicar no link?
eu fiz a seguinte regra e não funcionou..
iptables -t nat -A PREROUTING -p tcp -s 172.16.1.21 -sport 8080 REDRECT 182.16.1.2:8090
ou
iptables -t nat -A PREROUTING -p tcp -i eth1 -d 200.101.43 -p tcp --dport 8090 -j DNAT --to-destination 182.16.1.2:8090
não sei ja tentei um monte de regras e nenhuma funcionou, será que pode me ajudar.

200.101.122.43- endereço do moldem
172.....- endereço da rede interna
192....-endereço da rede

obrigada pela atenção!
gisele.


[14] Comentário enviado por suportlinux em 17/09/2009 - 01:42h

Caro

Amigo

Eu estou configurando 2 links em uma maquina firewall ..

e estou usando o seu artigo ..

mas por que não sei ..

não esta funcionando com os dois links só com 1

pode me ajudar


[15] Comentário enviado por tiagonux em 17/09/2009 - 08:11h

Como está o ambiente seu?? Scritp ?

Lembrando que não é só usar o script de roteamento as regras de firewall também devem estar preparadas para o ambiente.

[16] Comentário enviado por suportlinux em 17/09/2009 - 18:04h

Ok

Ai vai o meu script de firewall

#!/bin/bash
IPTABLES=`which iptables`
# -----------------------
PME="eth0"
GVT="eth1"
VPN="tun0"
# -----------------------
VLAN_SOFT=10.1.x.0/24
VLAN_TELEFONIA=10.10.2.0/26
# -----------------------
PME_GW="201.x.x.xx"
GVT_GW="200.xx.xx.xx"
# -----------------------
LINK_PME="eth0"
LINK_GVT="eth1"
REDE_INT="eth3"
# -----------------------
IP_PME="201.x.x.h"
IP_GVT="200.x.x.y"
# -----------------------
MAIL_PORT=22,25,80,110
WWW_PORT=80,81,82,443,1533
WWW_PORT0=8008,8080,8081,8082
# -----------------------
case $1 in
start)
echo "|=====================================================|"
echo "|:Script de Firewall - IPTABLES |"
echo "|:Criado por: Eduardo Gomes |"
echo "|:Técnico em Informática |"
echo "|:suportlinux@yahoo.com.br |"
echo "|:Uso: /etc/init.d/firewall |"
echo "|:$HOSTNAME:.............................ok:|"
echo "|=====================================================|"
echo "|:LIMPANDO AS REGRAS DO FIREWALL:..................ok:|"
$IPTABLES -F
$IPTABLES -Z
$IPTABLES -X
$IPTABLES -F -t nat
$IPTABLES -X -t nat
$IPTABLES -F -t mangle
$IPTABLES -X -t mangle
$IPTABLES -Z -t mangle
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "|:Create Reject-and-log-SSH-Bruteforce:............ok:|"
$IPTABLES -N REJECT-SSH
$IPTABLES -A REJECT-SSH -j DROP -m recent --rcheck --name SSH --seconds 60 --hitcount 10
$IPTABLES -A REJECT-SSH -j LOG --log-prefix SSH-Bruteforce:
$IPTABLES -A REJECT-SSH -j REJECT -p tcp --reject-with tcp-reset
$IPTABLES -A REJECT-SSH -j REJECT
echo "|:Blacklist SSH:...................................ok:|"
$IPTABLES -N ssh
$IPTABLES -N blacklist
$IPTABLES -A blacklist -m recent --name blacklist --set
$IPTABLES -A blacklist -j LOG --log-prefix 'SSH REJECTED: '
$IPTABLES -A blacklist -j REJECT
# ------------------------------------------------------------
# echo "|:Inclua aqui teus ips para não sofrer o bloqueio:.ok:|"
# $IPTABLES -A ssh -i eth1 -s 10.10.10.13/32 -p tcp --dport 22 -j ACCEPT
# ------------------------------------------------------------
$IPTABLES -A ssh -m recent --set --name couting1
$IPTABLES -A ssh -m recent --update --name couting1 --seconds 20 --hitcount 3 -j blacklist
$IPTABLES -A ssh -j ACCEPT
echo "|:Kill SSH Brute-force attacks:....................ok:|"
$IPTABLES -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --seconds 60 --hitcount 4 -j REJECT-SSH
$IPTABLES -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
echo "|:Liberar as portas principais do servidor:........ok:|"
$IPTABLES -A INPUT -p tcp --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 25 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 53 -j ACCEPT
$IPTABLES -A INPUT -p udp --dport 53 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 80 -j ACCEPT
$IPTABLES -A INPUT -p udp --dport 1571 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 1723 -j ACCEPT
$IPTABLES -A INPUT -p udp --dport 5060 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 9998 -j ACCEPT
$IPTABLES -A INPUT -p udp --dport 10000:20000 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 10024 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 10025 -j ACCEPT
echo "|:REGRAS DE INPUT:.................................ok:|"
$IPTABLES -A INPUT -p icmp -s 10.10.1.0/27 -d 0/0 -j ACCEPT
$IPTABLES -A INPUT -p icmp -s 10.10.2.0/26 -d 0/0 -j ACCEPT
$IPTABLES -A INPUT -p icmp -s 10.10.3.0/25 -d 0/0 -j ACCEPT
$IPTABLES -A INPUT -p icmp -s 10.10.7.0/25 -d 0/0 -j ACCEPT
$IPTABLES -A INPUT -p icmp -s 10.10.10.0/24 -d 0/0 -j ACCEPT
$IPTABLES -A INPUT -p icmp -s 10.20.20.0/24 -d 0/0 -j ACCEPT
$IPTABLES -A INPUT -p tcp --syn -s 10.10.1.0/27 --dport 3128 -j ACCEPT
$IPTABLES -A INPUT -p tcp --syn -s 10.10.2.0/26 --dport 3128 -j ACCEPT
$IPTABLES -A INPUT -p icmp -j DROP
$IPTABLES -A INPUT -j LOG --log-prefix "INPUT Barrado: "
$IPTABLES -A INPUT -j REJECT
$IPTABLES -P INPUT DROP
echo "|:REGRAS DE PREROUTING E REDIRECIONAMENTO:.........ok:|"
echo "|:..........************* QoS *************........ok:|"
$IPTABLES -t mangle -A POSTROUTING -p udp --sport 1571 -j TOS --set-tos 16
$IPTABLES -t mangle -A POSTROUTING -p udp --sport 5060 -j TOS --set-tos 16
$IPTABLES -t mangle -A POSTROUTING -p udp --sport 5061 -j TOS --set-tos 16
$IPTABLES -t mangle -A POSTROUTING -p udp --sport 10000:20000 -j TOS --set-tos 16
$IPTABLES -t mangle -A PREROUTING -p udp --dport 1571 -j TOS --set-tos 16
$IPTABLES -t mangle -A PREROUTING -p udp --dport 5060 -j TOS --set-tos 16
$IPTABLES -t mangle -A PREROUTING -p udp --dport 5061 -j TOS --set-tos 16
$IPTABLES -t mangle -A PREROUTING -p udp --dport 10000:20000 -j TOS --set-tos 16
# echo "|:..........************* HTB *************........ok:|"
# $IPTABLES -t mangle -A POSTROUTING -p udp --sport 10000:20000 -j MARK --set-mark 0x10
# $IPTABLES -t mangle -A POSTROUTING -p udp --sport 5060 -j MARK --set-mark 0x10
# $IPTABLES -t mangle -A PREROUTING -p udp --dport 10000:20000 -j MARK --set-mark 0x10
# $IPTABLES -t mangle -A PREROUTING -p udp --dport 5060 -j MARK --set-mark 0x10
#$IPTABLES -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 10.10.2.4
#$IPTABLES -t nat -A PREROUTING -p tcp --dport 80 -i eth1 -j DNAT --to 10.10.2.4
# $IPTABLES -t nat -A PREROUTING -p udp --dport 5060:5080 -i eth0 -j DNAT --to 10.10.2.4
# $IPTABLES -t nat -A PREROUTING -p udp --dport 5060:5080 -i eth1 -j DNAT --to 10.10.2.4
# $IPTABLES -t nat -A PREROUTING -p udp --dport 10000:20000 -i eth0 -j DNAT --to 10.10.2.4
# $IPTABLES -t nat -A PREROUTING -p udp --dport 10000:20000 -i eth1 -j DNAT --to 10.10.2.4
# echo "|:Proxy transparente para toda as redes:...........ok:|"
# $IPTABLES -A PREROUTING -t nat -p tcp -s $TELEFONIA --dport 80 -j REDIRECT --to-port 3128
# $IPTABLES -A PREROUTING -t nat -p tcp -s $SOFT --dport 80 -j REDIRECT --to-port 3128
echo "|:Marcar pacotes para usar o Link 1:...............ok:|"
$IPTABLES -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -d $IP_PME -m conntrack --ctorigdst $IP_PME -j MARK --set-mark 1 -m mark --mark 0
echo "|:Marcar pacotes para usar o Link 2:...............ok:|"
$IPTABLES -t mangle -A PREROUTING -i eth1 -p tcp --dport 80 -d $IP_GVT -m conntrack --ctorigdst $IP_GVT -j MARK --set-mark 2 -m mark --mark 0
$IPTABLES -t mangle -A PREROUTING -i eth0 -j CONNMARK --save-mark
$IPTABLES -t mangle -A PREROUTING -i eth1 -j CONNMARK --save-mark
$IPTABLES -t mangle -A PREROUTING -i eth3 -p tcp -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark
echo "|:................................:...........ok:|"
# echo "|:Proxy transparente para toda as redes:...........ok:|"
# ip route del default
# echo "|:................................:...........ok:|"
# ip rule del prio 10 table main
# ip rule del prio 19 fwmark 1 from 192.168.1.3 table link1
# ip rule del prio 20 fwmark 2 from 192.168.1.3 table link2
# ip rule del prio 21 fwmark 3 from 192.168.1.3 table link1
# ip rule del prio 22 fwmark 4 from 192.168.1.3 table link2
# ip rule del prio 23 fwmark 5 from 192.168.1.2 table link1
# ip rule del prio 24 fwmark 6 from 192.168.1.2 table link2
# ip rule del prio 25 fwmark 7 from 192.168.1.4 table link1
# ip rule del prio 26 fwmark 8 from 192.168.1.4 table link2
ip rule add prio 30 table link1
# echo "|:Configurando as tabelas de cada Link:............ok:|"
if ! cat /etc/iproute2/rt_tables | grep -q '^250'
then
echo "250 link1" >> /etc/iproute2/rt_tables
fi
#
if ! cat /etc/iproute2/rt_tables | grep -q '^251'
then
echo "251 link2" >> /etc/iproute2/rt_tables
fi
echo "|:Flush nas tabelas:...............................ok:|"
ip route flush table link1
ip route flush table link2
echo "|:Falo que prioridade a tabela main tem:...........ok:|"
# ip rule add prio 10 table main
echo "|:Falo quem é o gateway da tabela link1:...........ok:|"
ip route add default proto static via $PME_GW src $IP_PME table link1
echo "|:Falo quem é o gateway da tabela link2:...........ok:|"
ip route add default proto static via $GVT_GW src $IP_GVT table link2
# Crio a regra de roteamento para cada tabela de acordo com a marcação do pacote
echo "|:Pacotes http que entraram pela tabela link1:.....ok:|"
ip rule add fwmark 1 from 10.10.2.4 table link1 prio 19
echo "|:Pacotes http que entraram pela tabela link2:.....ok:|"
ip rule add fwmark 2 from 10.10.2.4 table link2 prio 20
# pacotes pop3 que entraram pela tabela link1
#ip rule add fwmark 3 from 192.168.1.3 table link1 prio 21
#ip rule add prio 30 table link1

ip route flush cache

echo "|:ATIVA O MASCARAMENTO DE SAÍDA:...................ok:|"
$IPTABLES -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$IPTABLES -t nat -A POSTROUTING -o eth1 -j MASQUERADE
echo "|:ATIVAR O REDIRECIONAMENTO NO ARQUIVO IP_FORWARD:.ok:|"
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo "|:REGRAS DE FORWARD:...............................ok:|"
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP
$IPTABLES -A FORWARD -m state --state INVALID -j DROP
echo "|:IPS COM PRIVILEGIOS ESPECIAIS:...................ok:|"
$IPTABLES -A FORWARD -s 10.10.2.4/32 -j ACCEPT
$IPTABLES -A FORWARD -s 10.10.2.5/32 -j ACCEPT
echo "|:Liberar portas de saída:.........................ok:|"
$IPTABLES -A FORWARD -p tcp --dport 21 -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 21 --sport 1024:65535 -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 22 -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 22 --sport 1024:65535 -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 25 -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 25 --sport 1024:65535 -j ACCEPT
$IPTABLES -A FORWARD -p udp --dport 53 -j ACCEPT
$IPTABLES -A FORWARD -p udp --dport 53 --sport 1024:65535 -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 80 -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 80 --sport 1024:65535 -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 443 -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 443 --sport 1024:65535 -j ACCEPT
$IPTABLES -A FORWARD -p udp --dport 5060 -j ACCEPT
$IPTABLES -A FORWARD -p udp --dport 5060 --sport 1024:65535 -j ACCEPT
#$IPTABLES -A FORWARD -j LOG --log-prefix "FORWARD Barrado: "
#$IPTABLES -A FORWARD -j REJECT
$IPTABLES -P FORWARD ACCEPT
echo "|:REGRAS DE OUTPUT:................................ok:|"
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "|:..........************* QoS *************........ok:|"
$IPTABLES -t mangle -A OUTPUT -p udp --dport 1571 -j TOS --set-tos 16
$IPTABLES -t mangle -A OUTPUT -p udp --dport 5060 -j TOS --set-tos 16
$IPTABLES -t mangle -A OUTPUT -p udp --dport 5061 -j TOS --set-tos 16
$IPTABLES -t mangle -A OUTPUT -p udp --dport 10000:20000 -j TOS --set-tos 16
$IPTABLES -t mangle -A OUTPUT -p udp --dport 1571 -j TOS --set-tos 16
$IPTABLES -t mangle -A OUTPUT -p udp --dport 5060 -j TOS --set-tos 16
$IPTABLES -t mangle -A OUTPUT -p udp --dport 5061 -j TOS --set-tos 16
$IPTABLES -t mangle -A OUTPUT -p udp --dport 10000:20000 -j TOS --set-tos 16
$IPTABLES -P OUTPUT ACCEPT
;;
stop)
$IPTABLES -F
$IPTABLES -Z
$IPTABLES -X
$IPTABLES -F -t nat
$IPTABLES -X -t nat
$IPTABLES -F -t mangle
$IPTABLES -X -t mangle
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
;;
stats)
$IPTABLES -nL
;;
restart)
$0 stop
$0 start
;;
nat)
$IPTABLES -L -v -t nat -n
;;
mangle)
$IPTABLES -t mangle -L
;;
*)
echo "Usage: $0 [start|stop|stats|restart|nat|mangle]"
;;
esac

[17] Comentário enviado por suportlinux em 18/09/2009 - 18:57h

Oi

Tiago

Você pode me ....
ajudar........


[18] Comentário enviado por tiagonux em 18/09/2009 - 22:04h

E ai cara,

seguinte as suas regras ofuscaram minha visão rsrsrrss, brincadeira

veja se isso lhe ajuda http://tiagonux.blogspot.com/2008/12/iproute-avanado.html

como cada um tem suas próprias regras de firewall fica dificil te falar sem eu pode executar suas regras em um ambiente com 2 links.

Tente ver o link e de um retorno....

[19] Comentário enviado por suportlinux em 21/09/2009 - 10:35h

Bom
Dia

Tiago

Ainda estou com problemas.....

Sera que é pedir d+ um simples script....

só quero poder se conectar com o porta 80 e 22 em ambos os ips....

o meu E-mail esilva@soft.com.br, suportlinux@yahoo.com.br
Fone 21 3527-0293 21 8112-3463

[20] Comentário enviado por emelicio em 30/03/2010 - 19:04h

Boa Noite!!!

Problema Urgente com roteamento de Links.

Possuo na empresa, 3 Links,

Link 1 - 10.1.1.1
Link 2 - 10.1.1.2
Link 3 - 10.1.1.3

Ampos são ADSL empresarias, da OI, os modens estão em modo Router, os 3 modens estão conectados em um Switch de 8 portas 3com, e no servidor Linux Debian.

Informações do Servidor

eth0 - Links - 10.1.1.30
eth1 - Local - 192.168.1.1

Preciso que o link 10.1.1.1 seja usado normalmente para navegação, ja esta perfeito.


E tenho na rede um servidor 2003server com ip 192.168.1.253, que é utilizado para wts externo, gostaria de fazer com que este servidor usasse os links 2 e Link 3.

Eu iria distribuir para os usuários o IP válido do Link2 e Link3, os usuarios vão conectar em ambos os links, uma parte em um link e outra parte em outro link. Só que não sei como faço o redirecionamento no servidor, pois tenho uma placa de rede para os 3 links...

Alguem tem alguma solução? Sem que precise colocar mais 2 placas de rede?

Estou precisando disso urgente!

[21] Comentário enviado por danusio em 30/03/2010 - 21:01h

Amigo, tenho 3 links funcionando em meu servidor, uso o fedora core 7, e tenho apenas 2 placas de rede, segue meu script, talvez possa te ajudar, qualquer coisa posta aqui.

#!/bin/sh
## limpeza das regras iptables
iptables -F -t nat
iptables -Z -t nat
iptables -F -t mangle
iptables -Z -t mangle
iptables -X -t mangle
iptables -t mangle -F
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -X -t nat
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
## Configurado é uma unica placa de rede 3 ips diferentes ou seja 3 redes
## basta configurar nas maquinas dos usuarios os ips no qual queira que eles passe pelo link x
## link Default: 175.200.2.1
## link 2: 173.200.2.1
## link 3: 174.200.2.1

############# LINK2 ///// os ips abaixo do eth0 é o gateway do modem
ip route del default dev eth0 via 189.59.13.12 table link2
ip route add default dev eth0 via 189.59.13.12 table link2
#
iptables -t mangle -D PREROUTING -i eth1 -s 173.200.2.0/24 -p tcp -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth1 -s 173.200.2.0/24 -p tcp -j MARK --set-mark 1
ip rule del from 173.200.2.0/24 lookup link2
ip rule add from 173.200.2.0/24 lookup link2

############# LINK3 ///// os ips abaixo do eth0 é o gateway do modem

ip route del default dev eth0 via 187.58.56.111 table link3
ip route add default dev eth0 via 187.58.56.111 table link3
#
iptables -t mangle -D PREROUTING -i eth1 -s 174.200.2.0/24 -p tcp -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i eth1 -s 174.200.2.0/24 -p tcp -j MARK --set-mark 2
ip rule del from 174.200.2.0/24 lookup link3
ip rule add from 174.200.2.0/24 lookup link3

#
ip route flush cached



iptables -t nat -A POSTROUTING -s 175.200.2.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 173.200.2.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 174.200.2.0/24 -j MASQUERADE



iptables -t nat -A PREROUTING -s 175.200.2.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128




#deve adicionar na tabela do iproute as variaveis dos links
#uso o fedora 7 /etc/iproute2/rt_tables

#adicione as seguintes linhas vi /etc/iproute2/rt_tables


35 link2
36 link3



para testar vá em uma maquina do usuario, configure os ips em qual link que você queira que
ele pertença e vá o prompt de comando e digite tracert -d 8.8.8.8 e ele vai mostrar pelo qual link
sua navegação está saindo.

[22] Comentário enviado por mmoreira1979 em 03/10/2010 - 21:01h

Tiago,

Estou tentando adaptar seu script para minha necessidade e fiquei com duvida aqui nestas linhas:

# Falo quem é o gateway da tabela link2
ip route add default proto static via $LINK2_GW src $LINK1_IP table link2

É assim mesmo ou deveria ser:

# Falo quem é o gateway da tabela link2
ip route add default proto static via $LINK2_GW src $LINK2_IP table link2


Alterei o IP do link2: $LINK2_IP table link2

Grato pela atencao



[23] Comentário enviado por tiagonux em 04/10/2010 - 08:33h

Mmoreira

Está correta da sua forma,

ip route add default proto static via $LINK2_GW src $LINK2_IP table link2

Vlw

[24] Comentário enviado por mmoreira1979 em 24/06/2011 - 16:36h

tiago
Estou tentando usar seu script para fazer exatamente o que voce fez no exemplo, rotear algumas portas usando 2 links de internet. Fiz as devidas modificacoes no scritp mas nao esta funcionando. Um detalhe é que nao tenho nenhuma regra ainda de firewall definida, apenas o seu script esta sendo executado, formatei uma maquina, instalei o debian lenny e executo o script abaixo. repare que fiz poucas modificacoes, basicamente adicionei os meus enderecos ip e gateway:

#!/bin/bash

# Por tiagonux
# Script que faz um servidor GNU/Linux com mais de um link de internet
# rotear os pacotes destinados a sua DMZ. Sua DMZ ficaráespondendo
# a partir da internet pela quantidade de links que tiver.
# Envolve os softwares iproute e iptables
# O script nãcobre regras de mascaramento de pacotes e nem redirecionamento
# de portas.
# Esse script pode ser chamado pelo script de firewall atual do seu sistema, sendo
# que as regras da tabela mangle sãresetadas.


# Variáis
#
# Gateways de cada link
LINK1_GW="xxx.115.xxx.x1"
LINK2_GW="2xx.1x.xxx.x"
#
# Interface de rede ligada aos links e interface ligada a DMZ e rede interna
#
LINK_WAN1="eth1"
LINK_WAN2="eth2"
LINK_INT1="eth0"
#
# IPs de cada Link. Lembrando que se estiver usando apenas uma placa de rede conectada
# em um switch que tem os 2 links (ou mais) deve-se configurar os IPs vádos
# virtualmente na mesma placa de rede.
#
LINK1_IP="xx7.xxx.xx0.xx"
LINK2_IP="xx1.x7.xx0.x0"
#
IPTABLES=`which iptables`
#
# Vocêode chamar esse script de dentro do seu script de firewall atual, mas fazendo
# as devidas alteraçs de redirecionamento de portas.
# Regras de marcaç de pacotes com iptables e seu móo CONNMARK
#
# Reseto tudo da tabela Mangle
$IPTABLES -t mangle -F
$IPTABLES -t mangle -X
$IPTABLES -t mangle -Z
#
# Vocêeve ter um redirecionamento de portas para cada pacote entrando em cada link
# para seu servidor especíco.
# Aqui marco o pacote que entra pelo link1 com o mark 1 com destino ao IP do LINK1_IP
# e a porta 25 .
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -p tcp --dport 25 -d $LINK1_IP -m conntrack --ctorigdst $LINK1_IP -j MARK --set-mark 1 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link2 com mark 2 com destino ao IP do LINK2_IP
# e a porta 25
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN2 -p tcp --dport 25 -d $LINK2_IP -m conntrack --ctorigdst $LINK2_IP -j MARK --set-mark 2 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link1 com mark 3 com destino ao IP do LINK1_IP
# e a porta 110 .
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -p tcp --dport 110 -d $LINK1_IP -m conntrack --ctorigdst $LINK1_IP -j MARK --set-mark 3 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link2 com mark 4 com destino ao IP do LINK2_IP
# e a porta 110
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -p tcp --dport 110 -d $LINK2_IP -m conntrack --ctorigdst $LINK2_IP -j MARK --set-mark 4 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link1 com mark 5 com destino ao IP do LINK1_IP
# e a porta 80
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -p tcp --dport 80 -d $LINK1_IP -m conntrack --ctorigdst $LINK1_IP -j MARK --set-mark 5 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link2 com mark 6 com destino ao IP do LINK2_IP
# e a porta 80
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN2 -p tcp --dport 80 -d $LINK2_IP -m conntrack --ctorigdst $LINK2_IP -j MARK --set-mark 6 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link1 com mark 7 com destino ao IP do LINK1_IP
# e a porta 3389
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -p tcp --dport 3389 -d $LINK1_IP -m conntrack --ctorigdst $LINK1_IP -j MARK --set-mark 7 -m mark --mark 0
#
# Aqui marco o pacote que entrar pelo link2 com mark 8 com destino ao IP do LINK2_IP
# e a porta 3389
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -p tcp --dport 3389 -d $LINK2_IP -m conntrack --ctorigdst $LINK2_IP -j MARK --set-mark 8 -m mark --mark 0
#

# Aqui énde acontece a máca. Quando simplesmente marcamos um pacote que entra
# por um link de internet ele perde sua marca quando passa pela tabela NAT. Ãnesse
# ponto que todo mundo fica perdido, pois em todos os fós que li a dú maior é# essa, o porque do pacote nãretorna pelo link que ele entrou se eu marquei ele na
# sua entrada.
#
# Acontece que ao passar de uma tabela (mangle) para outra (nat) ele perde a marca.
# Descobri isso lendo a documentaç do iptables e com ajuda do tcpdump concluísso.
# Mas sempre tem uma maneira de resolver esse problema.
# Simplesmente vamos dizer que queremos que seja lembrado a marca anterior do
# pacote.
# Como pode ser visto na regra abaixo, na chain PREROUTING da mangle salvo a marca
# do pacote jogando para o ALVO CONNMARK
#
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN1 -j CONNMARK --save-mark
$IPTABLES -t mangle -A PREROUTING -i $LINK_WAN2 -j CONNMARK --save-mark

#
# E quando o pacote retorna entrando pela interface interna éembrado sua marca
# anterior.
# Isso tudo ocorre pela --save-mark da regra anterior e --restore-mark da regra abaixo.
#
$IPTABLES -t mangle -A PREROUTING -i $LINK_INT1 -p tcp -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark
#
# Regras de roteamento com iproute
#
# Deletando as regras atuais de roteamento
#
ip route del default
ip rule del prio 10 table main
ip rule del prio 19 fwmark 1 table link1
ip rule del prio 20 fwmark 2 table link2
ip rule del prio 21 fwmark 3 table link1
ip rule del prio 22 fwmark 4 table link2
ip rule del prio 23 fwmark 5 table link1
ip rule del prio 24 fwmark 6 table link2
ip rule del prio 25 fwmark 7 table link1
ip rule del prio 26 fwmark 8 table link2
ip rule add prio 30 table link1
#
# Configurando se necessáo o /etc/iproute2/rt_tables com as tabelas de cada link.
#
if ! cat /etc/iproute2/rt_tables | grep -q '^250'
then
echo "250 link1" >> /etc/iproute2/rt_tables
fi
#
if ! cat /etc/iproute2/rt_tables | grep -q '^251'
then
echo "251 link2" >> /etc/iproute2/rt_tables
fi
#
# Flush nas tabelas
ip route flush table link1
ip route flush table link2
#
# Falo que prioridade a tabela main tem.
ip rule add prio 10 table main
#
# Falo quem é gateway da tabela link1
ip route add default proto static via $LINK1_GW src $LINK1_IP table link1
#
# Falo quem é gateway da tabela link2
ip route add default proto static via $LINK2_GW src $LINK2_IP table link2
#
# Crio a regra de roteamento para cada tabela de acordo com a marcaç do pacote
#
# pacotes smtp que entraram pela tabela link1
ip rule add fwmark 1 from 192.168.1.3 table link1 prio 19
#
# pacotes smtp que entraram pela tabela link2
ip rule add fwmark 2 from 192.168.1.3 table link2 prio 20
#
# pacotes pop3 que entraram pela tabela link1
ip rule add fwmark 3 from 192.168.1.3 table link1 prio 21
#
# pacotes pop3 que entraram pela tabela link2
ip rule add fwmark 4 from 192.168.1.3 table link2 prio 22
#
# pacotes web que entraram pela tabela link1
ip rule add fwmark 5 from 192.168.1.4 table link1 prio 23
#
# pacotes web que entraram pela tabela link2
ip rule add fwmark 6 from 192.168.1.4 table link2 prio 24
#
# pacotes rdp que entraram pela tabela link1
ip rule add fwmark 7 from 192.168.1.4 table link1 prio 25
#
# pacotes rdp que entraram pela tabela link2
ip rule add fwmark 8 from 192.168.1.4 table link2 prio 26
#
# Caso vocêueira que o resto da rede interna se comunique com a internet pela
# tabela link1
ip rule add prio 30 table link1
#
# Atualizando o cache de roteamento
ip route flush cache




voce pode me ajudar?

[25] Comentário enviado por stefaniobrunhara em 30/06/2017 - 08:59h

Muito bom o artigo, me ajudou na solução de ter um DVR atrás de dois links passando por um servidor Linux. Como sempre vemos os artigos sobre dois links pensamos que o processo só vale para saída, mas o conhecimento acima funciona bem também como entrada.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts