OpenVPN cliente a cliente

16

Ao usar um servidor OpenVPN TUN (camada 3) com client-to-clientdesativado, meus clientes ainda podem conversar entre si.

A configuração de cliente para cliente deve impedir isso de acordo com a documentação:

Remova o comentário da diretiva cliente-a-cliente, se desejar que os clientes possam se conectar pela VPN. Por padrão, os clientes só poderão acessar o servidor.

Por que os clientes podem continuar se comunicando quando essa opção está desativada?

Aqui está o meu servidor conf:

port 443
proto tcp
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh4096.pem
topology subnet
server 10.10.201.0 255.255.255.128
ifconfig-pool-persist ipp.txt
crl-verify /etc/openvpn/keys/crl.pem
push "route [omitted]"
push "dhcp-option DNS [omitted]"
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so login
cipher AES-256-CBC
tls-auth /etc/openvpn/keys/pfs.key 0
verb 4
lobi
fonte

Respostas:

54

Se client-to-clientestiver ativado , o servidor VPN encaminha pacotes internamente de cliente para cliente sem enviá-los para a camada IP do host (ou seja, para o kernel). A pilha de rede do host não vê esses pacotes.

           .-------------------.
           | IP Layer          |
           '-------------------'


           .-------------------.
           | TUN device (tun0) |
           '-------------------'


           .-------------------.
           | OpenVPN server    |
           '-------------------'
             ^           |
          1  |           |  2   
             |           v
 .----------------.  .----------------.
 | Client a       |  | Client b       |
 '----------------'  '----------------'

Se client-to-clientestiver desativado , os pacotes de um cliente para outro cliente passam pela camada IP do host (tabelas de ip, tabela de roteamento etc.) da máquina que hospeda o servidor VPN: se o encaminhamento de IP estiver ativado , o host poderá encaminhar o pacote (usando sua roteamento) novamente para a interface TUN e o daemon VPN encaminhará o pacote para o cliente correto dentro do túnel.

           .-------------------.
           | IP Layer          |  (4) routing, firewall, NAT, etc.
           '-------------------'      (iptables, nftables, conntrack, tc, etc.)
              ^          |
          3   |          |  5
              |          v
           .-------------------.
           | TUN device (tun0) |
           '-------------------'
             ^           |
          2  |           |  6  
             |           v
           .-------------------.
           | OpenVPN server    |
           '-------------------'
             ^           |
          1  |           |  7  
             |           v
 .----------------.  .----------------.
 | Client a       |  | Client b       |
 '----------------'  '----------------'

Nesse caso ( client-to-clientdesativado), você pode bloquear os pacotes cliente a cliente usando o iptables:

 iptables -A FORWARD -i tun0 -o tun0 -j DROP

Onde tun0está sua interface VPN?

ysdx
fonte
Marcado como a resposta; conciso, mas muito informativo e, na verdade, fornece a regra de firewall do iptables na resposta.
Lobo1
1
Eu tenho uma pergunta sobre o diagrama, você desenha char por char e espaço por espaço? ou você usa algum aplicativo para ajudá-lo a obter isso de maneira simples e rápida?
Mohammed Noureldin 15/07
3
@MohammedNoureldin, fiz o diagrama original com asciio ( search.cpan.org/dist/App-Asciio ), que é um editor de apontar e clicar do WYSWYG para diagramas de asciiart.
ysdx
Obrigado, você conseguiu executá-lo no Windows? parece ser um aplicativo da Idade Média, e não consegui executá-lo no Windows, tentei instalá-lo com o pacote camelbox, mas sempre recebo o erro 404.
Mohammed Noureldin 17/07
2
@MohammedNoureldin, não estou usando o Windows. Estou usando o Debian e é diretamente instalável a partir dos pacotes.
Ysdx
5

O próximo parágrafo da página de manual openvpnresponde a essa pergunta, embora não seja necessariamente claro na primeira leitura:

Como o modo de servidor OpenVPN lida com vários clientes através de uma única interface de ajuste ou toque, ele é efetivamente um roteador. O --client-to-client sinalizador diz ao OpenVPN para rotear internamente o tráfego de cliente para cliente em vez de enviar todo o tráfego de origem do cliente para a interface TUN / TAP.

Quando essa opção é usada, cada cliente "vê" os outros clientes que estão conectados no momento. Caso contrário, cada cliente verá apenas o servidor. Não use essa opção se desejar fazer o firewall do tráfego de túnel usando regras personalizadas por cliente.

A client-to-clientopção causa um curto-circuito nas tabelas de roteamento normais no servidor. Removê-lo não impede que os clientes usem as tabelas de roteamento do servidor. Se essas tabelas de roteamento - e a configuração do firewall do servidor - permitirem que os clientes se vejam, eles poderão fazer isso.

roaima
fonte
5

Você precisa fazer mais do que apenas comentar a diretiva, como diz aqui :

Remova o comentário desta diretiva para permitir que diferentes clientes possam "ver" um ao outro. Por padrão, os clientes verão apenas o servidor. Para forçar os clientes a ver apenas o servidor, você também precisará firewall adequadamente a interface TUN / TAP do servidor.

Portanto, você pode configurar uma diretiva de endereço IP separada para cada cliente. Consulte a seção Configurando regras específicas de cliente e políticas de acesso aqui: https://openvpn.net/index.php/open-source/documentation/howto.html . e aqui: https://www.sbarjatiya.com/notes_wiki/index.php/Configuring_separate_IP_and_firewall_rule_for_each_openvpn_client .

Diamant
fonte
Então isso significa o que pensei: a única maneira de conseguir isso é colocar cada cliente em sub-redes diferentes. Isso responde principalmente à pergunta, e você forneceu alguma documentação sobre como fazer isso. Vou marcar isso como a resposta. Obrigado.
Lobi