Skip to content

OpenVpn

puerto 1194

/usr/lib/systemd/system/openvpn@.service
/usr/lib/tmpfiles.d/openvpn.conf
...
/usr/share/doc/openvpn/sample/sample-keys

[jorge@pc03 ~]$ tree /etc/openvpn/


➜  ~ ll /usr/share/doc/openvpn/examples/sample-keys 
total 84K
-rw-r--r-- 1 root root 2,2K feb 20  2019 ca.crt
-rw-r--r-- 1 root root 3,3K feb 20  2019 client.crt.gz
-rw-r--r-- 1 root root 1,7K feb 20  2019 client.key
-rw-r--r-- 1 root root  424 feb 20  2019 dh2048.pem
-rw-r--r-- 1 root root 3,5K feb 20  2019 server.crt.gz
-rw-r--r-- 1 root root 1,7K feb 20  2019 server.key
...

➜  ~ ll /usr/share/doc/openvpn/examples/sample-config-files 
total 68K
-rw-r--r-- 1 root root 3,6K feb 20  2019 client.conf
-rw-r--r-- 1 root root 4,3K feb 20  2019 server.conf.gz
...

Ejemplos Comand line

túnel simple sin cifrar.

  ~ sudo openvpn --remote  portatil --dev tun1 --ifconfig 10.4.0.2 10.4.0.1 --verb 9
[jorge@pc03 ~]$ sudo openvpn --remote  torre --dev tun1 --ifconfig 10.4.0.1 10.4.0.2 --verb 9


13: tun1: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none 
    inet 10.4.0.1 peer 10.4.0.2/32 scope global tun1
       valid_lft forever preferred_lft forever
    inet6 fe80::591a:b249:b1bf:89d8/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever

[jorge@pc03 ~]$ curl 10.4.0.2:13
23 MAR 2020 09:07:36 UTC

túnel host a host clave compertida

  ~ sudo openvpn --genkey --secret key
➜  ~ sudo scp key jorge@portatil:

[jorge@pc03 ~]$ ls -l key 
-rw-------. 1 jorge jorge 636 mar 23 10:25 key

➜  ~ sudo openvpn --remote  portatil --dev tun1 --ifconfig 10.4.0.2 10.4.0.1 --verb 5 --secret key

[jorge@pc03 ~]$ sudo openvpn --remote  torre --dev tun1 --ifconfig 10.4.0.1 10.4.0.2 --verb 5 --secret key

[jorge@pc03 ~]$ curl 10.4.0.2:13
23 MAR 2020 09:26:57 UTC

host to host tls public/secret key

En este casi se utiliza el host torre de server y el host portatil de cliente, las claves utilizadas son las proporcionadas por openvpn de ejemplo, nunca utilizarlas en producción.

  ~ cd /usr/share/doc/openvpn/examples/sample-keys/                                 ~ sudo cp dh2048.pem ca.crt client.key client.crt.gz server.crt.gz server.key /home/debian/

➜  ~ scp ca.crt client.* jorge@portatil:

➜  ~ sudo openvpn --remote  portatil --dev tun1 --ifconfig 10.4.0.2 10.4.0.1 --verb 5 --tls-server --dh dh2048.pem --ca ca.crt --cert server.crt --key server.key --reneg-sec 60 --verb 5

[jorge@pc03 ~]$ sudo openvpn --remote  torre --dev tun1 --ifconfig 10.4.0.1 10.4.0.2  --tls-client --ca ca.crt --cert client.crt --key client.key --reneg-sec 60 --verb 5 

[jorge@pc03 ~]$ curl 10.4.0.2:13
23 MAR 2020 09:56:29 UTC

túnel network to network

básicamente es enrrutar la subred creada por un tunel a un gateway externo

may   ~ sudo echo 1 | tee /proc/sys/net/ipv4/ip_forward
june   ~ sudo echo 1 | tee /proc/sys/net/ipv4/ip_forward

may   ~ iptables −A FORWARD −i tun+ −j ACCEPT
june   ~ iptables −A FORWARD −i tun+ −j ACCEPT

may   ~ route add −net 10.0.1.0 netmask 255.255.255.0 gw 10.4.0.2
june   ~ route add −net 10.0.0.0 netmask 255.255.255.0 gw 10.4.0.1

Esquema:

    may                         june
    10.4.0.1   route adds       10.4.0.2
     +-----+  <-----------+  +----+
     |     |                 |    |
     +-----+  +---------->   v----+
        ||                     | |
        ||                     | |
        || OpenS 10.0.1.1      | |  OpenS 10.0.0.1
        || tunel               | |  tunel
        || OpenC 10.0.1.2      | |  OpenC 10.0.0.2
      +-----+                +----+
      |     |                |    |
      +-----+                +----+ 

Server multiuser

Configuración para un servidor, que puede albergar múltiples usuarios con las mismas llaves.

Dominio

El dominio que trae por defecto lo modifico a mi gusto, para simplificar su utilización.

[fedora@aws ~]$ sudo cp /lib/systemd/system/openvpn-server@.service /etc/systemd/system/.

[fedora@aws ~]$ cat /etc/systemd/system/openvpn-server@.service 
[Unit]
Description=OpenVPN service for %I hisx
After=syslog.target network-online.target

[Service]
Type=forking
PrivateTmp=true
ExecStartPre=/usr/bin/echo serveri %i %I
PIDFile=/var/run/openvpn-server/%i.pid
ExecStart=/usr/sbin/openvpn --daemon --writepid /var/run/openvpn-server/%i.pid --cd /etc/openvpn/ --config %i.conf

[Install]
WantedBy=multi-user.target

Configuración

Configuración del servidor

[fedora@aws ~]$ cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf .
[fedora@aws ~]$ sudo cp server.conf /etc/openvpn/hisxserver.conf
[fedora@aws ~]$ cat /etc/openvpn/hisxserver.conf 

port 1194
proto udp
dev tun

ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key  # This file should be kept secret
dh /etc/openvpn/keys/dh2048.pem

server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
client-to-client
;duplicate-cn

keepalive 10 120
cipher AES-256-CBC
comp-lzo

persist-key
persist-tun

status openvpn-status.log
verb 3
explicit-exit-notify 1

llaves

En este paso se tienen que generar unas claves o utilizar ( solo en entornos de pruebas ) las llaves por defecto existentes en /usr/share/doc/openvpn/sample/sample-key ( No vienen en todas las distribuciones o versiones de las mismas )

[fedora@aws ~]$ tree /etc/openvpn/
/etc/openvpn/
|-- client [error opening dir]
|-- hisxserver.conf
|-- ipp.txt
|-- keys
|   |-- ca.crt
|   |-- dh2048.pem
|   |-- server.crt
|   `-- server.key
|-- openvpn-status.log
`-- server [error opening dir]

Para acabar recargo los dominios, ya que lo hemos modificado manualmente y enciendo el server.

[fedora@aws ~]$ sudo systemctl daemon-reload 
[fedora@aws ~]$ sudo systemctl start openvpn-server@hisxserver.service

Compruebo que se a creado una nueva interfaz con la red indicada en el dispositivo tun0

[fedora@ip-172-31-82-34 ~]$ ip a s tun0
3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none 
    inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:58c8:3152:2900/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever

Host cliente

Configuración

Copio y modifico la configuración de ejemplo proporcionada por openvpn.

  ~ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/client/hisxclient.conf

➜  ~ sudo cat /etc/openvpn/client/hisxclient.conf

client
dev tun
proto udp

# remote server port
remote aws 1194

resolv-retry infinite
nobind
persist-key
persist-tun

ca /etc/openvpn/keys/ca.crt
cert  /etc/openvpn/keys/client.crt
key  /etc/openvpn/keys/client.key

remote-cert-tls server
cipher AES-256-CBC
comp-lzo
verb 3

llaves

Estas llaves las he extraído del servidor ( estoy utilizando las de por defecto ), todos los clientes tendrán las mismas.

  ~ sudo cp ca.crt client.crt client.key /etc/openvpn/keys
➜  ~ sudo chmod 600 /etc/openvpn/keys/*

[sudo] password for jorge: 
/etc/openvpn/
├── client
│   └── hisxclient.conf
├── keys
│   ├── ca.crt
│   ├── client.crt
│   ├── client.key
│   └── dh2048.pem
└── server

Como es un entorno de pruebas y no tengo resolución al servidor, asigno la resolución en /etc/hosts manualmente.

  ~ cat /etc/hosts
127.0.0.1   localhost
127.0.1.1   localhost.localdomain   localhost

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
3.84.58.174 aws

Enciendo el dominio del cliente por defecto con la configuración hisxclient

  ~ sudo systemctl start openvpn-client@hisxclient 

Compruebo que conecta y crea la nueva interficie tun0

  ~ ip a s tun0
10: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
    link/none 
    inet 10.8.0.6 peer 10.8.0.5/32 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fe80::ae4:71c6:32ce:c922/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever

Conectividad entre redes

Teniendo el servidor y cliente en marcha, en este paso se conecta la red netB en la ami de amazon con el host local y la red netA del host local con la ami de amazon.

# enciendo dockers ldap y kserver en aws con la red 'netB  172.18.0.0'
[fedora@aws ~]$ sudo docker run --rm --name ldap.edt.org -h ldap.edt.org --net netB -d jorgepastorr/ldapserver19:final
[fedora@aws ~]$ sudo docker run --rm --name kserver.edt.org -h kserver.edt.org --net netB -d jorgepastorr/k19:kserver

# enciendo docker local con red 'netA  172.19.0.0'  ~ docker run --rm --name nethost -h nethost  --net netA -d jorgepastorr/net19:nethost

# desde local enruto todo el trafico de la red 172.18.0.0/16 hacia el tunel vpn 10.8.0.6
# la red 172.18.0.0 no tiene que existir en local
# 10.8.0.6 es la ip local del tunel vpn  ~ sudo ip route add 172.18.0.0/16 via 10.8.0.6       ~ ip route show                               
default via 192.168.88.1 dev enp3s0 proto dhcp metric 100 
10.8.0.0/24 via 10.8.0.5 dev tun0 
10.8.0.5 dev tun0 proto kernel scope link src 10.8.0.6 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
172.18.0.0/16 via 10.8.0.6 dev tun0 
172.19.0.0/16 dev br-2d7ff7224245 proto kernel scope link src 172.19.0.1 

# permito pc local enrutar y abro peticiones del tunel vpn  ~ echo 1 |sudo  tee /proc/sys/net/ipv4/ip_forward
➜  ~ sudo iptables -A FORWARD -i tun+ -j ACCEPT

# desde aws enruto todo el trafico de la red 172.19.0.0/16 hacia el tunel vpn 10.8.0.2
# la red 172.19.0.0 no tiene que existir en aws
[fedora@aws ~]$ sudo ip route add 172.19.0.0/16 via 10.8.0.2
[fedora@aws ~]$ sudo ip r
default via 172.31.80.1 dev eth0 proto dhcp metric 100 
10.8.0.0/24 via 10.8.0.2 dev tun0 
10.8.0.2 dev tun0 proto kernel scope link src 10.8.0.1 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
172.18.0.0/16 dev br-9202ac48a79d proto kernel scope link src 172.18.0.1 
172.19.0.0/16 via 10.8.0.2 dev tun0 
172.31.80.0/20 dev eth0 proto kernel scope link src 172.31.92.8 metric 100 

# permito aws enrutar y abro peticiones del tunel vpn
[fedora@aws ~]$ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
[fedora@aws ~]$ sudo iptables -A FORWARD -i tun+ -j ACCEPT

# Compuebo
# desde local puedo acceder a la base de datos ldap desde el enrtamiento echo de 172.18.0.0 pasando por el tunel vpn y acabando en aws.  ~ ldapsearch -x -LLL -h 172.18.0.2:389 -b 'dc=edt,dc=org' dn

# desde docker local lo mismo con kserver  ~ docker run --net netA --rm -it jorgepastorr/k19:khost

[root@5b295dee370e docker]# cat /etc/hosts
127.0.0.1   localhost
172.19.0.3  5b295dee370e
172.18.0.3 kserver.edt.org kserver

[root@5b295dee370e docker]# kinit pere
Password for pere@EDT.ORG: 

[root@5b295dee370e docker]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: pere@EDT.ORG

Valid starting     Expires            Service principal
03/24/20 20:11:30  03/25/20 20:11:30  krbtgt/EDT.ORG@EDT.ORG