Rotear o tráfego em um cgroup fora de um túnel VPN

Rotear o tráfego em um cgroup fora de um túnel VPN

Estou tentando fazer com que algum tráfego passe por uma VPN e outro tráfego para não fazer isso.

Os pacotes com um determinado fwmark devem ir para minha interface padrão ( wlo1) e todo o outro tráfego para uma interface de túnel ( tun0, usando OpenVPN) na tabela principal. Eu adicionei esta regra no nftables:

table ip test {
    chain test {
        type route hook output priority mangle; policy accept;
        meta cgroup 1234 meta mark set 1
    }
}

Na tabela de roteamento principal, tenho estas entradas:

default via 10.11.0.1 dev tun0 
10.11.0.0/16 dev tun0 proto kernel scope link src 10.11.0.20 
[WANIP.0]/24 dev wlo1 proto kernel scope link src [WANIP] 
128.0.0.0/1 via 10.11.0.1 dev tun0 
[VPNIP] via [WANGATEWAY] dev wlo1

Em vez disso , pacotes com fwmark 1são direcionados para sua própria tabela de roteamento: ip rule add from all fwmark 1 lookup test. Na testtabela adicionei a seguinte rota:

default via [WANGATEWAY] dev wlo1

Quando corro ping 8.8.8.8deste cgroup, ele fica preso. Parece capaz de enviar, mas não receber nenhum pacote.

O tráfego VPN funciona conforme o esperado.

O que exatamente está acontecendo?

Responder1

Quando um pacote é emitido, é tomada uma decisão de roteamento: esta decisão escolhe a interface de saídaeo endereço IP de origem correspondente a ser usado.

Quando orota/saídacorrente deixa uma marca, ela desencadeia umaverificação de redirecionamento, como visto nesteesquemático(que foi feito paratabelas de ipem mente, mas é totalmente utilizável paranftáveis). A verificação de redirecionamento altera a rota... mas não altera o endereço IP de origem. Portanto, mais trabalho precisa ser feito.

  • adicione uma regra NAT para alterar o endereço IP de origem.

Isso tem que ser feitodepoisa verificação de redirecionamento, então é feito emnat/pós-roteamento. Observe que a mesma tabela pode ter diferentes tipos de cadeia (ao contráriotabelas de iponde tabela <=> tipo).

    nft add chain ip test testnat '{ type nat hook postrouting priority srcnat; policy accept; }'
    nft add rule ip test testnat meta mark 1 masquerade

Agora o pacote correto realmente sai.

  • e permitir que o fluxo de resposta seja aceito apesar de não chegar pela rota padrão
  1. Você pode relaxarEncaminhamento de caminho reversopara o modo Loose alterandorp_filter:

        sysctl -w net.ipv4.conf.wlo1.rp_filter=2
    
  2. ou marque o fluxo de resposta para usar a mesma tabela de roteamento do fluxo de saída. Na verdade, não melhorará a segurança, mas de qualquer maneira:

        nft add chain ip test testpre '{ type filter hook prerouting priority mangle; policy accept; }'
        nft add rule ip test testpre iif "wlo1" meta mark set 1
    

Infelizmente, isso não funcionará sem mais um ajuste necessário, já que um novorecurso não documentadoapareceu em 2010:

        sysctl -w net.ipv4.conf.wlo1.src_valid_mark=1

Notas:

  • É possível melhorar a segurança armazenando a marca no conntrack'smarca de conexão( ct mark) para permitir apenas os fluxos de resposta corretos e nada mais para ignorar o encaminhamento estrito de caminho reverso. No modo Estrito, nada alcançaráwlo1mais, a menos que seja uma resposta do tráfego de saída. Aqui está o arquivo de regras nftables completo correspondente para isso (para ser usado com a opção 2. acima ao substituir as regras nftables):

      table ip test {
              chain test {
                      type route hook output priority mangle; policy accept;
                      meta cgroup 1234 meta mark set 1 ct mark set meta mark
              }
    
              chain testnat {
                      type nat hook postrouting priority srcnat; policy accept;
                      meta mark 1 masquerade
              }
    
              chain testpre {
                      type filter hook prerouting priority mangle; policy accept;
                      ct mark 1 meta mark set ct mark
              }
      }
    
  • Além disso, a verificação de redirecionamento de marca pode interferir no PMTU/TCP MSS correto em alguns casos, de acordo com o que pude ler lá noUidrangeentrada:https://kernelnewbies.org/Linux_4.10#Networking

  • Se você puder converter o uso de cgroups em um conjunto limitado de uids, isso poderá ser feito corretamente usando apenas a pilha de roteamento, sem netfilter ou nftables, usando ip rule add ... uidrange ...conforme descrito acima. Veja minha resposta lá sobre isso:Roteando o tráfego para um usuário por meio de uma interface específica (tum1).

informação relacionada