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-gateway
para 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-relay
para 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-relay
agindo 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.