Le but de ce petit tip sera d'utiliser au mieux les scripts de démarrage et la configuration d'OpenVPN sur une debian pour un serveur OpenVPN.

Il se trouve que vous êtes souvent en balade, chez des clients, et que vous ne savez pas toujours à l'avance quels seront les ports “ouverts” à travers lesquels vous pourrez vous connecter à votre serveur OpenVPN convivial et ainsi bénéficier pleinement de l'interweb sans filtrage.
Pour se faire, vous avez besoin que votre serveur OpenVPN écoute sur plusieurs ports, ce qui implique d'avoir plusieurs configurations spécifiant le protocole (udp vs tcp) et le port d'écoute mais cela devient très vite relou de gérer plusieurs configurations complètes alors que le but est d'utiliser exactement les mêmes certificats sur des ports d'écoute différents !

Le fichier de configuration commun

Ce fichier, appelé server.common, est le fichier d'origine (habituel) duquel il faut supprimer ou commenter tout ce qui est :

  1. port
  2. proto
  3. server IP NM
  4. status

Voici le mien, purgé des commentaires (oui j'utilise un fichier de CRL ;P) :

local A.B.C.D
dev tun
ca certs/ca.crt
cert certs/server.crt
key certs/server.key  # This file should be kept secret
dh certs/dh1024.pem
crl-verify certs/crl.pem
ifconfig-pool-persist ipp.txt
client-config-dir ccd
client-to-client
keepalive 10 120
tls-auth certs/ta.key 0 # This file is secret
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
log         openvpn.log
log-append  openvpn.log
verb 4

Les fichiers de configurations des "listeners"

Le but maintenant, est d'avoir un fichier de configuration des différents listeners d'OpenVPN le plus simple possible reprenant les éléments exclus du fichier server.common :

  1. port
  2. proto
  3. server IP NM

Le cas du fichier de status ne sera pas indiqué ici puisqu'il est géré automatiquement par les scripts OpenVPN de debian.

Pour plus de clareté, et parce que les noms des fichiers de configurations sont repris dans les logs, j'ai pris le parti d'appeler ces fichiers de la manière suivante :

{u(dp)|t(cp)}<port>.conf

ce qui donne u53.conf pour “port 53 en udp” contenant :

config server.common
port 53
proto udp
server 192.168.X.0 255.255.255.0

ou encore t443.conf pour “port 443 en tcp” contenant :

config server.common
port 443
proto tcp
server 192.168.Z.0 255.255.255.0

Dans mon cas, j'ai décidé d'avoir 4 listeners :

  1. udp 1194, le port par défaut d'OpenVPN 2.x
  2. udp 53 (dns)
  3. tcp 80 (http)
  4. tcp 443 (https)

J'ai donc 4 fichiers de configurations :

  1. u1194.conf
  2. u53.conf
  3. t80.conf
  4. t443.conf

Reprenant les 3 directives de configuration qui leur sont propres :

  1. port
  2. proto
  3. server

Et le source du fichier commun

  1. config server.common

Le cas du fichier de status

Le script /etc/init.d/openvpn gère ce fichier de la manière suivante :

# prepare default status file
      STATUSARG="--status /var/run/openvpn.$NAME.status $STATUSREFRESH"

Donc chaque configuration trouvée dans /etc/openvpn/*.conf aura son propre fichier de status, dont le nom sera basé sur le nom de la configuration.

Lançons tout ca, et regardons ce qu'il se passe

# /etc/init.d/openvpn start
Starting virtual private network daemon: t443 t80 u1194 u53.

# lsof
openvpn  15207      nobody    6u  IPv4  45949       TCP A.B.C.D:443 (LISTEN)
openvpn  15218      nobody    6u  IPv4  45973       TCP A.B.C.D:80 (LISTEN)
openvpn  15228      nobody    6u  IPv4  45995       UDP A.B.C.D:1194
openvpn  15238      nobody    6u  IPv4  46017       UDP A.B.C.D:53

# ls -al /var/run
-rw-r--r--  1 root        root           6 2009-08-16 16:16 openvpn.t443.pid
-rw-------  1 root        root         232 2009-08-16 17:08 openvpn.t443.status
-rw-r--r--  1 root        root           6 2009-08-16 16:16 openvpn.t80.pid
-rw-------  1 root        root         232 2009-08-16 17:08 openvpn.t80.status
-rw-r--r--  1 root        root           6 2009-08-16 16:16 openvpn.u1194.pid
-rw-------  1 root        root         232 2009-08-16 17:08 openvpn.u1194.status
-rw-r--r--  1 root        root           6 2009-08-16 16:16 openvpn.u53.pid
-rw-------  1 root        root         232 2009-08-16 17:08 openvpn.u53.status

Un petit ifconfig vous confirmera que vous avez bien 4 interfaces tun, chacune en charge d'un réseau différent qu'il ne faudra pas oublier de natter correctement :D

Conclusion

Vous avez donc un serveur OpenVPN qui écoute sur plusieurs ports / protocoles différents mais utilisant exactement la même configuration de vos certificats, chacun de vos clients OpenVPN pourra se connecter sur n'importe lequel de ces ports via une adaptation minime de sa configuration.

Changelog

  • 2009/09/19 modif config server.common – merci pnl
  • 2009/08/19 Version Initiale – /Kb
linux/openvpn_multi-listeners_debian.txt · Last modified: 2010/01/12 13:29 (external edit)