Problema de roteamento avançado

3

Eu tenho 2 links de internet usando 2 roteadores ADSL e preciso dar acesso à Internet para a rede 192.168.0.0/24.

Eu tenho que rotear o tráfego de saída com base no número da porta, protocolo,… usando iproute2 e iptables em um roteador linux.

Esta é minha rede:

     (ISP-1)                              (ISP-2)
Dynamic public IP                    Dynamic public IP 
        |                                    |
+---------------+                    +---------------+
|ADSL Router (1)|                    |ADSL Router (2)|
+---------------+                    +---------------+
        |                                    |
   192.168.1.1                          192.168.2.1
        |                                    |
        |                                    |
        |                                    |
        |        +------------------+        |
        |        |                  |        |
   192.168.1.2 --|eth1          eth2|-- 192.168.2.2
                 |                  |
                 |   Linux Router   |
                 |                  |
                 |       eth0       |
                 +------------------+
                          |
                     192.168.0.1
                          |
                          |
                    Local Network:
                    192.168.0.0/24

Eu uso o seguinte script para configurar a configuração de rede no roteador Linux:

#!/bin/bash

echo 1 >| /proc/sys/net/ipv4/ip_forward
echo 0 >| /proc/sys/net/ipv4/conf/all/rp_filter

# flush all iptables entries
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t filter -P INPUT ACCEPT
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT

# marking packets
iptables -t mangle -A PREROUTING -i eth0 -p icmp -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth0 -p udp  -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth0 -p tcp  -j MARK --set-mark 2

# create routing tables and default routes
echo '1     ISP1' >> /etc/iproute2/rt_tables
echo '2     ISP2' >> /etc/iproute2/rt_tables
ip route add default via 192.168.1.1 dev eth1 table ISP1
ip route add default via 192.168.2.1 dev eth2 table ISP2

# routing based on previous marks
ip rule add fwmark 1 table ISP1
ip rule add fwmark 2 table ISP2

ip route flush cache

# NAT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE

O problema é que não consigo me conectar à Internet pela rede 192.168.0.0/24.

Quando faço ping dessa rede para um servidor remoto, vejo (usando o Wireshark) respostas retornando do servidor remoto para a eth1 do roteador Linux, mas elas não alcançam a eth0.

Por favor ajude. E obrigado antecipadamente.

(EDIT)

Eu tentei solucionar esse problema estranho por uma semana.

Solução de problemas na saída de comandos:

ip rule
0:  from all lookup local 
32764:  from all fwmark 0x1 lookup ISP1
32765:  from all fwmark 0x2 lookup ISP2 
32766:  from all lookup main 
32767:  from all lookup default 

ip route show table ISP1
default via 192.168.1.1 dev eth1

ip route show table ISP2
default via 192.168.2.1 dev eth2

ip route show table main
192.168.2.0/24 dev eth2  proto kernel  scope link  src 192.168.2.2
192.168.1.0/24 dev eth1  proto kernel  scope link  src 192.168.1.2
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.1
169.254.0.0/16 dev eth0  scope link  metric 1000 
default via 192.168.1.1 dev eth1  metric 100

Eu posso resolver esse problema parcialmente digitando os seguintes comandos:

ip rule del fwmark 1 table ISP1
ip rule del fwmark 2 table ISP2
ip rule add from 192.168.0.0/24 table ISP1

Assim, recebo todo o tráfego da rede local roteado corretamente pelo link do ISP1 e todos os PCs obtêm acesso à Internet.

Mas estou interessado em roteamento baseado em marcas de pacotes.

    
por yozapho yozapho 03.08.2011 / 11:49

3 respostas

10

Depois de muito trabalho, finalmente encontrei qual era o problema.

Na verdade, não é um problema de roteamento, o script está correto, mas algo está faltando.

Este comando não é suficiente para desabilitar o rp_filter:

echo 0 >| /proc/sys/net/ipv4/conf/all/rp_filter

Assim, o tráfego que retorna da Internet caiu em eth1 e eth2.

Quando desabilitei o rp_filter explicitamente para ambas as interfaces adicionando os seguintes comandos:

echo 0 >| /proc/sys/net/ipv4/conf/eth1/rp_filter
echo 0 >| /proc/sys/net/ipv4/conf/eth2/rp_filter

O problema foi resolvido e consegui que tudo funcionasse perfeitamente.

A prova de que os tutoriais e a documentação do Linux nem sempre são concluídos.

    
por 05.08.2011 / 21:15
0

Se o tráfego estiver voltando ao roteador, mas não saindo novamente, então o problema está na sua tabela de roteamento, alguma regra do iptables, ou você não está lendo o wireshark corretamente. Não há muitas opções para o que impediria que os pacotes saíssem de um sistema.

    
por 03.08.2011 / 12:00
0

por favor olhe. parece parece com o seu problema. link

    
por 15.04.2014 / 02:10