[NO SUPPORTO] OpenVPN in modalità bridged

Networking, configurazione della connessione, periferiche e condivisioni di rete.
Scrivi risposta
Avatar utente
thece
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 12949
Iscrizione: lunedì 23 aprile 2007, 14:16
Distribuzione: Debian 12 (Bookworm) - KDE

[NO SUPPORTO] OpenVPN in modalità bridged

Messaggio da thece »

:ciao:

condivido i miei appunti per l'installazione e la configurazione di OpenVPN in modalità bridged.

Sono appunti molto sintetici che ho scritto per me, non pensati per essere condivisi con altri ma, visto che recentemente l'argomento è venuto fuori in una discussione aperta da un altro utente, ho deciso di postarli, metti che qualcuno volesse divertirsi un pò a fare esperimenti di networking. :D

E' solo un esperimento! Ha dei difetti quindi è sicuramente migliorabile! E' work-in-progress??? :sgrat:

Verranno implementate e quindi collegate tramite OpenVPN le due LAN rappresentate nello schema, entrambe configurate sulla stessa rete 192.168.0.0/24.
Gli indirizzi IP verranno suddivisi funzionalmente in due parti: la LAN #1 userà solo gli indirizzi IP da 1 a 127, la LAN #2 userà solo gli indirizzi IP da 128 a 254.

La LAN #1 avrà:
- gateway: 192.168.0.1
- server DNS locale: 192.168.0.1
- server DHCP: 192.168.0.1. Questo server dovrà gestire solo gli indirizzi IP nell'intervallo 2 - 126, o un suo sottoinsieme a scelta.

L'host che farà da server OpenVPN, collocato sulla LAN #1, sarà configurato staticamente sull'indirizzo IP 192.168.0.127/24
Per questo host ho utilizzato un Raspberry Pi con sistema operativo Raspberry Pi OS basato su Debian 12 (Bookworm)

La LAN #2 avrà:
- gateway: 192.168.0.254
- server DNS locale: 192.168.0.254
- server DHCP: 192.168.0.254. Questo server dovrà gestire solo gli indirizzi IP nell'intervallo 129 - 253, o un suo sottoinsieme a scelta.

L'host che farà da client OpenVPN, collocato sulla LAN #2, sarà configurato staticamente sull'indirizzo IP 192.168.0.128/24
Per questo host ho utilizzato un notebook con sistema operativo Debian 12 (Bookworm)

Sia sul server che sul client:
- devono essere installati i pacchetti: openvpn, bridge-utils, resolvconf.
- configurerò le interfacce di rete utilizzando il file /etc/network/interfaces, quindi di fatto inibendo la gestione di queste da parte di Network Manager (installato di default)
Questa scelta è stata fatta poichè Network Manager interferisce negativamente con la corretta configurazione del bridge via script.

Installazione del server
Spoiler
Mostra

Codice: Seleziona tutto

apt install openvpn easy-rsa bridge-utils resolvconf

Inizializzazione

cd /etc/openvpn

make-cadir /etc/openvpn/easy-rsa

chmod 700 /etc/openvpn/client
chmod 700 /etc/openvpn/server

cd /etc/openvpn/easy-rsa

./easyrsa init-pki

mv /etc/openvpn/easy-rsa/vars /etc/openvpn/easy-rsa/pki/

Build CA

cd /etc/openvpn/easy-rsa

./easyrsa build-ca nopass

Build Diffie-Hellman Key

./easyrsa gen-dh

Build Server Key

./easyrsa gen-req debian.server nopass

Sign Server Key

./easyrsa sign-req server debian.server

Verify Server Key

openssl verify -CAfile pki/ca.crt pki/issued/debian.server.crt

Build Client Key

./easyrsa gen-req debian.client nopass

Sign Client Key

./easyrsa sign-req client debian.client

Verify Client Key

openssl verify -CAfile pki/ca.crt pki/issued/debian.client.crt

Build Certificate Revoking List Key

./easyrsa gen-crl

cp pki/ca.crt /etc/openvpn/server/
cp pki/crl.pem /etc/openvpn/server/
cp pki/dh.pem /etc/openvpn/server/
cp pki/issued/debian.server.crt /etc/openvpn/server/
cp pki/private/debian.server.key /etc/openvpn/server/

cp pki/ca.crt /etc/openvpn/client/
cp pki/issued/debian.client.crt /etc/openvpn/client/
cp pki/private/debian.client.key /etc/openvpn/client/

Build TA Key

cd /etc/openvpn/server
openvpn --genkey secret ta.key

Copiare il <TEMPLATE> in /etc/openvpn/server.conf

chmod 600 /etc/openvpn/server.conf

Copiare il <TEMPLATE> in '/etc/openvpn/client/debian.client.AIO.ovpn'

chown root:root /etc/openvpn/client/*
chmod 600 /etc/openvpn/client/*

Inserimento delle chiavi nel file '/etc/openvpn/client/debian.client.AIO.ovpn'

echo -e "\n<ca>" >> '/etc/openvpn/client/debian.client.AIO.ovpn'
cat /etc/openvpn/client/ca.crt >> '/etc/openvpn/client/debian.client.AIO.ovpn'
echo -e "</ca>\n" >> '/etc/openvpn/client/debian.client.AIO.ovpn'

echo -e "<cert>" >> '/etc/openvpn/client/debian.client.AIO.ovpn'
cat /etc/openvpn/client/debian.client.crt >> '/etc/openvpn/client/debian.client.AIO.ovpn'
echo -e "</cert>\n" >> '/etc/openvpn/client/debian.client.AIO.ovpn'

echo -e "<key>" >> '/etc/openvpn/client/debian.client.AIO.ovpn'
cat /etc/openvpn/client/debian.client.key >> '/etc/openvpn/client/debian.client.AIO.ovpn'
echo -e "</key>\n" >> '/etc/openvpn/client/debian.client.AIO.ovpn'

echo -e "<tls-auth>" >> '/etc/openvpn/client/debian.client.AIO.ovpn'
cat /etc/openvpn/server/ta.key >> '/etc/openvpn/client/debian.client.AIO.ovpn'
echo -e "</tls-auth>\n" >> '/etc/openvpn/client/debian.client.AIO.ovpn'

Cancellare nel file '/etc/openvpn/client/debian.client.AIO.ovpn' i tag "segnaposto"

Questo farà in modo che al client venga assegnato sempre l'indirizzo IP indicato
L'associazione viene fatta sulla base del Common Name (Subject: CN=) usato dal client

mkdir -p /etc/openvpn/ccd
chmod 755 /etc/openvpn/ccd

touch /etc/openvpn/ccd/debian.client
chmod 644 /etc/openvpn/ccd/debian.client
echo "ifconfig-push 192.168.0.128 255.255.255.0" | tee /etc/openvpn/ccd/debian.client





mkdir -p /temp
cp '/etc/openvpn/client/debian.client.AIO.ovpn' '/temp/debian.client.AIO.ovpn'
chown <USER>:<USER> '/temp/debian.client.AIO.ovpn'
chmod 600 '/temp/debian.client.AIO.ovpn'

scp <USER>@<SERVER>:"/temp/debian.client.AIO.ovpn" .





Script di attivazione e disattivazione del bridge

mkdir -p /scripts

Copiare il <TEMPLATE> in '/scripts/openVPNBridgeStart.sh

Copiare il <TEMPLATE> in '/scripts/openVPNBridgeStop.sh

chown root:root /scripts/*
chmod 700 /scripts/*





Riavviare il server e controllare ...

ip a
ip l
ip r

brctl show

cat /etc/resolv.conf

ss -tuanp | grep -i openvpn

systemctl [start|status|stop] openvpn

journalctl -b --no-pager





Reset di tutte le chiavi

rm -rf /etc/openvpn/client/*
rm -rf /etc/openvpn/server/*
rm -rf /etc/openvpn/easy-rsa/pki
rm -rf /etc/openvpn/easy-rsa/ta.key





Lista delle chiavi rilasciate

ls -l /etc/openvpn/easy-rsa/pki/issued
Installazione del client
Spoiler
Mostra

Codice: Seleziona tutto

apt install openvpn bridge-utils resolvconf





Script di attivazione e disattivazione del bridge

mkdir -p /scripts

Copiare il <TEMPLATE> in '/scripts/openVPNBridgeStart.sh

Copiare il <TEMPLATE> in '/scripts/openVPNBridgeStop.sh

chown root:root /scripts/*
chmod 700 /scripts/*





Il file di configurazione 'debian.client.AIO.ovpn' lo posso posizionare dove meglio credo, non è importante

Il client va attivato manualmente

openvpn 'debian.client.AIO.ovpn'
Template vari

Server :: template :: /etc/network/interfaces
Spoiler
Mostra

Codice: Seleziona tutto

auto lo
	iface lo inet loopback
	address 127.0.0.1
	netmask 255.0.0.0

auto eth0
	iface eth0 inet static
	address 192.168.0.127
	netmask 255.255.255.0
	gateway 192.168.0.1
	dns-nameservers 192.168.0.1 208.67.220.220 208.67.222.222

auto tap0
	iface tap0 inet manual

auto br0
	iface br0 inet manual
Server :: template :: /etc/openvpn/server.conf
Spoiler
Mostra

Codice: Seleziona tutto

proto udp

port 1194

# Interfaccia di rete per il trasporto di frame Ethernet
dev tap

script-security 2
up /scripts/openVPNBridgeStart.sh
down /scripts/openVPNBridgeStop.sh

ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/debian.server.crt
key /etc/openvpn/server/debian.server.key
dh /etc/openvpn/server/dh.pem
crl-verify /etc/openvpn/server/crl.pem
tls-auth /etc/openvpn/server/ta.key 0

remote-cert-tls client

server-bridge 192.168.0.127 255.255.255.0 192.168.0.128 192.168.0.129
client-to-client

client-config-dir /etc/openvpn/ccd

keepalive 10 120

cipher AES-256-GCM

user nobody
group nogroup

persist-key
persist-tun

status /etc/openvpn/openvpn-status.log
log /etc/openvpn/openvpn.log
verb 3
Server :: template :: /scripts/openVPNBridgeStart.sh
Spoiler
Mostra

Codice: Seleziona tutto

#!/bin/bash

# ATTENZIONE: disabilitare la gestione dell'interfaccia di rete $ETH in Network Manager

BR="br0"

ETH="eth0"
ETH_IP_ADDRESS_NETMASK="192.168.0.127/24"
ETH_BROADCAST="192.168.0.255"
ETH_GATEWAY="192.168.0.1"

# Esempio TAP="tap0 tap1 tap2"
TAP="tap0"

DNS_SERVER_1="192.168.0.1"
DNS_SERVER_2="208.67.220.220"
DNS_SERVER_3="208.67.222.222"

for T in $TAP; do
	openvpn --mktun --dev $T
done

brctl addbr $BR

brctl addif $BR $ETH

for T in $TAP; do
	brctl addif $BR $T
done

for T in $TAP; do
	ip address flush dev $T
	ip link set $T promisc on up
done

ip address flush dev $ETH
ip link set $ETH promisc on up

ip address add $ETH_IP_ADDRESS_NETMASK broadcast $ETH_BROADCAST dev $BR
ip link set $BR up

ip route add default via $ETH_GATEWAY

echo -e "nameserver $DNS_SERVER_1\nnameserver $DNS_SERVER_2\nnameserver $DNS_SERVER_3" | tee /etc/resolv.conf
Server :: template :: /scripts/openVPNBridgeStop.sh
Spoiler
Mostra

Codice: Seleziona tutto

#!/bin/bash

# ATTENZIONE: disabilitare la gestione dell'interfaccia di rete $ETH in Network Manager

BR="br0"

ETH="eth0"
ETH_IP_ADDRESS_NETMASK="192.168.0.127/24"
ETH_BROADCAST="192.168.0.255"
ETH_GATEWAY="192.168.0.1"

# Esempio TAP="tap0 tap1 tap2"
TAP="tap0"

DNS_SERVER_1="192.168.0.1"
DNS_SERVER_2="208.67.220.220"
DNS_SERVER_3="208.67.222.222"

ip link set $BR down

brctl delif $BR $ETH

for T in $TAP; do
	brctl delif $BR $T
done

brctl delbr $BR

for T in $TAP; do
	ip link set $T down
	openvpn --rmtun --dev $T
done

ip link set $ETH promisc off down
ip address add $ETH_IP_ADDRESS_NETMASK broadcast $ETH_BROADCAST dev $ETH
ip link set $ETH up

ip route add default via $ETH_GATEWAY

echo -e "nameserver $DNS_SERVER_1\nnameserver $DNS_SERVER_2\nnameserver $DNS_SERVER_3" | tee /etc/resolv.conf
Client :: template :: /etc/network/interfaces
Spoiler
Mostra

Codice: Seleziona tutto

auto lo
	iface lo inet loopback
	address 127.0.0.1
	netmask 255.0.0.0

auto eth0
	iface eth0 inet static
	address 192.168.0.128
	netmask 255.255.255.0
	gateway 192.168.0.254
	dns-nameservers 192.168.0.254 208.67.220.220 208.67.222.222

auto tap0
	iface tap0 inet manual

auto br0
	iface br0 inet manual
Client :: template :: debian.client.AIO.ovpn
Spoiler
Mostra

Codice: Seleziona tutto

client

proto udp

# Interfaccia di rete per il trasporto di frame Ethernet
dev tap

remote AAA.BBB.CCC.DDD
port 1194

resolv-retry infinite
nobind
persist-key
persist-tun

remote-cert-tls server

cipher AES-256-GCM
data-ciphers 'AES-256-GCM'

key-direction 1

verb 3

# Abilitazione dello scripting
# Lo script update-resolv-conf si basa sul pacchetto resolvconf. Assicurarsi che tale pacchetto sia installato
script-security 2
up /scripts/openVPNBridgeStart.sh
down /scripts/openVPNBridgeStop.sh

<ca>
...
</ca>

<cert>
...
</cert>

<key>
...
</key>

<tls-auth>
...
</tls-auth>
Client :: template :: /scripts/openVPNBridgeStart.sh
Spoiler
Mostra

Codice: Seleziona tutto

#!/bin/bash

# ATTENZIONE: disabilitare la gestione dell'interfaccia di rete $ETH in Network Manager

BR="br0"

ETH="eth0"
ETH_IP_ADDRESS_NETMASK="192.168.0.128/24"
ETH_BROADCAST="192.168.0.255"
ETH_GATEWAY="192.168.0.254"

# Esempio TAP="tap0 tap1 tap2"
TAP="tap0"

DNS_SERVER_1="192.168.0.254"
DNS_SERVER_2="208.67.220.220"
DNS_SERVER_3="208.67.222.222"

for T in $TAP; do
	openvpn --mktun --dev $T
done

brctl addbr $BR

brctl addif $BR $ETH

for T in $TAP; do
	brctl addif $BR $T
done

for T in $TAP; do
	ip address flush dev $T
	ip link set $T promisc on up
done

ip address flush dev $ETH
ip link set $ETH promisc on up

ip address add $ETH_IP_ADDRESS_NETMASK broadcast $ETH_BROADCAST dev $BR
ip link set $BR up

ip route add default via $ETH_GATEWAY

echo -e "nameserver $DNS_SERVER_1\nnameserver $DNS_SERVER_2\nnameserver $DNS_SERVER_3" | tee /etc/resolv.conf
Client :: template :: /scripts/openVPNBridgeStop.sh
Spoiler
Mostra

Codice: Seleziona tutto

#!/bin/bash

# ATTENZIONE: disabilitare la gestione dell'interfaccia di rete $ETH in Network Manager

BR="br0"

ETH="eth0"
ETH_IP_ADDRESS_NETMASK="192.168.0.128/24"
ETH_BROADCAST="192.168.0.255"
ETH_GATEWAY="192.168.0.254"

# Esempio TAP="tap0 tap1 tap2"
TAP="tap0"

DNS_SERVER_1="192.168.0.254"
DNS_SERVER_2="208.67.220.220"
DNS_SERVER_3="208.67.222.222"

ip link set $BR down

brctl delif $BR $ETH

for T in $TAP; do
	brctl delif $BR $T
done

brctl delbr $BR

for T in $TAP; do
	ip link set $T down
	openvpn --rmtun --dev $T
done

ip link set $ETH promisc off down
ip address add $ETH_IP_ADDRESS_NETMASK broadcast $ETH_BROADCAST dev $ETH
ip link set $ETH up

ip route add default via $ETH_GATEWAY

echo -e "nameserver $DNS_SERVER_1\nnameserver $DNS_SERVER_2\nnameserver $DNS_SERVER_3" | tee /etc/resolv.conf

Problema noto:

avere due server DHCP attivi su un'unica rete NON è una bella cosa! Potrebbero regalare qualche sorpresa del tipo: che succede se, dopo che si è stabilito il bridge (VPN) fra le due LAN, un host collocato sulla LAN #2 riceve via DHCP la configurazione di rete per la LAN #1?
Suggerimento:

Codice: Seleziona tutto

nmap --script broadcast-dhcp-discover
Allegati
network.png
Scrivi risposta

Ritorna a “Connessione e configurazione delle reti”

Chi c’è in linea

Visualizzano questa sezione: Bing [Bot] e 1 ospite