Configurar rota para usar a mesma interface para o tráfego de saída como o tráfego de entrada

2

Eu tenho uma caixa Linux com duas interfaces: uma para dados e outra para fins de gerenciamento. Se ambos estiverem na mesma rede, tenho uma rota adicionada para ambas as interfaces.

Imagine que a tabela de roteamento é:

192.168.132.0 255.255.255.0 eth0
192.168.132.0 255.255.255.0 eth1 ( management interface)

O problema é que, mesmo se uma conexão for iniciada para o mgmt IP (eth1), o tráfego de retorno estará em eth0.

Como posso garantir que o tráfego de retorno em uma conexão use a mesma interface que o tráfego encaminhado?

    
por kumar 19.08.2011 / 09:22

2 respostas

3

Você pode fazer isso usando uma combinação de iptables / netfilter com os módulos conntrack e (conn-) mark e o roteamento de políticas.

na tabela MANGLE do iptables:

-A PREROUTING          -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark
-A OUTPUT              -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark
-A PREROUTING -i eth0  -m state --state NEW                 -j CONNMARK --set-mark 1
-A PREROUTING -i eth1  -m state --state NEW                 -j CONNMARK --set-mark 2
-A PREROUTING -m connmark --mark 1                          -j MARK --set-mark 1
-A PREROUTING -m connmark --mark 2                          -j MARK --set-mark 2
-A PREROUTING -m state --state NEW -m connmark ! --mark 0   -j CONNMARK --save-mark

Eu suponho que você tem uma rota padrão na eth0, então precisamos apenas configurar uma rota "mágica" para os pacotes que entram via eth1.

Usando o pacote iproute2:

ip rule add fwmark 2 table eth1
ip route add default via 192.168.132.1 table eth1

O que isto faz é: Toda conexão que chega via eth1 será marcada pelo iptables com um "2", então cada pacote nessa conexão tem uma marca, que pode ser lida fora do código do iptables. Em seguida, uma rota de política é adicionada, que encaminha cada pacote com uma marca "2" através da tabela de roteamento "eth1", que tem uma rota padrão para o roteador, mas envia os pacotes via eth1.

Voila.

Essa configuração acima pressupõe que você tenha o mesmo IP nas duas interfaces. Se você tem IPs diferentes em ambos, você pode simplificar a configuração usando somente uma rota de política no ip de origem (eu assumo 192.168.132.3 em eth1):

ip rule add from 192.168.132.3 table eth1
ip route add default via 192.168.132.3 table eth1

Não há necessidade de conmarcar via iptables então.

    
por 19.08.2011 / 10:56
3

Se você estiver tentando manter seu tráfego de gerenciamento separado de outro tráfego, você não conseguirá isso simplesmente fazendo com que seu gerenciamento deixe uma porta diferente em seu servidor. Você precisa manter o tráfego separado depois que ele sair do servidor também - o que você não conseguirá fazendo com que ele viaje na mesma sub-rede.

Portanto, para separar seu tráfego, você realmente precisa dividir sua rede em várias sub-redes, usando comutação separada ou VLANs, e usar o roteamento para rotear o tráfego entre as diferentes sub-redes. Em seguida, no seu servidor, você tem uma interface de gerenciamento separada, conectada apenas à sub-rede de gerenciamento. O ideal é que você faça suas tarefas de gerenciamento de hosts conectados apenas a essa sub-rede também.

Isso permitirá que você realmente consiga o que deseja e será mais simples de configurar e entender, embora não necessariamente mais barato para a configuração. Suponho que você tenha um caso de negócios claro para separar seu tráfego de gerenciamento.

Se tudo o que você quiser fazer é limitar as tarefas de gerenciamento em seu servidor a hosts específicos em sua rede, você conseguiria isso simplesmente configurando o iptables para permitir somente tráfego de tipo de gerenciamento (por exemplo, identificado por porta como ssh) daqueles específicos hospeda endereços IP.

    
por 19.08.2011 / 11:24