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.