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

15

Eu tenho duas conexões com a Internet de dois ISPs diferentes e preciso equilibrar o tráfego originário de e para minha rede entre os dois ISPs. 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 nº 1

eth2 (192.168.2.0/24) - ISP # 2

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

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

Eu segui as instruções de roteamento 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.

Baishampayan Ghose
fonte
2
que tipo de instruções você precisa? tudo é explicado no lartc.org. Você tem algum problema em particular?
Lorenzog

Respostas:

19

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ístico

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 / etc / iproute2 / rt_tables para adicionar um mapa entre os números da tabela de rotas e os nomes de ISP

...
10 ISP1
20 ISP2
...

Portanto, as tabelas 10 e 20 são para ISP1 e ISP2, respectivamente. Preciso preencher essas tabelas com rotas da tabela principal com esse trecho de código (que eu peguei no 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 2 tabelas de rotas, 1 para cada ISP.

Iptables

OK, agora eu uso o iptables para distribuir uniformemente pacotes para cada tabela de rota. Mais informações sobre como este trabalho pode ser encontrado aqui ( http://www.diegolima.org/wordpress/?p=36 ) e aqui ( http://home.regit.org/?page_id=7 )

# 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
eu gorda
fonte
3
Boa resposta com links. Você não precisa necessariamente de um novo iptables para fazer isso, pois antes das estatísticas coincidirem, havia as aleatórias e as enésimas correspondências em que o servidor tinha a mesma função.
SiegeX 22/12/2009
1
Eu tenho uma pergunta sobre as marcas no iptables. No link postado, eles estão marcando apenas os pacotes que correspondem ao novo estado. Por que você está fazendo diferente?
Matías
Posso usar mais uma rede, como ISP3, ISP4, etc?
Vitor Mazuco
3

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

Configure / etc / iproute2 / rt_tables como normal:

...
10 ISP1
20 ISP2
...

Observe que

ip rule show

Mostra as regras 0-> local, 32766-> principal e 32767-> padrão. Veja man ippara mais detalhes.

Crucialmente, o processo de roteamento funcionará das regras de baixo prio a alto prio ... mas 32767 não é a regra mais alta #. Portanto, se a tabela de roteamento principal não tiver 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 retornará ao padrão (normalmente vazio) e procurará regras mais altas.

Veja a seção 'throw' aqui: http://linux-ip.net/html/routing-tables.html

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

Usar

ip rule show

novamente para verificar se essas regras são superiores às principais

Em seguida, use CONNMARK mangling como 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

O que deve ser observado: o pppd precisa, nodefaultroutecaso contrário, ele será configurado no main; Quando um dispositivo reinicia, as tabelas ISP1 / ISP2 são limpas e, portanto, precisam ser restauradas usando um script.

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

# 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 baseado em conexão, por isso vou usar o load para monitorar e substituir a regra de estatísticas: iptables -t mangle -R PREROUTING <n>no espaço do usuário. Portanto, se houver um download de uma execução demorada em uma conexão e a outra estiver levemente carregada, devemos preferir a conexão levemente carregada.

lbt
fonte