Os nomes resolvem-se em endereços, e esses endereços podem cair num conjunto da firewall que mais tarde influencia o encaminhamento, o que torna possível o direcionamento baseado no nome sem proxy. A armadilha é que quatro componentes têm de entregar corretamente: o resolvedor, o conjunto, o classificador que marca um novo fluxo e o par que o transporta. Cada entrega falha de forma diferente e cada uma guarda o seu próprio tempo.

Trate o desenho como uma cadeia e não como uma configuração. A pergunta em cada passo é que componente detém a decisão e o que acontece quando falta a sua entrada.

O que a resposta DNS pode e não pode fazer

o dnsmasq pode copiar endereços das respostas para um conjunto nftables, o que é uma alimentação e não uma decisão de encaminhamento. Essa opção, documentada no manual do dnsmasq, indica a família, a tabela e o conjunto, e o seu 4# inicial seleciona apenas registos A, pelo que os destinos v6 precisam de uma disposição própria. O conjunto tem de já existir, porque o resolvedor acrescenta elementos a algo que o dono da firewall criou. Nada nesse passo escolhe uma interface, uma tabela ou um par.

O cliente também tem de usar esse resolvedor para o nome. Uma aplicação com o seu próprio DNS cifrado, ou uma resposta em cache de antes de a política existir, liga-se sem criar qualquer entrada no conjunto.

O conjunto é uma entrada, não uma rota

Um elemento num conjunto é uma condição de correspondência. Algo tem de o olhar, decidir que este pacote inicia um novo fluxo e aplicar a política que envia o fluxo pelo túnel. No Linux isso significa normalmente um caminho de saída com capacidade de encaminhamento que consegue pôr uma marca, uma regra que envia os pacotes marcados para uma tabela dedicada e uma rota nessa tabela para o dispositivo WireGuard. A pertença sozinha não instala nada disso.

nft add set inet vpn_select office_v4 { type ipv4_addr\; }
ip rule add fwmark 0x40 table 200
ip route add default dev wg0 table 200
wg show wg0 allowed-ips

O par aplica uma segunda verificação de cobertura que as pessoas esquecem. O WireGuard só cifra um pacote para um par cujos endereços permitidos incluam o destino, pelo que uma rota de política para a interface não basta quando a lista do par exclui esse prefixo. Mantenha a lista sob o controlo do dono do encaminhamento em vez de confiar na criação de rotas que o gestor faça por acaso.

Marcas, tabelas e cobertura do par

As marcas são um espaço de nomes partilhado, pelo que tanto o valor como a máscara têm de ser acordados com tudo o resto que as usa. Uma regra que envia tráfego marcado para uma tabela dedicada precisa de um resultado definido quando essa tabela não tem qualquer rota correspondente, porque uma procura sem resposta pode continuar para a regra seguinte e fazer sair o pacote pela interface física. Uma rota predefinida blackhole dentro da tabela dedicada transforma essa fuga silenciosa numa queda visível. O que o desenho ainda não consegue é fechar-se em caso de falha para um destino que nunca entrou no conjunto.

Os pacotes exteriores do próprio túnel têm de escapar ao classificador. As ferramentas do WireGuard fornecem uma marca de socket precisamente para isso, e usá-la impede que a encapsulação seja encaminhada de volta para a interface que está a construir.

Teste cada vida útil separadamente

Três armazéns envelhecem segundo três calendários: a cache do resolvedor, os elementos do conjunto e a ligação seguida. Teste-os nessa ordem e veja se cada um se move quando deve. Os comandos abaixo leem o resolvedor, o conjunto, a tabela de ligações e as regras de política sem mudar nada.

dig +short office.example
nft list set inet vpn_select office_v4
conntrack -L -d 10.60.8.15
ip rule show

Uma procura nova que acrescenta um elemento prova que a alimentação funciona, enquanto um elemento antigo que sobrevive à sua resposta é um desalinhamento de vida útil que vale a pena anotar. Uma ligação nova na tabela de ligações com a marca esperada mostra que o classificador correu, e uma ligação antiga que mantém a marca original é comportamento correto e não um erro. A lista de regras responde se a procura de política existe, que é uma pergunta diferente de se correspondeu. Leia as quatro saídas nessa ordem e a entrega que falha denuncia-se sozinha.

Quando o requisito é que um nome concreto use sempre um só caminho, um conjunto alimentado por DNS não o pode provar, porque os endereços partilhados também transportam outros nomes. Um proxy ou um mecanismo ao nível da aplicação é a ferramenta para essa garantia.

Artigos relacionados