Marcar pacotes passando pelo túnel OpenVPN e manipulá-los diferentemente no lado do servidor

0

Eu precisaria criar uma configuração cliente-servidor OpenVPN tal que no lado do cliente cada pacote IP recebesse alguns metadados (por exemplo, um id ou nome) e no outro lado cada um deles fosse tratado de forma diferente com base nos metadados é atribuído com. Para enviar os metadados, posso pensar em duas maneiras:

  • Usando o campo ToS, embora seja pequeno.
  • Anexar a carga útil e, assim, alterar o tamanho / soma de verificação /...

Existe uma maneira melhor de marcar cada pacote? O OpenVPN em si fornece uma solução para esse requisito?

No lado do servidor (ou seja, no lado do servidor OpenVPN), existe alguma maneira de alavancar o mecanismo existente para o tipo de MITM de cada pacote? Para ser mais exato, eu precisaria ler cada metadado (com o qual cada pacote IP está vindo) e registrar algumas estatísticas de classificação ou firewall-los.

O OpenVPN fornece uma solução limpa para isso? Caso contrário, devo tocar no código do lado do servidor OpenVPN e construí-los por conta própria?

+------+   + ----+   +--------+           +--------+   +-----+    +----------+
| apps |---| tun |---| socket | ========= | socket |---| tun | ---| Internet |
+------+   +-----+   +--------+           +--------+   +-----+    +----------+
                   ^                                 ^
                   |                                 |
here packets are marked by my custom OpenVPN client  |
                                                     |
                        here I'd need to firewall packets based on the "metadata"
    
por Hi I'm Frogatto 10.09.2017 / 08:14

2 respostas

1

Se você tiver um cliente OpenVPN personalizado, precisará manipular a marcação da maneira que você decidir fazer lá, escrevendo o código. Observe que o PID do processo que originou o pacote não está disponível para o cliente OpenVPN e, de fato, pode não estar disponível como uma propriedade do pacote. Você precisará colocar processos no cliente em namespaces de rede ou similares para obter essas informações.

Se você quiser outros tipos de "metadados", especifique o que deseja.

No lado do servidor, iptables pode fazer tudo o que você deseja sem a necessidade de modificar o servidor OpenVPN. Você pode combinar em ToS com --tos , pode combinar em TTL com --ttl-* , pode corresponder em quatro bytes com --u32 ou pode executar um programa completo de filtro BPF com --bytecode de decidir adicionar cabeçalhos de extensões ou qualquer outra coisa. Para os pacotes correspondentes, você pode inseri-los na interface de saída desejada, marcá-los internamente e rotea-los, ou qualquer outra coisa que desejar. Veja man iptables-extensions para detalhes.

Então, essa parte é fácil, a parte difícil é descobrir que tipo de metadados você quer além do PID, e então encontrar alguma maneira de adicioná-los aos pacotes se o cliente OpenVPN realmente não tiver uma maneira de obter esses metadados.

Editar

Para obter o máximo de flexibilidade, você pode definir sua própria Opção de IP e adicioná-la a todos os pacotes IPv4 após o pacote cabeçalho. Isso adicionará uma sobrecarga notável e também pode causar mais fragmentação (não sei como o OpenVPN lida com a fragmentação dentro do túnel VPN).

Em princípio, você também pode passar o pacote de volta ao userspace com o NFQUEUE target. Se você fizer isso para cada pacote, será muito lento, por isso recomendo strongmente contra isso.

Se você realmente quer "executar seu próprio script" (espero que não seja um shell script) para cada pacote, o melhor seria modificar o servidor OpenVPN também.

Eu ainda não sei o caso de uso que você tem para isso, mas a partir da sua descrição dos seus planos, tenho certeza de que isso não funcionará, porque tudo diminuirá a velocidade para um rastreamento. Por favor reconsidere o que você está tentando fazer, especifique o caso de uso (o que você quer alcançar?), E descubra alguma solução no espaço do kernel usando iptables , e possivelmente vários clientes e servidores OpenVPN se você quiser alguma segregação. / p>

Geralmente você tem classes de usuários / processos, onde deseja permitir que alguns deles façam algo e lidem com os outros de maneira diferente. Atribua os usuários / processos às classes e manipule as classes no espaço do kernel. Não tente manipular a tarefa para classes adicionando essas informações a cada pacote.

Boa sorte, você vai precisar.

Editar

Devo acrescentar que normalmente se pensa na coleção de todas as regras iptables tanto como a "linguagem de script" (as regras de uma cadeia são processadas passo a passo, pode-se pular para outras cadeias) como o "banco de dados" mais propósitos. Claro, o "banco de dados" não deve ser muito grande. Se você quiser alterar o "banco de dados", adicione ou exclua regras em uma cadeia criada para essa finalidade.

A velocidade é importante ao manusear pacotes (o kernel recebe um lote de pacotes por segundo), e a comutação entre o espaço do usuário e o espaço do kernel é dispendiosa em termos de velocidade. Não há problema em fazer isso uma vez, como na interface tun / tap do OpenVPN, que tem seu próprio buffer, mas mais de uma vez não deve ser necessária.

    
por 10.09.2017 / 11:05
1

O SELinux Labeled Networking permite que você escreva um tráfego de rotulagem de políticas até o processo que o gera. A política no host remoto acessa decisões / filtragem com base na rotulagem. No entanto, o Networking Rotulado é suportado apenas no IPSec e no CIPSO, não diretamente no OpenVPN.

Se você estiver encaminhando o tráfego, provavelmente deve considerar a extensão do OpenVPN com sua própria lógica, em vez de tentar tomar as decisões de controle de acesso em outro lugar. Se todo o tráfego de entrada for para seu aplicativo, considere a possibilidade de tomar todas as decisões de controle de acesso.

    
por 10.09.2017 / 10:37