Aqui estão as metas e os meios para um relé (ou seja, relay1 , relay2 ou relay3 ) lidar corretamente com o tráfego proveniente de default-gateway ( 10.0.0.1 ) ou através do HAProxy master-relay ( 10.0.0.254 ) no modo transparente, agindo como um gateway:
-
O relé deve usar o gateway normal
default-gatewaypara o tráfego normal, ou seja:- tráfego iniciado localmente,
- respostas de saída do tráfego iniciado remotamente que já passaram por
default-gateway.
-
O relé deve usar o gateway alternativo
master-relaypara o tráfego transmitido de forma transparente do HAProxy, portanto apenas para:- respostas de saída do tráfego iniciado remotamente que já passaram por
master-relayagindo como um gateway alternativo.
- respostas de saída do tráfego iniciado remotamente que já passaram por
-
O seletor para distinguir o caso de roteamento 1. do caso 2. é o endereço MAC de origem do gateway alternativo
master-relay. Digamos que02:03:04:05:06:07. -
A escolha, uma vez feita no primeiro pacote de uma conexão, deve permanecer a mesma para todos os outros pacotes parte desta conexão.
Isso requer roteamento de política, com uma tabela de roteamento alternativa ( ip route add table ... , uma decisão de roteamento adicional ( ip rule add fwmark... ) confiando em iptables usando o mac para o seletor de endereço MAC, o MARK destinado a alterar a decisão de roteamento e os CONNMARK alvo para memorizar a decisão para toda a conexão.
Caso 1. sendo o caso padrão sem manipulação especial e caso 2. a exceção, você deve reverter sua mudança de roteamento, para usar default-gateway como gateway padrão, como de costume:
ip route replace default via 10.0.0.1
O caso 2. será armazenado em uma tabela de roteamento alternativa. Não há necessidade de nomeá-lo, qualquer número é bom, vamos escolher 1000254 ( 254 foi reservado, é a tabela principal ...):
ip route add table 1000254 default via 10.0.0.254
A decisão de roteamento para usá-lo será acionada por um valor de marca (vindo de iptables ' MARK target'). Vamos escolher 254 :
ip rule add fwmark 254 lookup 1000254
Como pode ser visto em Fluxo de pacotes no Netfilter e na rede geral , uma regra iptables em mangle/PREROUTING ou mangle/OUTPUT pode definir uma marca antes que a decisão de roteamento (ou a verificação de reencaminhamento) seja feita. É assim que no final iptables mudará a rota. Então, para um único pacote de entrada, isso seria:
iptables -t mangle -A PREROUTING -m mac --mac-source 02:03:04:05:06:07 -j MARK --set-mark 254
Agora, para memorizá-lo para toda a conexão, ele deve ser agrupado com CONNMARK chamadas, que armazenam e recuperam a marca na entrada conntrack para este fluxo e permitem defini-lo apenas na primeira vez, sem esquecer a direção da SAÍDA. Algumas explicações estão neste blog: Para o Linux e além! Netfilter Connmark . Não há necessidade de marcar pacotes para o tráfego da LAN, então filtre (e isso pode ajudar quando usar conntrack -L no final). No final, incluindo a regra anterior, torna-se:
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j RETURN
iptables -t mangle -A PREROUTING ! -s 10.0.0.0/24 -m mac --mac-source 02:03:04:05:06:07 -j MARK --set-mark 254
iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
É isso. Este caso nem requer configuração rp_filter para perder o modo porque existe apenas uma interface de rede envolvida.
Por favor, note que você pode facilmente inserir mais tabelas, regras e marcas para ter mais de um master-relay , caso precise de redundância (ou simplesmente adicione um MAC adicional a master-relay se seu IP mudar seu endereço MAC para qualquer razão). Exemplo para um HAProxy adicional com IP 10.0.0.250 e MAC 0A:09:08:07:06:05 :
ip route add table 1000250 default via 10.0.0.250
ip rule add fwmark 250 lookup 1000250
iptables -t mangle -I PREROUTING 4 ! -s 10.0.0.0/24 -m mac --mac-source 0A:09:08:07:06:05 -j MARK --set-mark 250
conntrack -L exibirá o connmark e poderá ser usado para distinguir se uma conexão veio por master-relay em vez do padrão, porque sua marca será 254 em vez de 0 :
# conntrack -L -s 198.51.100.1
tcp 6 431635 ESTABLISHED src=198.51.100.1 dst=10.0.0.10 sport=50230 dport=25 src=10.0.0.10 dst=198.51.100.1 sport=25 dport=50230 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 use=1
tcp 6 431527 ESTABLISHED src=198.51.100.1 dst=10.0.0.10 sport=49554 dport=25 src=10.0.0.10 dst=198.51.100.1 sport=25 dport=49554 [ASSURED] mark=254 secctx=system_u:object_r:unlabeled_t:s0 use=1
conntrack v1.4.4 (conntrack-tools): 2 flow entries have been shown.