Balanceamento de carga e NAT-ing de várias conexões ISP no Linux

14

Eu tenho duas conexões de internet de dois ISPs diferentes e preciso equilibrar o tráfego originado para e da minha rede entre os dois ISPs. Eu estou usando o Debian GNU / Linux.

Minha configuração é assim -

eth0 (192.168.0.0/24) - rede local

eth1 (192.168.1.0/24) - ISP # 1

eth2 (192.168.2.0/24) - ISP # 2

Minha rede local está conectada a este servidor via eth0 e a caixa é o servidor DHCP e o Gateway para todas as máquinas na LAN.

O servidor precisa fazer balanceamento de carga entre os dois ISPs e também precisa fazer NAT-ing.

Eu segui as instruções de roteiro no lartc.org , mas ainda preciso de instruções para fazer o NAT corretamente.

Qualquer ajuda será apreciada.

PS - Eu sei sobre o pFsense, mas preciso usar o Linux.

    
por Baishampayan Ghose 12.12.2009 / 13:20

2 respostas

18

Eu fiz o balanceamento de carga usando os métodos lartc.org e iptables , e acho que o método iptables é mais fácil de entender e implementar. A única desvantagem é que você precisa de uma versão bastante recente do iptables para poder usar o módulo estatística

Vamos supor algumas coisas:

LAN: eth0: 192.168.0.1/24

ISP1: eth1: 192.168.1.1/24, gateway: 192.168.1.2/24

ISP2: eth2: 192.168.2.1/24, gateway: 192.168.2.2/24

Então, aqui está como eu faria usando o método iptables:

Tabelas de rotas

Primeiro, edite o arquivo / etc / iproute2 / rt_tables para adicionar um mapa entre os números da tabela de rotas e os nomes dos ISPs

...
10 ISP1
20 ISP2
...

Portanto, as tabelas 10 e 20 são para ISP1 e ISP2, respectivamente. Eu preciso preencher essas tabelas com rotas da tabela principal com este snippet de código (que eu tirei de hxxp: //linux-ip.net/html/adv-multi-internet.html)

ip route show table main | grep -Ev '^default' \
   | while read ROUTE ; do
     ip route add table ISP1 $ROUTE
done

E adicione o gateway padrão ao ISP1 através do gateway do ISP1:

ip route add default via 192.168.1.2 table ISP1

Faça o mesmo para o ISP2

Então, agora eu tenho duas tabelas de rotas, uma para cada ISP.

Iptables

OK agora eu uso o iptables para distribuir uniformemente pacotes para cada tabela de rotas. Mais informações sobre como este trabalho pode ser encontrado aqui ( link ) e aqui ( link )

# iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
# iptables -t mangle -A PREROUTING -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20
# iptables -t mangle -A PREROUTING -j CONNMARK --save-mark

NAT

Bem, NAT é fácil:

# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
    
por 22.12.2009 / 09:41
3

A resposta do mefat me ajudou muito, mas em vez de uma cópia única de todas as regras da tabela principal nas duas tabelas do ISP, uma abordagem melhor pode ser usar o prio da regra para adicionar as regras padrão após a tabela principal. >

Configure o / etc / iproute2 / rt_tables como normal:

...
10 ISP1
20 ISP2
...

Note que

ip rule show

Mostra as regras 0- > local, 32766- > main e 32767- > padrão. Veja man ip para mais detalhes.

Crucialmente, o processo de roteamento funcionará de baixo nível para alto nível de regras ... mas 32767 não é a regra mais alta #. Portanto, se a tabela de roteamento principal não tem uma rota padrão (mas pode conter todos os tipos de rotas dinamicamente alteradas para vpns etc), se uma correspondência não for feita, ela passará para o padrão (normalmente vazia) e procura regras de maior prioridade.

Veja a seção 'jogar' aqui: link

Então agora configure

ip route add default dev $ISP1_IFACE table ISP1
ip route add default dev $ISP2_IFACE table ISP2

e para garantir que eles sejam vistos depois da tabela principal:

ip rule add fwmark 20 table ISP1 prio 33000
ip rule add fwmark 10 table ISP2 prio 33000

Use

ip rule show

novamente para verificar se essas regras são mais altas do que a principal

Em seguida, use o CONNMARK como o mefat disse:

# iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
# iptables -t mangle -A PREROUTING -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20
# iptables -t mangle -A PREROUTING -j CONNMARK --save-mark

Coisas a serem observadas: o pppd precisa de nodefaultroute , caso contrário, configura no main; quando um dispositivo reinicia, as tabelas ISP1 / ISP2 são limpas, portanto, precisam ser restauradas usando um script.

Eu uso um script em / etc / ppp / ip- {up, down} .d / roteamento duplo

# One of my connections is ~2x faster than the other
BALANCED=0.3
ALL_ISP1=0
ALL_ISP2=1

RULENUM=4
set_balance() {
    iptables -t mangle -R PREROUTING $RULENUM -m statistic --mode random --probability $0 -j MARK --set-mark 2
}

# if both up
set_balance $BALANCED
# if ppp1 down:
set_balance $ALL_ISP1
# if ppp0 down:
set_balance $ALL_ISP2

Isso é balanceamento de carga com base em conexão, então vou examinar o uso da carga para monitorar e substituir a regra de estatísticas: iptables -t mangle -R PREROUTING <n> do userspace. Portanto, se houver um download de longa duração em uma conexão e a outra conexão estiver levemente carregada, devemos preferir a conexão levemente carregada.

    
por 26.03.2014 / 21:40