Como fazer o OpenVPN escutar as portas TCP e UDP

13

Eu procurei e a única coisa que encontrei é que "sim, o OpenVPN suporta conexões via TCP" , mas não encontrei nenhuma maneira de coagir o servidor openvpn a escutar a mesma porta nos dois protocolos ao mesmo tempo . Encontrei alguns guias muito antigos sobre a criação de interfaces de toque ou a recomendação de ter outra instância do servidor com a mesma configuração em execução ao mesmo tempo. O primeiro parece muito complicado para algo simples, e o último parece obsoleto.

Braiam
fonte

Respostas:

11

O mesmo processo openvpn não pode escutar nos soquetes UDP e TCP ao mesmo tempo.

Você tem duas boas opções:

  1. use duas interfaces de toque para openvpn. Tenha dois processos de servidor openvpn, um para cada interface de toque; um deve ouvir no UDP, o outro no TCP. Faça a ponte dessas duas interfaces de toque no servidor.

  2. use duas interfaces tun. Elas não podem ser conectadas em ponte; portanto, se você quiser compartilhar o espaço IP entre clientes TCP e UDP, precisará usar um learn-addressscript como o http://thomas.gouverneur.name/2014/02/openvpn- listen-on-tcp-and-udp-with-tun / (no entanto, esse script específico é vulnerável a um ataque de link simbólico / tmp, remova o log de / tmp se você o usar).

A terceira opção é apenas executar duas instâncias do openvpn e atribuir espaço IP do cliente separado para ambas (por exemplo, um / 25 da mesma sub-rede / 24 cada). Isso evita a ponte e a necessidade de um script de endereço de aprendizado.

EDIT: como eu mesmo precisava de um script de endereço de aprendizado, escrevi um. Coloco-o em domínio público.

#!/bin/sh
#
# This script allows an openvpn server with several openvpn instances that
# use tun interfaces to share client IP space by adjusting the routing table
# to create entries towards specific clients as needed

action="$1"
addr="$2"
cn="$3" # not used, but it's there; you could e.g. log it

case "$action" in
        add)
                echo "sudo ip ro add $addr/32 dev $dev" >&2
                exec sudo ip ro add $addr/32 dev $dev
                ;;
        delete)
                echo "sudo ip ro del $addr/32 dev $dev" >&2
                sudo ip ro del $addr/32
                exit 0 # ignore errors
                ;;
        update)
                echo "sudo ip ro change $addr/32 dev $dev" >&2
                exec sudo ip ro change $addr/32 dev $dev
                ;;
esac

Este script registra no stderr, que deve terminar no log do openvpn.

András Korn
fonte
4

Se você deseja que o servidor OpenVPN escute em uma porta TCP em vez de uma porta UDP, use em proto tcpvez de proto udp(Se você deseja que o OpenVPN escute em uma porta UDP e TCP, você deve executar duas instâncias OpenVPN separadas).

Você quer dizer que esta página está obsoleta?

Eu acho que você pode executar dois servidores OpenVPN (um para TCP, outro para UDP), ponte cada um deles com um TUN e, em seguida, conecte-os.

nodakai
fonte
1
tuninterfaces não têm uma camada MAC e, portanto, não podem ser membros de uma ponte. Se você deseja fazer uma ponte, precisa usar tapinterfaces.
András Korn