Cryptographie et tunnel OpenVPN
08/02/2005
 Christian CALECA 
Liste des cours

OpenVPN simple

Accueil ] [ Avant propos ] [ Les clés du chiffrement ] [ Méthodes ] [ OpenVPN simple ] [ OpenSSL ] [ Tunnel sécurisé ] [ Applications ]


La plate-forme de tests

Deux machines disposent d'une connexion internet.

L'une s'appelle AARON, elle dispose d'une adresse IP publique fixe : 82.127.57.95.

L'autre s'appelle CYCLOPE, et dispose d'une adresse IP dynamique : 80.8.135.67, au moment de ce premier test.

Les deux machines sont des Debian Sarge (testing), avec un kernel 2.6. En effet, OpenVPN ne figure pas dans l'actuelle version stable (Woody). D'autres distributions, comme Mandrake ou Fedora Core feraient aussi parfaitement l'affaire. Si vous utilisez un kernel 2.4, il vous faudra installer le support de TUN/TAP, qui permet à l'espace utilisateur d'accéder aux interfaces réseaux, ce support est nativement inclus dans 2.6.

aaron:~# apt-get install openvpn
Reading Package Lists... Done
Building Dependency Tree... Done
The following NEW packages will be installed:
  openvpn
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 166kB of archives.
After unpacking 463kB of additional disk space will be used.
Get:1 ftp://ftp.fr.debian.org testing/main openvpn 1.6.0-3 [166kB]
Fetched 166kB in 12s (13.1kB/s)
Preconfiguring packages ...
Selecting previously deselected package openvpn.
(Reading database ... 21897 files and directories currently installed.)
Unpacking openvpn (from .../openvpn_1.6.0-3_i386.deb) ...
Setting up openvpn (1.6.0-3) ...
Stopping openvpn:.
Starting openvpn:.

Le script d'installation vous pose deux questions :

Tant qu'on y est, vérifions la présence de la librairie de compression LZO, qui vas nous permettre d'optimiser le débit du tunnel :

aaron:~# dpkg -l | grep lzo
ii  liblzo1        1.08-1         A real-time data compression library
aaron:~#

Elle y est. Sinon, un "apt-get install liblzo1" y remédiera.

Comme nous n'avons pour l'instant aucune configuration d'OpenVPN, bien que l'installation ait indiqué :

Starting openvpn:.

Rien n'a démarré. Pour l'instant, nous faisons des choses simples, nous allons monter un tunnel "à la main", juste pour voir.

OpenVPN travaille en "client/serveur". Autrement dit, l'une des extrémités sera en écoute permanente l'autre établira le tunnel au moment du besoin.

Démarrage du serveur

Sur AARON, qui dispose d'une adresse IP fixe,  nous démarrons le serveur :

aaron:~# openvpn --port 8147 --dev tun1 --ifconfig 192.168.25.1 192.168.25.2 \
--comp-lzo --verb 5

Quelques mots d'explication sur cette ligne de commande :

-- port 8147, c'est le port qui sera utilisé pour supporter le tunnel,

--dev tun1, l'interface réseau virtuelle qui constitue en quelque sorte le bout du tunnel côté serveur,

--ifconfig 192.168.25.1 192.168.25.2, va permettre d'attribuer les adresses IP à chaque bout du tunnel :

192.168.25.1 côté local,

192.168.25.2 côté distant

--comp-lzo pour indiquer que l'on utilise la compression en temps réel LZO

--verb 5, c'est le niveau de bavardage que l'on souhaite pour OpenVPN. Le niveau 5 est relativement bavard, comme l'indique la suite :

Sat Jun 26 14:58:37 2004 0[0]: Current Parameter Settings:
Sat Jun 26 14:58:37 2004 1[0]:   config = '[UNDEF]'
Sat Jun 26 14:58:37 2004 2[0]:   persist_config = DISABLED
Sat Jun 26 14:58:37 2004 3[0]:   persist_mode = 1
Sat Jun 26 14:58:37 2004 4[0]:   show_ciphers = DISABLED
Sat Jun 26 14:58:37 2004 5[0]:   show_digests = DISABLED
Sat Jun 26 14:58:37 2004 6[0]:   genkey = DISABLED
Sat Jun 26 14:58:37 2004 7[0]:   askpass = DISABLED
Sat Jun 26 14:58:37 2004 8[0]:   show_tls_ciphers = DISABLED
Sat Jun 26 14:58:37 2004 9[0]:   proto = 0
Sat Jun 26 14:58:37 2004 10[0]:   local = '[UNDEF]'
Sat Jun 26 14:58:37 2004 11[0]:   remote = '[UNDEF]'
Sat Jun 26 14:58:37 2004 12[0]:   local_port = 8147
Sat Jun 26 14:58:37 2004 13[0]:   remote_port = 8147
Sat Jun 26 14:58:37 2004 14[0]:   remote_float = DISABLED
Sat Jun 26 14:58:37 2004 15[0]:   ipchange = '[UNDEF]'
Sat Jun 26 14:58:37 2004 16[0]:   bind_local = ENABLED
Sat Jun 26 14:58:37 2004 17[0]:   dev = 'tun1'
Sat Jun 26 14:58:37 2004 18[0]:   dev_type = '[UNDEF]'
Sat Jun 26 14:58:37 2004 19[0]:   dev_node = '[UNDEF]'
Sat Jun 26 14:58:37 2004 20[0]:   tun_ipv6 = DISABLED
Sat Jun 26 14:58:37 2004 21[0]:   ifconfig_local = '192.168.25.1'
Sat Jun 26 14:58:37 2004 22[0]:   ifconfig_remote_netmask = '192.168.25.2'
Sat Jun 26 14:58:37 2004 23[0]:   ifconfig_noexec = DISABLED
Sat Jun 26 14:58:37 2004 24[0]:   ifconfig_nowarn = DISABLED
Sat Jun 26 14:58:37 2004 25[0]:   shaper = 0
Sat Jun 26 14:58:37 2004 26[0]:   tun_mtu = 1300
Sat Jun 26 14:58:37 2004 27[0]:   tun_mtu_defined = DISABLED
Sat Jun 26 14:58:37 2004 28[0]:   link_mtu = 1300
Sat Jun 26 14:58:37 2004 29[0]:   link_mtu_defined = ENABLED
Sat Jun 26 14:58:37 2004 30[0]:   tun_mtu_extra = 0
Sat Jun 26 14:58:37 2004 31[0]:   tun_mtu_extra_defined = DISABLED
Sat Jun 26 14:58:37 2004 32[0]:   fragment = 0
Sat Jun 26 14:58:37 2004 33[0]:   mtu_discover_type = -1
Sat Jun 26 14:58:37 2004 34[0]:   mtu_test = 0
Sat Jun 26 14:58:37 2004 35[0]:   mlock = DISABLED
Sat Jun 26 14:58:37 2004 36[0]:   inactivity_timeout = 0
Sat Jun 26 14:58:37 2004 37[0]:   ping_send_timeout = 0
Sat Jun 26 14:58:37 2004 38[0]:   ping_rec_timeout = 0
Sat Jun 26 14:58:37 2004 39[0]:   ping_rec_timeout_action = 0
Sat Jun 26 14:58:37 2004 40[0]:   ping_timer_remote = DISABLED
Sat Jun 26 14:58:37 2004 41[0]:   persist_tun = DISABLED
Sat Jun 26 14:58:37 2004 42[0]:   persist_local_ip = DISABLED
Sat Jun 26 14:58:37 2004 43[0]:   persist_remote_ip = DISABLED
Sat Jun 26 14:58:37 2004 44[0]:   persist_key = DISABLED
Sat Jun 26 14:58:37 2004 45[0]:   mssfix_defined = DISABLED
Sat Jun 26 14:58:37 2004 46[0]:   mssfix = 0
Sat Jun 26 14:58:37 2004 47[0]:   passtos = DISABLED
Sat Jun 26 14:58:37 2004 48[0]:   resolve_retry_seconds = 0
Sat Jun 26 14:58:37 2004 49[0]:   connect_retry_seconds = 5
Sat Jun 26 14:58:37 2004 50[0]:   username = '[UNDEF]'
Sat Jun 26 14:58:37 2004 51[0]:   groupname = '[UNDEF]'
Sat Jun 26 14:58:37 2004 52[0]:   chroot_dir = '[UNDEF]'
Sat Jun 26 14:58:37 2004 53[0]:   cd_dir = '[UNDEF]'
Sat Jun 26 14:58:37 2004 54[0]:   writepid = '[UNDEF]'
Sat Jun 26 14:58:37 2004 55[0]:   up_script = '[UNDEF]'
Sat Jun 26 14:58:37 2004 56[0]:   down_script = '[UNDEF]'
Sat Jun 26 14:58:37 2004 57[0]:   up_restart = DISABLED
Sat Jun 26 14:58:37 2004 58[0]:   daemon = DISABLED
Sat Jun 26 14:58:37 2004 59[0]:   inetd = 0
Sat Jun 26 14:58:37 2004 60[0]:   log = DISABLED
Sat Jun 26 14:58:37 2004 61[0]:   nice = 0
Sat Jun 26 14:58:37 2004 62[0]:   verbosity = 5
Sat Jun 26 14:58:37 2004 63[0]:   mute = 0
Sat Jun 26 14:58:37 2004 64[0]:   gremlin = DISABLED
Sat Jun 26 14:58:37 2004 65[0]:   occ = ENABLED
Sat Jun 26 14:58:37 2004 66[0]:   http_proxy_server = '[UNDEF]'
Sat Jun 26 14:58:37 2004 67[0]:   http_proxy_port = 0
Sat Jun 26 14:58:37 2004 68[0]:   http_proxy_auth_method = '[UNDEF]'
Sat Jun 26 14:58:37 2004 69[0]:   http_proxy_auth_file = '[UNDEF]'
Sat Jun 26 14:58:37 2004 70[0]:   http_proxy_retry = DISABLED
Sat Jun 26 14:58:37 2004 71[0]:   socks_proxy_server = '[UNDEF]'
Sat Jun 26 14:58:37 2004 72[0]:   socks_proxy_port = 0
Sat Jun 26 14:58:37 2004 73[0]:   socks_proxy_retry = DISABLED
Sat Jun 26 14:58:37 2004 74[0]:   comp_lzo = ENABLED
Sat Jun 26 14:58:37 2004 75[0]:   comp_lzo_adaptive = ENABLED
Sat Jun 26 14:58:37 2004 76[0]:   route_script = '[UNDEF]'
Sat Jun 26 14:58:37 2004 77[0]:   route_default_gateway = '[UNDEF]'
Sat Jun 26 14:58:37 2004 78[0]:   route_noexec = DISABLED
Sat Jun 26 14:58:37 2004 79[0]:   route_delay = 0
Sat Jun 26 14:58:37 2004 80[0]:   route_delay_defined = DISABLED
Sat Jun 26 14:58:37 2004 81[0]:   shared_secret_file = '[UNDEF]'
Sat Jun 26 14:58:37 2004 82[0]:   key_direction = 0
Sat Jun 26 14:58:37 2004 83[0]:   ciphername_defined = ENABLED
Sat Jun 26 14:58:37 2004 84[0]:   ciphername = 'BF-CBC'
Sat Jun 26 14:58:37 2004 85[0]:   authname_defined = ENABLED
Sat Jun 26 14:58:37 2004 86[0]:   authname = 'SHA1'
Sat Jun 26 14:58:37 2004 87[0]:   keysize = 0
Sat Jun 26 14:58:37 2004 88[0]:   replay = ENABLED
Sat Jun 26 14:58:37 2004 89[0]:   replay_window = 64
Sat Jun 26 14:58:37 2004 90[0]:   replay_time = 15
Sat Jun 26 14:58:37 2004 91[0]:   packet_id_file = '[UNDEF]'
Sat Jun 26 14:58:37 2004 92[0]:   use_iv = ENABLED
Sat Jun 26 14:58:37 2004 93[0]:   test_crypto = DISABLED
Sat Jun 26 14:58:37 2004 94[0]:   tls_server = DISABLED
Sat Jun 26 14:58:37 2004 95[0]:   tls_client = DISABLED
Sat Jun 26 14:58:37 2004 96[0]:   key_method = 1
Sat Jun 26 14:58:37 2004 97[0]:   ca_file = '[UNDEF]'
Sat Jun 26 14:58:37 2004 98[0]:   dh_file = '[UNDEF]'
Sat Jun 26 14:58:37 2004 99[0]:   cert_file = '[UNDEF]'
Sat Jun 26 14:58:37 2004 100[0]:   priv_key_file = '[UNDEF]'
Sat Jun 26 14:58:37 2004 101[0]:   cipher_list = '[UNDEF]'
Sat Jun 26 14:58:37 2004 102[0]:   tls_verify = '[UNDEF]'
Sat Jun 26 14:58:37 2004 103[0]:   tls_remote = '[UNDEF]'
Sat Jun 26 14:58:37 2004 104[0]:   crl_file = '[UNDEF]'
Sat Jun 26 14:58:37 2004 105[0]:   tls_timeout = 2
Sat Jun 26 14:58:37 2004 106[0]:   renegotiate_bytes = 0
Sat Jun 26 14:58:37 2004 107[0]:   renegotiate_packets = 0
Sat Jun 26 14:58:37 2004 108[0]:   renegotiate_seconds = 3600
Sat Jun 26 14:58:37 2004 109[0]:   handshake_window = 60
Sat Jun 26 14:58:37 2004 110[0]:   transition_window = 3600
Sat Jun 26 14:58:37 2004 111[0]:   single_session = DISABLED
Sat Jun 26 14:58:37 2004 112[0]:   tls_auth_file = '[UNDEF]'
Sat Jun 26 14:58:37 2004 113[0]: OpenVPN 1.6.0 i386-pc-linux-gnu [SSL] [LZO] [PTHREAD] built on Jun 10 2004
Sat Jun 26 14:58:37 2004 114[0]: ******* WARNING *******: all encryption and authentication features disabled 
                                 -- all data will be tunnelled as cleartext
Sat Jun 26 14:58:37 2004 115[0]: LZO compression initialized
Sat Jun 26 14:58:38 2004 116[0]: TUN/TAP device tun1 opened
Sat Jun 26 14:58:38 2004 117[0]: /sbin/ifconfig tun1 192.168.25.1 pointopoint 192.168.25.2 mtu 1299
Sat Jun 26 14:58:38 2004 118[0]: Data Channel MTU parms [ L:1300 D:1300 EF:1 EB:19 ET:0 EL:0 ]
Sat Jun 26 14:58:38 2004 119[0]: Local Options String: 'V3,dev-type tun,link-mtu 1300,tun-mtu 1299,proto UDPv4,
                                 ifconfig 192.168.25.2 192.168.25.1,comp-lzo'
Sat Jun 26 14:58:38 2004 120[0]: Expected Remote Options String: 'V3,dev-type tun,link-mtu 1300,tun-mtu 1299,
                                 proto UDPv4,ifconfig 192.168.25.1 192.168.25.2,comp-lzo'
Sat Jun 26 14:58:38 2004 121[0]: Local Options hash (VER=V3): '904e90d5'
Sat Jun 26 14:58:38 2004 122[0]: Expected Remote Options hash (VER=V3): '18cff9b7'
Sat Jun 26 14:58:38 2004 123[0]: PTHREAD support initialized
Sat Jun 26 14:58:38 2004 124[0]: UDPv4 link local (bound): [undef]:8147
Sat Jun 26 14:58:38 2004 125[0]: UDPv4 link remote: [undef]

Tout ceci n'a pour but que de monter que nous sommes loin d'utiliser tous les paramètres proposés par OpenVPN. Le but est tout de même d'arriver le plus rapidement possible à une solution sécurisée, plutôt que d'explorer toutes les ressources d'OpenVPN.

Ce qui est surligné montre les options définies dans le démarrage d'OpenVPN.

Vérifications :

aaron:~# ifconfig
...
ppp0      Link encap:Point-to-Point Protocol
          inet addr:82.127.57.95  P-t-P:193.253.160.3  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1492  Metric:1
          RX packets:342756 errors:0 dropped:0 overruns:0 frame:0
          TX packets:290200 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:426707207 (406.9 MiB)  TX bytes:26657415 (25.4 MiB)

tun1      Link encap:Point-to-Point Protocol
          inet addr:192.168.25.1  P-t-P:192.168.25.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1299  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:10
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

aaron:~#

Nous avons, en plus de ppp0 qui est la connexion à l'internet, une interface tun1 qui apparaît elle aussi comme une liaison point à point entre 192.168.25.1 (local) et 192.168.25.2 (distant).

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.25.2    0.0.0.0         255.255.255.255 UH    0      0        0 tun1
...
0.0.0.0         193.253.160.3   0.0.0.0         UG    0      0        0 ppp0
aaron:~#

et nous avons bien la route vers 192.168.25.2 qui passe par tun1

Démarrage du client

Sur CYCLOPE, nous allons faire quelque chose de très similaire :

cyclope:~# openvpn --remote 82.127.57.95 --port 8147 --dev tun1 --ifconfig 192.168.25.2 192.168.25.1 \
--comp-lzo --verb 5

Notez qu'ici, comme nous sommes client, nous indiquons en plus l'adresse IP distante qui supporte le tunnel (--remote 82.127.57.95).

Sat Jun 26 15:22:47 2004 0[0]: Current Parameter Settings:
Sat Jun 26 15:22:47 2004 1[0]: config = '[UNDEF]'
Sat Jun 26 15:22:47 2004 2[0]: persist_config = DISABLED
Sat Jun 26 15:22:47 2004 3[0]: persist_mode = 1
Sat Jun 26 15:22:47 2004 4[0]: show_ciphers = DISABLED
Sat Jun 26 15:22:47 2004 5[0]: show_digests = DISABLED
Sat Jun 26 15:22:47 2004 6[0]: genkey = DISABLED
Sat Jun 26 15:22:47 2004 7[0]: askpass = DISABLED
Sat Jun 26 15:22:47 2004 8[0]: show_tls_ciphers = DISABLED
Sat Jun 26 15:22:47 2004 9[0]: proto = 0
Sat Jun 26 15:22:47 2004 10[0]: local = '[UNDEF]'
Sat Jun 26 15:22:47 2004 11[0]: remote = '82.127.57.95'
Sat Jun 26 15:22:47 2004 12[0]: local_port = 8147
Sat Jun 26 15:22:47 2004 13[0]: remote_port = 8147
Sat Jun 26 15:22:47 2004 14[0]: remote_float = DISABLED
Sat Jun 26 15:22:47 2004 15[0]: ipchange = '[UNDEF]'
Sat Jun 26 15:22:47 2004 16[0]: bind_local = ENABLED
Sat Jun 26 15:22:47 2004 17[0]: dev = 'tun1'
Sat Jun 26 15:22:47 2004 18[0]: dev_type = '[UNDEF]'
Sat Jun 26 15:22:47 2004 19[0]: dev_node = '[UNDEF]'
Sat Jun 26 15:22:47 2004 20[0]: tun_ipv6 = DISABLED
Sat Jun 26 15:22:47 2004 21[0]: ifconfig_local = '192.168.25.2'
Sat Jun 26 15:22:47 2004 22[0]: ifconfig_remote_netmask = '192.168.25.1'
Sat Jun 26 15:22:47 2004 23[0]: ifconfig_noexec = DISABLED
Sat Jun 26 15:22:47 2004 24[0]: ifconfig_nowarn = DISABLED
Sat Jun 26 15:22:47 2004 25[0]: shaper = 0
Sat Jun 26 15:22:47 2004 26[0]: tun_mtu = 1300
Sat Jun 26 15:22:47 2004 27[0]: tun_mtu_defined = DISABLED
Sat Jun 26 15:22:47 2004 28[0]: link_mtu = 1300
Sat Jun 26 15:22:47 2004 29[0]: link_mtu_defined = ENABLED
Sat Jun 26 15:22:47 2004 30[0]: tun_mtu_extra = 0
Sat Jun 26 15:22:47 2004 31[0]: tun_mtu_extra_defined = DISABLED
Sat Jun 26 15:22:47 2004 32[0]: fragment = 0
Sat Jun 26 15:22:47 2004 33[0]: mtu_discover_type = -1
Sat Jun 26 15:22:47 2004 34[0]: mtu_test = 0
Sat Jun 26 15:22:47 2004 35[0]: mlock = DISABLED
Sat Jun 26 15:22:47 2004 36[0]: inactivity_timeout = 0
Sat Jun 26 15:22:47 2004 37[0]: ping_send_timeout = 0
Sat Jun 26 15:22:47 2004 38[0]: ping_rec_timeout = 0
Sat Jun 26 15:22:47 2004 39[0]: ping_rec_timeout_action = 0
Sat Jun 26 15:22:47 2004 40[0]: ping_timer_remote = DISABLED
Sat Jun 26 15:22:47 2004 41[0]: persist_tun = DISABLED
Sat Jun 26 15:22:47 2004 42[0]: persist_local_ip = DISABLED
Sat Jun 26 15:22:47 2004 43[0]: persist_remote_ip = DISABLED
Sat Jun 26 15:22:47 2004 44[0]: persist_key = DISABLED
Sat Jun 26 15:22:47 2004 45[0]: mssfix_defined = DISABLED
Sat Jun 26 15:22:47 2004 46[0]: mssfix = 0
Sat Jun 26 15:22:47 2004 47[0]: passtos = DISABLED
Sat Jun 26 15:22:47 2004 48[0]: resolve_retry_seconds = 0
Sat Jun 26 15:22:47 2004 49[0]: connect_retry_seconds = 5
Sat Jun 26 15:22:47 2004 50[0]: username = '[UNDEF]'
Sat Jun 26 15:22:47 2004 51[0]: groupname = '[UNDEF]'
Sat Jun 26 15:22:47 2004 52[0]: chroot_dir = '[UNDEF]'
Sat Jun 26 15:22:47 2004 53[0]: cd_dir = '[UNDEF]'
Sat Jun 26 15:22:47 2004 54[0]: writepid = '[UNDEF]'
Sat Jun 26 15:22:47 2004 55[0]: up_script = '[UNDEF]'
Sat Jun 26 15:22:47 2004 56[0]: down_script = '[UNDEF]'
Sat Jun 26 15:22:47 2004 57[0]: up_restart = DISABLED
Sat Jun 26 15:22:47 2004 58[0]: daemon = DISABLED
Sat Jun 26 15:22:47 2004 59[0]: inetd = 0
Sat Jun 26 15:22:47 2004 60[0]: log = DISABLED
Sat Jun 26 15:22:47 2004 61[0]: nice = 0
Sat Jun 26 15:22:47 2004 62[0]: verbosity = 5
Sat Jun 26 15:22:47 2004 63[0]: mute = 0
Sat Jun 26 15:22:47 2004 64[0]: gremlin = DISABLED
Sat Jun 26 15:22:47 2004 65[0]: occ = ENABLED
Sat Jun 26 15:22:47 2004 66[0]: http_proxy_server = '[UNDEF]'
Sat Jun 26 15:22:47 2004 67[0]: http_proxy_port = 0
Sat Jun 26 15:22:47 2004 68[0]: http_proxy_auth_method = '[UNDEF]'
Sat Jun 26 15:22:47 2004 69[0]: http_proxy_auth_file = '[UNDEF]'
Sat Jun 26 15:22:47 2004 70[0]: http_proxy_retry = DISABLED
Sat Jun 26 15:22:47 2004 71[0]: socks_proxy_server = '[UNDEF]'
Sat Jun 26 15:22:47 2004 72[0]: socks_proxy_port = 0
Sat Jun 26 15:22:47 2004 73[0]: socks_proxy_retry = DISABLED
Sat Jun 26 15:22:47 2004 74[0]: comp_lzo = ENABLED
Sat Jun 26 15:22:47 2004 75[0]: comp_lzo_adaptive = ENABLED
Sat Jun 26 15:22:47 2004 76[0]: route_script = '[UNDEF]'
Sat Jun 26 15:22:47 2004 77[0]: route_default_gateway = '[UNDEF]'
Sat Jun 26 15:22:47 2004 78[0]: route_noexec = DISABLED
Sat Jun 26 15:22:47 2004 79[0]: route_delay = 0
Sat Jun 26 15:22:47 2004 80[0]: route_delay_defined = DISABLED
Sat Jun 26 15:22:47 2004 81[0]: shared_secret_file = '[UNDEF]'
Sat Jun 26 15:22:47 2004 82[0]: key_direction = 0
Sat Jun 26 15:22:47 2004 83[0]: ciphername_defined = ENABLED
Sat Jun 26 15:22:47 2004 84[0]: ciphername = 'BF-CBC'
Sat Jun 26 15:22:47 2004 85[0]: authname_defined = ENABLED
Sat Jun 26 15:22:47 2004 86[0]: authname = 'SHA1'
Sat Jun 26 15:22:47 2004 87[0]: keysize = 0
Sat Jun 26 15:22:47 2004 88[0]: replay = ENABLED
Sat Jun 26 15:22:47 2004 89[0]: replay_window = 64
Sat Jun 26 15:22:47 2004 90[0]: replay_time = 15
Sat Jun 26 15:22:47 2004 91[0]: packet_id_file = '[UNDEF]'
Sat Jun 26 15:22:47 2004 92[0]: use_iv = ENABLED
Sat Jun 26 15:22:47 2004 93[0]: test_crypto = DISABLED
Sat Jun 26 15:22:47 2004 94[0]: tls_server = DISABLED
Sat Jun 26 15:22:47 2004 95[0]: tls_client = DISABLED
Sat Jun 26 15:22:47 2004 96[0]: key_method = 1
Sat Jun 26 15:22:47 2004 97[0]: ca_file = '[UNDEF]'
Sat Jun 26 15:22:47 2004 98[0]: dh_file = '[UNDEF]'
Sat Jun 26 15:22:47 2004 99[0]: cert_file = '[UNDEF]'
Sat Jun 26 15:22:47 2004 100[0]: priv_key_file = '[UNDEF]'
Sat Jun 26 15:22:47 2004 101[0]: cipher_list = '[UNDEF]'
Sat Jun 26 15:22:47 2004 102[0]: tls_verify = '[UNDEF]'
Sat Jun 26 15:22:47 2004 103[0]: tls_remote = '[UNDEF]'
Sat Jun 26 15:22:47 2004 104[0]: crl_file = '[UNDEF]'
Sat Jun 26 15:22:47 2004 105[0]: tls_timeout = 2
Sat Jun 26 15:22:47 2004 106[0]: renegotiate_bytes = 0
Sat Jun 26 15:22:47 2004 107[0]: renegotiate_packets = 0
Sat Jun 26 15:22:47 2004 108[0]: renegotiate_seconds = 3600
Sat Jun 26 15:22:47 2004 109[0]: handshake_window = 60
Sat Jun 26 15:22:47 2004 110[0]: transition_window = 3600
Sat Jun 26 15:22:47 2004 111[0]: single_session = DISABLED
Sat Jun 26 15:22:47 2004 112[0]: tls_auth_file = '[UNDEF]'
Sat Jun 26 15:22:47 2004 113[0]: OpenVPN 1.6.0 i386-pc-linux-gnu [SSL] [LZO] [PTHREAD] built on Jun 10 2004
Sat Jun 26 15:22:47 2004 114[0]: ******* WARNING *******: all encryption and authentication features disabled 
                                 -- all data will be tunnelled as cleartext
Sat Jun 26 15:22:47 2004 115[0]: LZO compression initialized
Sat Jun 26 15:22:47 2004 116[0]: TUN/TAP device tun1 opened
Sat Jun 26 15:22:47 2004 117[0]: /sbin/ifconfig tun1 192.168.25.2 pointopoint 192.168.25.1 mtu 1299
Sat Jun 26 15:22:47 2004 118[0]: Data Channel MTU parms [ L:1300 D:1300 EF:1 EB:19 ET:0 EL:0 ]
Sat Jun 26 15:22:47 2004 119[0]: Local Options String: 'V3,dev-type tun,link-mtu 1300,tun-mtu 1299,proto UDPv4,
                                 ifconfig 192.168.25.1 192.168.25.2,comp-lzo'
Sat Jun 26 15:22:47 2004 120[0]: Expected Remote Options String: 'V3,dev-type tun,link-mtu 1300,tun-mtu 1299,
                                 proto UDPv4, ifconfig 192.168.25.2 192.168.25.1,comp-lzo'
Sat Jun 26 15:22:47 2004 121[0]: Local Options hash (VER=V3): '18cff9b7'
Sat Jun 26 15:22:47 2004 122[0]: Expected Remote Options hash (VER=V3): '904e90d5'
Sat Jun 26 15:22:47 2004 123[0]: PTHREAD support initialized
Sat Jun 26 15:22:47 2004 124[0]: UDPv4 link local (bound): [undef]:8147
Sat Jun 26 15:22:47 2004 125[0]: UDPv4 link remote: 82.127.57.95:8147

 Vérification des interfaces virtuelles :

cyclope:~# ifconfig
...
ppp0      Link encap:Point-to-Point Protocol
          inet addr:80.8.135.67  P-t-P:80.8.128.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1492  Metric:1
          RX packets:5197 errors:0 dropped:0 overruns:0 frame:0
          TX packets:133 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:295907 (288.9 KiB)  TX bytes:9499 (9.2 KiB)

tun1      Link encap:Point-to-Point Protocol
          inet addr:192.168.25.2  P-t-P:192.168.25.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1299  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:10
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

Vérification des routes :

cyclope:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.25.1    0.0.0.0         255.255.255.255 UH    0      0        0 tun1
...
0.0.0.0         80.8.128.1      0.0.0.0         UG    0      0        0 ppp0

Contrôle du tunnel

Depuis CYCLOPE (192.168.25.2), un petit ping sur AARON (192.168.25.1) :

cyclope:~# ping -c 4 192.168.25.1
PING 192.168.25.1 (192.168.25.1): 56 data bytes

--- 192.168.25.1 ping statistics ---
4 packets transmitted, 0 packets received, 100% packet loss
cyclope:~#

Ah ! Ca ne fonctionne pas...

Et c'est bon signe !

Si ça fonctionnait, ça voudrait dire que les deux machines sont connectées à l'internet sans firewall, ce qui serait très mal !

Réfléchissons. Nous avons sur les deux hôtes des règles IPtables du genre :

iptables -P INPUT DROP
iptables -A INPUT -i ppp0 -m state --state RELATED,ESTABLISHED -j ACCEPT

Donc, les paquets "NEW" n'entrent pas, c'est normal. Ajoutons ceci de chaque côté :

iptables -A INPUT -i ppp0 -p UDP --dport 8147 -j ACCEPT

Rappelons-nous en effet qu'OpenVPN utilise UDP et que nous avons établi le tunnel sur le port 8147.

Deuxième essai :

cyclope:~# ping -c 4 192.168.25.1
PING 192.168.25.1 (192.168.25.1): 56 data bytes

--- 192.168.25.1 ping statistics ---
4 packets transmitted, 0 packets received, 100% packet loss
cyclope:~#

Ca, c'est ce qui arrive quand on ne réfléchit pas assez... On a dit quelque chose au firewall, à propose de tun1 ? Non ? Alors, c'est normal que ça ne fonctionne toujours pas (iptables -P INPUT DROP).

iptables -A INPUT -i tun1 -j ACCEPT
iptables -A OUTPUT -o tun1 -j ACCEPT

Ceci afin d'éviter les ennuis, mais par la suite, ce sera peut-être une bonne chose d'affiner un peu plus ces règles de filtrage.

Troisième essai :

cyclope:~# ping -c 4 192.168.25.1
PING 192.168.25.1 (192.168.25.1): 56 data bytes
64 bytes from 192.168.25.1: icmp_seq=0 ttl=64 time=89.0 ms
64 bytes from 192.168.25.1: icmp_seq=1 ttl=64 time=65.3 ms
64 bytes from 192.168.25.1: icmp_seq=2 ttl=64 time=71.4 ms
64 bytes from 192.168.25.1: icmp_seq=3 ttl=64 time=74.9 ms

--- 192.168.25.1 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 65.3/75.1/89.0 ms
cyclope:~#

Bon. On y est arrivé, et tout ça pour pas grand chose, à part que l'on a vérifié que le tunnel fonctionne.

Attention tout de même que ça pourrait encore ne pas fonctionner, en fonction des règles en vigueur sur FORWARD.

Mais réfléchissons encore un peu...

Lorsque nous avons établi le tunnel, en lançant OpenVPN de chaque côté, nous n'avons rien établi du tout, puisque les firewalls ne laissaient pas passer. Pourtant, ça a fonctionné quand même, après modification des règles, ce qui prouve qu'OpenVPN est très efficace sur des liaisons difficiles.

Un petit coup de sniffeur

Nous sommes sur CYCLOPE. On sniffe le ping sur tun 1 :

No.     Time        Source         Destination    Protocol Info
      1 0.000000    192.168.25.2   192.168.25.1   ICMP     Echo (ping) request
      2 0.077503    192.168.25.1   192.168.25.2   ICMP     Echo (ping) reply
      3 1.007802    192.168.25.2   192.168.25.1   ICMP     Echo (ping) request
      4 1.095914    192.168.25.1   192.168.25.2   ICMP     Echo (ping) reply
      5 2.018634    192.168.25.2   192.168.25.1   ICMP     Echo (ping) request
      6 2.083968    192.168.25.1   192.168.25.2   ICMP     Echo (ping) reply
      7 3.019537    192.168.25.2   192.168.25.1   ICMP     Echo (ping) request
      8 3.087613    192.168.25.1   192.168.25.2   ICMP     Echo (ping) reply

Pas besoin d'entrer dans les détails, nous voyons bien ICMP qui circule entre 192.168.25.1 et 192.168.25.2.

Puis on le resniffe sur ppp0 :

No.     Time        Source         Destination    Protocol Info
      1 0.000000    80.8.135.67    82.127.57.95   UDP      Source port: 8147  Destination port: 8147
      2 0.067128    82.127.57.95   80.8.135.67    UDP      Source port: 8147  Destination port: 8147
      3 1.011132    80.8.135.67    82.127.57.95   UDP      Source port: 8147  Destination port: 8147
      4 1.074716    82.127.57.95   80.8.135.67    UDP      Source port: 8147  Destination port: 8147
      5 2.027369    80.8.135.67    82.127.57.95   UDP      Source port: 8147  Destination port: 8147
      6 2.096456    82.127.57.95   80.8.135.67    UDP      Source port: 8147  Destination port: 8147
      7 3.041653    80.8.135.67    82.127.57.95   UDP      Source port: 8147  Destination port: 8147
      8 3.105374    82.127.57.95   80.8.135.67    UDP      Source port: 8147  Destination port: 8147

A ce niveau, nous ne voyons que de l'UDP, bien sûr. Si nous regardons en détail l'une des trames :

Frame 1 (129 bytes on wire, 129 bytes captured)
    Arrival Time: Jun 26, 2004 16:22:50.261813000
    Time delta from previous packet: 0.000000000 seconds
    Time since reference or first frame: 0.000000000 seconds
    Frame Number: 1
    Packet Length: 129 bytes
    Capture Length: 129 bytes
Linux cooked capture
    Packet type: Sent by us (4)
    Link-layer address type: 512
    Link-layer address length: 0
    Source: <MISSING>
    Protocol: IP (0x0800)
Internet Protocol, Src Addr: 80.8.135.67, Dst Addr: 82.127.57.95
    Version: 4
    Header length: 20 bytes
    Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00)
        0000 00.. = Differentiated Services Codepoint: Default (0x00)
        .... ..0. = ECN-Capable Transport (ECT): 0
        .... ...0 = ECN-CE: 0
    Total Length: 113
    Identification: 0x0200 (512)
    Flags: 0x04 (Don't Fragment)
        0... = Reserved bit: Not set
        .1.. = Don't fragment: Set
        ..0. = More fragments: Not set
    Fragment offset: 0
    Time to live: 64
    Protocol: UDP (0x11)
    Header checksum: 0xd552 (correct)
    Source: 80.8.135.67 (80.8.135.67)
    Destination: 82.127.57.95 (82.127.57.95)
User Datagram Protocol, Src Port: 8147 (8147), Dst Port: 8147 (8147)
    Source port: 8147 (8147)
    Destination port: 8147 (8147)
    Length: 93
    Checksum: 0x6263 (correct)
Data (85 bytes)

0000  fa 45 00 00 54 00 00 40 00 40 01 87 55 c0 a8 19   .E..T..@.@..U...
0010  02 c0 a8 19 01 08 00 5c 4c ee 0a 00 00 40 dd 86   .......\L....@..
0020  ba 00 03 fb 0a 08 09 0a 0b 0c 0d 0e 0f 10 11 12   ................
0030  13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22   ............. !"
0040  23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32   #$%&'()*+,-./012
0050  33 34 35 36 37                                    34567

Et que nous savons décoder les données transportées, nous trouverons le paquet ICMP compressé par LZO. Un simple sniff ne suffira déjà pas à lire simplement les données qui circulent.

Premières conclusions.

Nous avons réussi à monter un tunnel tout simple, qui relie point à point deux hôtes distants, tous deux connectés à l'internet.

A l'intérieur de ce tunnel, tout se passe comme si les deux hôtes étaient reliés par une liaison série, comme par exemple avec PPP :

tun1 Link encap:Point-to-Point Protocol
     inet addr:192.168.25.2 P-t-P:192.168.25.1 Mask:255.255.255.255
     UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1258 Metric:1
     RX packets:146939 errors:0 dropped:0 overruns:0 frame:0
     TX packets:115942 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:10
     RX bytes:22750260 (21.6 MiB) TX bytes:12818254 (12.2 MiB)

Nous n'avons pas réuni deux réseaux, juste deux machines. Mais si ces machines sont des routeurs, en réfléchissant (encore) un peu, nous trouverons bien des règles de routages intelligentes qui permettront aux réseaux qui sont derrière ces routeurs de communiquer entre eux.

Il n'y a pas d'authentification, il n'y a pas de confidentialité, il y a juste une compression des données.

Bien sûr, nous allons faire mieux, en mettant en oeuvre SSL.


Précédente ] [ Accueil ] [ Suivante ]