CONFIGURANDO O SEGUNDO DEFAULT GATEWAY PARA UM LINK DE ENTRADA ESPECÍFICO

INTRODUÇÃO

 

Os objetivos desse artigo são:

  • Apresentar o cenário onde existe a necessidade de publicar um serviço em dois links de internet.
  • Detalhar os problemas que podem ocorrer e como identificá-los.
  • Aplicar a solução e assim fazer dois default gateway funcionar de forma plena.

CENÁRIO

A empresa ACME possui um servidor Debian 8 (D8-SRV01) que executa uma aplicação na porta 3333, o servidor tem o seguinte IP de Lan 172.16.10.100 e esta conectando diretamente a um firewall Linux executando Iptables puro (D8-FW01) IP de Lan 172.16.10.254, existe um link de internet dedicado com a operadora A conectado diretamente ao firewall, o IP válido fornecido é 200.2.2.5, assim o firewall faz o redirect desse IP na porta 3333 para o IP interno do servidor (D8-SRV01) e tudo funciona adequadamente.

Devido a importância desse serviço e as constantes instabilidades da operadora A a empresa ACME decide contratar um segundo link de internet com a operadora B, recebendo o IP válido 187.8.8.5, como o serviço da porta 3333 é muito conhecido por todos os funcionários e o software que utiliza é bem complexo de configurar o gerente pede para que não troque a porta acessada externamente, ou seja, a porta de acesso deve ser a mesma tanto na operadora A quanto na operadora B. O administrador de rede muito feliz pela possibilidade de aumentar a disponibilidade do serviço com a contratação de mais um link de internet, acaba percebendo que fazer os acessos do servidor funcionar simultaneamente pelas duas operadoras não vai ser uma tarefa tão fácil quanto pensava.

De formar resumida, o cenário da empresa ACME é esse:

CONFIGURAÇÕES DO FIREWALL (D8-FW01)

Localização e conteúdo do script iptables:

$ cat /usr/local/bin/fwregras.sh

#Limpando regras
iptables -F
iptables -F -t nat
iptables -F -t mangle

#Definindo politica padrão
iptables -P INPUTS DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

#Declarando variáveis
SERVER=172.16.10.100
IPOPA=200.2.2.5
IPOPB=187.8.8.5

#Liberando FORWARD
echo 1 > /proc/sys/net/ipv4/ip_forward

#Liberando ICMP INPUT
iptables -A INPUT -p icmp -j ACCEPT

#Liberando SSH INPUT na porta 22 (apenas para ambiente de teste)
iptables -A INPUT -p tcp -s 0/0 –dport 22 -j ACCEPT

#Mascarando o ICMP
iptables -t nat -A POSTROUTING -p ICMP -o eth0 -j MASQUERADE

#Redirect para os IPs válidos
iptables -t nat -A PREROUTING -p TCP -d $IPOPA –dport 3333 -i eth1 -j DNAT –to $SERVER:3333
iptables -t nat -A PREROUTING -p TCP -d $IPOPB –dport 3333 -i eth2 -j DNAT –to $SERVER:3333

#Forward para o servidor D8-SRV01
iptables -A FORWARD -p TCP -d $SERVER –dport 3333 -j ACCEPT

#NATs para o servidor D8-SRV01
iptables -t nat -A POSTROUTING -s 172.16.10.100 -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 172.16.10.100 -o eth2 -j MASQUERADE

#Tornando o firewall STATEFUL
iptables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

Arquivo de configuração das interfaces de rede:

$ cat /etc/network/interface

allow-hotplug eth0
iface eth0 inet static
address 172.16.10.254
netmask 255.255.255.0

allow-hotplug eth1
iface eth1 inet static
address 200.2.2.2
netmask 255.255.255.252
gateway 200.2.2.1

allow-hotplug eth2
iface eth2 inet static
address 187.8.8.2
netmask 255.255.255.252

PROBLEMAS E SOLUÇÕES

 

Nesse cenário existem dois problemas.

1. Utilização da banda nos dois links

O firewall por ter apenas um default gateway, o acesso externo chegará pelo link da operadora B, porém sairá pela operadora A. Situação muito ruim, pois o serviço ainda dependerá do link principal.

2. Antispoofing

Caso o antisoofing esteja ativado no roteador de borda, apenas os IPs que são entregues por ele poderão sair, ou seja, o acesso realizado pelo segundo link saindo pelo link principal não funcionará de jeito nenhum. Essa situação é mais difícil de acontecer, pois poucas operadoras se preocupam em ativar esse recurso.

Demonstração do problema:

Pacote entrando pela interface eth2 (Operadora B), origem rede do cliente IP 200.7.7.2.

Pacote passando pela eth0 (LAN) ao servidor de aplicação 172.16.10.100 porta 3333 e servidor respondendo a requisição.

Pacote saindo pela eth1 (Operadora A), IP de saída 187.8.8.5 para o cliente 200.7.7.2.

SOLUÇÃO

A solução é bem simples, basta marcar os pacotes que entram pelo segundo link e configurar outra tabela de roteamento contendo um default gateway para os pacotes marcados.

1. Editar o script do iptables do servidor D8-FW01, adicionando no final do arquivo.

# vim /usr/local/bin/fwregras.sh

#Setar a marca 10 nos pacotes com o destino ao 187.8.8.5 (IPOBP) e porta 3333.
iptables -t mangle -A PREROUTING -i eth2 -p tcp -d $IPOPB –dport 3333 -j MARK –set-mark 10

#Salva a marcação dos pacotes.
iptables -t mangle -A PREROUTING -i eth2 -p tcp -d $IPOPB –dport 3333 -j CONNMARK –save-mark

#Quando o servidor estiver devolvendo o pacote a marcação será restaurada.
iptables -t mangle -A PREROUTING -i eth0 -p tcp -s $SERVER –sport 3333 -m state –state ESTABLISHED,RELATED -j CONNMARK –restore-mark

2. Criar uma tabela de roteamento com número 200 com nome rotasmark10.

# echo “200 rotasmark10” >> /etc/iproute2/rt_tables

3. Configurar o arquivo interfaces, adicionando no final do arquivo.

# vim /etc/network/interface

#Cria a regra fwmark10 dizendo que os pacotes marcados com 10 utilizas a tabela rotasmark10.
up ip rule add fwmark 10 table rotasmark10 || /bin/true

#Adicionar a rede LAN 172.16.10.0/24 na tabela rotasmask10.
up ip route add 172.16.10.0/24 dev eth0 table rotasmark10 || /bin/true

#Configura o default gateway da tabela rotasmask10.
up ip route add default via 187.8.8.1 dev eth2 table rotasmark10 || /bin/true

4. Subir rotas manualmente, para não precisar reiniciar o firewall, executando os comandos.

# ip rule add fwmark 10 table rotasmark10
# ip route add 172.16.10.0/24 dev eth0 table rotasmark10
# ip route add default via 187.8.8.1 dev eth2 table rotasmark10

5. Testar o acesso.

Pacote entrando pela interface eth2 (Operadora B), origem rede do cliente IP 200.7.7.2 e já mostrando o retorno, ou seja, configuração realizada com sucesso!

6. Caso ainda não esteja funcionando existe alguns comandos para auxiliar no troubleshooting.

Validar se a regra fwmark foi criada.

# ip rule list

Validar se as rotas estão ativas na tabela de roteamento 200.

# ip route list table 200

Validar se as regras de marcação foram carregadas e estão corretas.

# iptables -t mangle -nvL | grep 3333

Validar se os pacotes para a porta 3333 estão sendo marcados.

# watch ‘iptables -t mangle -nvL | grep 3333’

CONSIDERAÇÕES

Configurei a marcação de pacotes apenas para o segundo link, todavia é interessante fazer a marcação para ambos os links, pois caso seja necessário alterar a rota default para a operadora B não ocorrera a mesmo problema.

REFERÊNCIAS

Rolar para cima