Se mostrará como instalar OpenVPN y como evadir los Firewall que suelen usar Deep Packet Inspection para identificar el tipo de protocolo que son los paquetes, muchos de estos suelen bloquear las conexiones VPN, el funcionamiento se basa en identificar el handshake de OpenVPN entonces si logramos ofuscar el handshake podemos saltarnos esa restricción, por suerte se implemento tls-crypt-v2 lo que reduce significativamente la dificultad.
Instalacion
Lo primero es instalar openvpn y easy-rsa
sudo apt install openvpn easy-rsa
Lo primero configuramos easyrsa
cp -r /usr/share/easy-rsa /etc/
cd /etc/easy-rsa/
./easyrsa init-pki
Generamos el certificado y la clave de la autoridad de certificación
cd /etc/easy-rsa/
./easyrsa build-ca nopass
./easyrsa gen-dh
./easyrsa build-server-full server nopass
openvpn --genkey secret /etc/easy-rsa/pki/ta.key
./easyrsa gen-crl
cp -rp /etc/easy-rsa/pki/{ca.crt,dh.pem,ta.key,crl.pem,issued,private}
/etc/openvpn/server/
Creacion del handshake encryption [tls-crypt-v2]
Entonces nos ubicamos en
cd /etc/openvpn/server
Para generar el cifrado o el cifrado de handsacke para el lado del server es
openvpn --genkey tls-crypt-v2-server handshake_encryption_server.key
Para el lado del cliente es
openvpn --tls-crypt-v2 handshake_encryption_server.key --genkey tls-crypt-v2-client handshake_encryption_client.key
Creacion de los cientes para openvpn
para este caso nos debemos ubicar en la carpeta que copiamos de easyrsa
cd /etc/easy-rsa
./easyrsa build-client-full User1 nopass
./easyrsa build-client-full User2 nopass
Ahora vamos a copiar a los usuarios a la carpeta de openvpn, cada uno en su respectiva carpeta
mkdir /etc/openvpn/client/{User1,User2}
cp -rp /etc/easy-rsa/pki/{ca.crt,issued/User1.crt,private/User1.key} /etc/openvpn/client/User1
cp -rp /etc/easy-rsa/pki/{ca.crt,issued/User2.crt,private/User2.key} /etc/openvpn/client/User2
Editar la configuracion
En este caso es mas facil usar la plantilla de configuracion de OpenVPN
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server/
cd /etc/openvpn/server/
Ubicamos los siguientes parámetros y los modificamos un ejemplo:
ca ca.crt
cert issued/server.crt
key private/server.key # This file should be kept secret
dh dh.pem
tls-crypt-v2 handshake_encryption_server.key
push "dhcp-option DNS 1.1.1.1"
tls-auth ta.key 0
log-append /var/log/openvpn/openvpn.log
server-ipv6 fd93:b56d:6365::/64
push "dhcp-option DNS6 2606:4700:4700::1111"
push "dhcp-option DNS6 2606:4700:4700::1001"
push "redirect-gateway ipv6 def1 bypass-dhcp"
push "route-ipv6 fd93:b56d:6365::/64"
Ejecutamos este comando para hablilitar el server y verificamos que este funcionando
sudo systemctl start openvpn-server@server.service
root@i:/etc/openvpn/server# sudo service openvpn-server@server status
● openvpn-server@server.service - OpenVPN service for server
Loaded: loaded (/usr/lib/systemd/system/openvpn-server@.service; disabled; preset: enabled)
Active: active (running) since Wed 2024-10-23 00:55:49 UTC; 4min 39s ago
Docs: man:openvpn(8)
https://openvpn.net/community-resources/reference-manual-for-openvpn-2-6/
https://community.openvpn.net/openvpn/wiki/HOWTO
Main PID: 20333 (openvpn)
Status: "Initialization Sequence Completed"
Tasks: 1 (limit: 482)
Memory: 1.4M (peak: 1.7M)
CPU: 32ms
CGroup: /system.slice/system-openvpn\x2dserver.slice/openvpn-server@server.service
└─20333 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --config server.conf
Oct 23 00:55:48 Server systemd[1]: Starting openvpn-server@server.service - OpenVPN service for server...
Oct 23 00:55:49 Server systemd[1]: Started openvpn-server@server.service - OpenVPN service for server.
Crear el ovpn
Los archivospara crear el .ovpn estan en /etc/openvpn/client/User1
root@Server:/etc/openvpn/client/User1# ls
User1.crt User1.key ca.crt
lo mismo con tls-crypt-v2 es el archivo que creamos como handshake_encryption_client.key
cat handshake_encryption_client.key
-----BEGIN OpenVPN tls-crypt-v2 client key-----
pKYdZklpqoO/XhsJnzn/RX7zTPsqLxgL+0PG3tuzqwyX27IscNXeViVwCwWAYwHU
IdvcrL6AgxgA22QQ.............
-----END OpenVPN tls-crypt-v2 client key-----
Creación del .ovpn
para crear el archivo de ovpn se debe usar el siguiente formato y solo modificar los campos de las claves, certificados y remote.
client
dev tun
proto udp
remote address port
resolv-retry infinite
nobind
persist-key
persist-tun
verb 4
data-ciphers-fallback AES-128-CBC
data-ciphers AES-256-CBC:AES-256-CFB:AES-256-CFB1:AES-256-CFB8:AES-256-OFB:AES-256-GCM
tls-cipher "DEFAULT:@SECLEVEL=0"
auth SHA256
key-direction 1
<ca>
-----BEGIN CERTIFICATE-----
MIIDSzCCAjOgAwIBAgIUAbBDafoK+M02UQCliU5DLxMZ2hQwDQYJKoZIhvcNAQEL
BQAwFjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0EwHhcNMjQxMDIzMDAxODI1WhcNMz....
-----END CERTIFICATE-----
</ca>
<cert>
Certificate:
Data:......
-----BEGIN CERTIFICATE-----
MIIDUzCCAjugAwIBAgIQKEeHa0xsNPRzkQFHiHubCTANBgkqhkiG9w0BAQsFADAW.........
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDe8LAxZblRxaDj
8NEaq0Mq4.......
-----END PRIVATE KEY-----
</key>
<tls-crypt-v2>
-----BEGIN OpenVPN tls-crypt-v2 client key-----
pKYdZklpqoO/XhsJnzn/RX7zTPsqLxgL+0PG3tuzqwyX27IscNXeViVwCwWAYwHU.
Idvc.................
-----END OpenVPN tls-crypt-v2 client key-----
</tls-crypt-v2>
sysctl net.ipv4.ip_forward=1
iptables -t nat -I POSTROUTING -o ens5 -j MASQUERADE
Deteccion por Deep Packet Inspection (DPI)
Los firewall usan Deep Packet Inspection para reconocer ciertos protocolos
Desde ver el SNI en el Hello Client, identificar P2P, SSH, QUIC, etc.
En este caso se detectó la conexión de openvpn y esto se debe a que el handshake tiene patrones muy reconocibles.
Lo primero que tenemos que hacer es cambiar el puerto porque el puerto default es de openvpn.
en la configuración usamos tls-crypt-v2 que nos permite ofuscar el handshake de openvpn.
podemos ver la documentacion de tls-crypt-v2
https://github.com/OpenVPN/openvpn/blob/master/doc/tls-crypt-v2.txt
ls-crypt-v2 uses an encrypted cookie mechanism to introduce client-specific tls-crypt keys without introducing a lot of server-side state. The client-specific key is encrypted using a server key. The server key is the same for all servers in a group. When a client connects, it first sends the encrypted key to the server, such that the server can decrypt the key and all messages can thereafter be encrypted using the client-specific key.
A wrapped (encrypted and authenticated) client-specific key can also contain metadata. The metadata is wrapped together with the key, and can be used to allow servers to identify clients and/or key validity. This allows the server to abort the connection immediately after receiving the first packet, rather than performing an entire TLS handshake. Aborting the connection this early greatly improves the DoS resilience and reduces attack surface against malicious clients that have the tls-crypt or tls-auth key. This is particularly relevant for large deployments (think lost key or disgruntled employee) and VPN providers (clients are not trusted).
Una vez que usamos tls-crypt-v2 ya no es detecatdo por el Deep Packet Inspection