Simples e simples - você não pode. Existem muitos tipos de VPN, muitos provedores e muitas variáveis globais para poder dizer com segurança se alguém está usando uma VPN.
Estou executando o Apache 2.2 em uma caixa linux. Existe alguma maneira confiável de detectar se um visitante do meu site está se conectando de uma VPN? Já ouvi falar de tentar abrir uma conexão TCP no endereço IP remoto, que às vezes pode identificar o usuário como um proxy. Mas o mesmo método poderia funcionar com usuários de VPN?
Você não pode detectar com segurança se um usuário está usando VPN. Existem muitas soluções VPN diferentes e, independentemente do seu método de detecção, uma nova solução VPN pode surgir e anular o seu método de detecção.
Dito isso, algumas soluções VPN podem ser detectadas.
O primeiro sinal que eu procuraria é o PMTU. Como a VPN adiciona cabeçalhos adicionais, eles precisam reduzir a MTU ou usar a fragmentação abaixo da VPN. Uma MTU reduzida pode ser detectada. Mas qualquer tipo de tunelamento pode causar uma MTU reduzida, não apenas soluções VPN. O PPPoE também pode causar uma MTU reduzida. Portanto, esse método acabará exigindo uma longa lista de possíveis valores de MTU e a probabilidade de que a MTU indique uma VPN.
Eu duvido, ficaria da mesma forma como se alguém estivesse usando NAT.
Existem várias soluções agora para fazer isso.
Soluções pagas:
bloqueado - Detecção de API paga, possui feeds brutos que você pode comprar
maxmind - detecção de proxy via API
Soluções gratuitas:
WITCH - detecta o OpenVPN via valores MSS (do que o kasperd disse)
getIPIntel - proxy de aprendizado de máquina / detecção de VPN, via API
Tags vpn apache-2.2