Languages

User login


Tunels OpenVPN als CPEs amb RouterOS v3


 
Com ja sabeu per aqui fem servir tunels des dels routers dels usuaris fins a un servidor per a accedir a Internet. Fins ara ho feiem amb Linksys amb OpenWRT i tunels OpenVPN amb certificats, com s'explica aqui. De manera que els usuaris accedeixen de forma transparent tant a la xarxa guifi com a Internet.

Fins ara no haviem fet servir gaire els CPEs. La rao principal era que no els necessitavem i que tenia que posar-m'hi per a poder fer que establisin tunels de la mateixa manera que fem amb els Linksys. El RouterOS 2.x nomes suporta tunels PPTP, i despres de bastantes hores esbarellant-me amb el servidor Debian i el PPTPd, els he descartat perque tenia molts problemes d'estabilitat. Aixi que he agafat la RouterOS 3.0rc13 i m'hi he posat.

La implementació de client OpenVPN que porta el RouterOS 3.0 no suporta el sistema de certificats que feiem servir fins ara. Suporta un sistema de certificats mes senzill i també l'autenticació amb usuari i password. Com que els usuaris ja tenen un user/pass per autenticar-se en diferents serveis, i els tenim guardats en una taula de MySQL, he configurat un segon servei OpenVPN que autentiqui mitjançant els valors d'aquesta taula.

 
 
Configuració del servidor

Tot i que no fem servir certificats, el OpenVPN hem demana crear certificats pel servidor. Per crear-los segiu el que es diu aqui. Necessitarem els:

dh1024.pem
openvpn-servidor.key
openvpn-servidor.crt
openvpn-auth.key



 
Els copiem a /etc/openvpn. I creem un openvpn.conf amb:

auth-user-pass-verify /home/joan/scripts/auth-ovpn-sql.pl via-env
client-cert-not-required

port 1194
proto tcp
dev tun

dh /etc/openvpn/dh1024.pem
ca /etc/openvpn/openvpn-ca.crt
cert /etc/openvpn/openvpn-servidor.crt
key /etc/openvpn/openvpn-servidor.key

server 192.168.12.0 255.255.255.0
ifconfig-pool-persist ipp2.txt
push "route 192.168.13.0 255.255.255.0"
client-to-client
keepalive 10 120
#comp-lzo
user nobody
group nogroup
persist-key
persist-tun
verb 3

cipher BF-CBC
auth SHA1
tls-server


 
El OpenVPN autenticara els usuaris mitjançant l'script /home/joan/scripts/auth-ovpn-sql.pl. Aquest path l'heu de canviar pel que correspongui en el vostre sistema. Aquest script es cridat pel servidor OpenVPN posant a les enviromental variables el nom d'usuari i password que li ha passat el client OpenVPN per autenticar-se. L'script ha de verificar si son bones i retornar 0 si ho son i 1 si no ho son. En el meu cas ho tinc en una taula MySQL, el meu script (auth-ovpn-sql.pl) es aquest:

#!/usr/bin/perl

use Mysql;

$host = "localhost";
$database = "nom_db";
$tablename = "nom_taula";
$user = "user_mysql";
$pw = "pass_mysql";

$connect = Mysql->connect($host, $database, $user, $pw);
$connect->selectdb($database);
$myquery = "SELECT * FROM $tablename WHERE user='".$ENV{'username'}."' AND pass='".$ENV{'password'}."'";
$execute = $connect->query($myquery);

# Si troba al menys 1 fila esta autenticat i retorna 0 al OpenVPN
if( $execute->numrows() ) { exit(0); } else { exit(1); }

 
Compte si el feu servir, que no hi he posat cap neteja de les variables i es pot fer Injecció de SQL. Es nomes un exemple, podeu validar contra el que vulgueu.

 
 
Configuració del CPE

Una vegada posat el unsolcic, amb el winbox aneu a Interficies, en el desplegable amb la icona + seleccioneu OVPN Client. En la pestanya Dial Out:

Connect To: [IP del servidor OpenVPN]
Port: 1194
Mode: ip
User: [Nom d'usuari que teniu a la taula MySQL]
Pass: [Pass d'usuari que teniu a la taula MySQL]
Profile: default
Certificate: None
Auth: sha1
Cipher: blowfish 128

Seleccioneu la casella "Add Default Route"

 
Cal afegir un masquerade per a la nova Interficie que heu creat:

/ip firewall nat add action=masquerade chain=srcnat comment="" disabled=no out-interface=ovpn-out1


 
Heu de canviar també la ruta default que crea l'unsolclic. Aquesta ruta s'ha de canviar de manera que no encamini per dins del tunel el transit dirigit a la xarxa guifi. La manera més facil es anar a IP->Routes. Editar la ruta default que te Destination 0.0.0.0/0 i canviar aquest valor per 10.0.0.0/8.

També s'ha de desabilitar l'usuari guest del CPE, perque amb aquest compte es pot veure el user/pass que fa servir el trasto per establir el tunel.

Nomes afegir que ho havia provat de fer fa setmanes (mesos?) amb una Beta del RouterOS, però petava per tot arreu. Ara amb la rc13 es estable.
 
 
 

Comentaris

Opcions de visualització de comentaris

Selecciona la vostra manera preferida de visualitzar els comentaris i feu clic en "Desa la configuració" per activar els canvis.

VPN

Hola Joan.

 

Magnific el HOWTO. He lograt conectar com a client el RouterOS (Mikrokit) i el meu openvpn basat en Debian.

 

Tinc un dubte que no se per on tirar.

Tal i com fiques, jo arranque la VPN desde la Debian en mode SERVER i el routerOS en OVPN-Client. Faig la conexió i desde la xarxa de darrere del mikrotik pot vore la xarxa darrere del debian amb vpn, pero al revés no. el meu iptables esta net al linux i al routerOs, pots ajudarme?

 

Salutacions

Problema de rutes

verifica les rutes del Debian que tingui el camí per arribar a rang de darrera del Mikrotik

Rutes al Debian

Si creia que era aixó, pero mira

Si cree la ruta com al mikrotik "route add -net 192.168.2.0 netmask 255.255.255.0 dev tun0" es crea pero no arriba

 

Si cree la ruta "route add -net 192.168.2.0 netmask 255.255.255.0 gw 11.0.2.6" em diu

SIOCADDRT: No existe el proceso
 

al tun 0 del ifcondig me ix "inet addr:11.0.2.1  P-t-P:11.0.2.2"

en canvi al LOG del ovpn

ovpn-tunel-mikrotik[23769]: XX.XX.XX.XX:41477 MULTI: primary virtual IP for XX.XX.XX.XX:41477: 11.0.2.6

 

Aquest es el meu EXEMPLE.conf al OPENVPN

auth-user-pass-verify /etc/openvpn/auth.sh via-env
client-cert-not-required
mode server
port 1194
proto tcp-server
dev tun
dh /etc/openvpn/keys/dh1024.pem
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/openvpn-servidor.crt
key /etc/openvpn/keys/openvpn-servidor.key
server 11.0.2.0 255.255.255.248
push "route 192.168.1.0 255.255.255.0"
ifconfig-pool-persist /etc/openvpn/ipp2.txt
client-to-client
client-config-dir ccd
keepalive 10 120
user nobody
group nogroup
persist-key
persist-tun
verb 3
cipher BF-CBC
auth SHA1
tls-server
 

gràcies

 

Bridging

Imagino que et refereixes a que a les dues bandes del tunel VPN hi vols tenir el mateix adreçament (Ex: 192.168.2.0/24), i que el tunel actui de forma transparent, de manera que puguis accedir als dispositius de les dues bandes com si estiguessin fisicament connectats a un switch.

Per fer-ho necessites una configuració diferent del OpenVPN, has de fer servir taps en comptes de tuns, i posar les interficies del tunel dins d'un bridge amb la interfície que te la 192.168.2.x. No tinc cap exemple, però ho trobaràs explicat aqui:

http://openvpn.net/index.php/open-source/documentation/howto.html#config

http://openvpn.net/index.php/open-source/documentation/miscellaneous/76-...

Si te'n surts, estaria bé que fessis un comesfa.

Routing

No, no es la meva idea.

Mes o menys es així

XARXA LOCAL             SERVIDOR LINUX OPENVPN        (internet)                     MIKROTIK ROUTEROS CLIENT   XARXA REMOTA

192.168.0.0/24 ------  IP PUBLICA I FIXA ========================= IP PUBLICA DHCP  ----------  192.168.2.0/24

 

IP fixe per common name

Ok. Llavors has de fer que el servidor openvpn dongui sempre la mateixa IP de tunel al mikrotik i posar-hi una ruta al mikrotik.

Primer fem que el servidor sempre asigni el mateix parell d'IPs al mikrotik:

mkdir /etc/openvpn/ccd

a la config del servidor afegeixes aquestes linees:

client-config-dir /etc/openvpn/ccd
username-as-common-name

Imaginem que el username que fas servir al mikrotik per autenticar el tunel es "jtormo" i que el parell d'IPs que s'asignen son: "192.168.22.200 192.168.22.201". Crees un fitxer "/etc/openvpn/ccd/jtormo" amb el contingut:

ifconfig-push 192.168.22.200 192.168.22.201

Restart a les dues bandes. Ara el tunel entre el mikrotirk i el servidor openvpn sempre tindran el mateix parell d'IPs.

Al servidor debian li has de fer una entrada a les rutes dient que:

route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.22.200

Suposo que ja t'anirà, ho estic fent de memoria. Si alguna cosa falla, prova de fer un masquerade al Debian per tot el que entri el tunel (iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE).

Compte a les dues bandes amb els FORWARDS, que no es pugui entrar des de guifi a dins del tunel.

Routing

Hola de nou XD.

 

Gràcies de nou. He configurar les IP fixes per al tunel y el masquerade, pero desde la xarxa del Linux a la xarxa del mikrokit no funciona. Al revés si que ho fa.

 

Aquest es el resum de la meva instalació.

 

Al Server Debian linux (Lenny):

/etc/openvpn/tunel-mikrokit.conf

---------------------------------------------------

auth-user-pass-verify /etc/openvpn/auth.sh via-env
client-cert-not-required
mode server
port 1194
proto tcp-server
dev tun
dh /etc/openvpn/keys/dh1024.pem
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/openvpn-servidor.crt
key /etc/openvpn/keys/openvpn-servidor.key
client-config-dir /etc/openvpn/ccd
username-as-common-name
server 11.0.3.0 255.255.255.248
push "route 192.168.0.0 255.255.255.0"
ifconfig-pool-persist /etc/openvpn/ipp2.txt
client-to-client
keepalive 10 120
user nobody
group nogroup
persist-key
persist-tun
verb 3
cipher BF-CBC
auth SHA1
tls-server
-----------------------------

/etc/openvpn/ccd/pepe

ifconfig-push 11.0.3.2 11.0.3.1

La Configuració IPTABLES al servidor

---------------------------

        /sbin/iptables -t filter -F
        /sbin/iptables -t nat -F
        /sbin/iptables -t mangle -F
        /sbin/iptables -P INPUT ACCEPT
        /sbin/iptables -P OUTPUT ACCEPT
        /sbin/iptables -P FORWARD ACCEPT
 

        iptables -t nat -A POSTROUTING -o eth8 -j MASQUERADE     # XARXA INTERNET
        iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE     # XARXA TUNEL
        echo 1 > /proc/sys/net/ipv4/ip_forward
 

----------------------------

 

He creat la ruta

route add -net 192.168.2.0 netmask 255.255.255.0 gw 11.0.3.2

Y aquesta es la configuració IP de la maquina

# PRIVADA DARRERE XARXA INTERNA

eth7      Link encap:Ethernet  HWaddr 00:10:18:27:9f:6f
          inet addr:192.168.0.7  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:77407845 errors:0 dropped:0 overruns:0 frame:0
          TX packets:62755310 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1585090155 (1.4 GiB)  TX bytes:4063987344 (3.7 GiB)
          Interrupt:16

# PUBLICA i FIXA AL SERVIDOR

eth8      Link encap:Ethernet  HWaddr 00:a0:c5:d5:05:21
          inet addr:[IP PUBLICA]  Bcast:XX.XX.XX.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:21005445 errors:2 dropped:0 overruns:0 frame:2
          TX packets:12700458 errors:0 dropped:0 overruns:0 carrier:4
          collisions:0 txqueuelen:1000
          RX bytes:1177759141 (1.0 GiB)  TX bytes:1352574800 (1.2 GiB)

# EL TUN DE OVPN

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:11.0.3.1  P-t-P:11.0.3.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:3800 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8800 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:243260 (237.5 KiB)  TX bytes:642068 (627.0 KiB)
 

Aquesta es la tabla de rutes que tinc

11.0.3.2        0.0.0.0         255.255.255.255 UH    0      0        0 tun0
11.0.3.0        11.0.3.2        255.255.255.248 UG    0      0        0 tun0
192.168.2.0     11.0.3.2        255.255.255.0   UG    0      0        0 tun0
62.43.206.0     0.0.0.0         255.255.255.0   U     0      0        0 eth8
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth7
 

CREC que es tota la informació possible al Servidor.

Reincie OVPN y tinc estos pings de prova

TINC INTERNET:   64 bytes from 80.58.0.33: icmp_seq=1 ttl=123 time=21.5 ms
 

VEIG LA TUN0 LOCAL: 64 bytes from 11.0.3.1: icmp_seq=1 ttl=64 time=0.040 ms

VEIG LA TUN0 REMOTA: 64 bytes from 11.0.3.2: icmp_seq=1 ttl=64 time=316 ms

NO VEIG LA XARXA LOCAL REMOTA: PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data. TIMEOUT.....   :-(

Al Mikrokit tinc açó

Masquerade SRCNAT OUT ether1

Masquerade SRCNAT OUT ovpn-client -d 192.168.0.0724

FILTER RULES NOMES TINC: ACCEPT INPUT TCP 1194

El ovpn-client tinc:

conect to: IP PUBLICA SERVER LINUX

PORT 1194

MODE: IP

User pass: XXXX/XXXX    XDDDD

PROFILE: default

SHA, Blowfish y desactivat la opcio add default route

He tratat de activarla i provar i carabasses igual

Ja no se si es de rutes o firewall, estic una mica perdut ja que en un sentit funciona.

 

Alguna idea?

 

Al mikrokit tinc

A veure si trobem on hi ha el

A veure si trobem on hi ha el problema.

Imagino que la eth1 del CPE deu tenir alguna 192.168.2.x.

Al Servidor no cal que li posis un MASQUERADE del que entra al tunel (iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE     # XARXA TUNEL).

Al Mikrotik sembla que li fa mal el MASQUEREADE del que va cap a la LAN privada (Masquerade SRCNAT OUT ether1).

Quan dius que tens internet, vols dir que des de la xarxa privada hi ha com a default gateway la IP del eth1 del CPE, i el Mikrotik ho envia a traves del tunel cap al Servidor, i aquest ho reenvia cap a Internet. Per tant tambe podries treure de la config openvpn del servidor el: 'push "route 192.168.0.0 255.255.255.0"', no fa mal, pero no te sentit.

En teoria, com que al servidor ja li hem dit que la 192.168.2.0/24 la trobara a traves del tunel, al mikrotik li podries treure el masquerade: "Masquerade SRCNAT OUT ovpn-client -d 192.168.0.0/24". Has de tenir en compte, que la resta d'ordinadors que estan a la banda del Servidor, s'ha de posar que trobaran la subnet 192.168.2.0/24 a traves de la IP del servidor. A no ser que tinguis com a default gw, en la xarxa de servidor, la ip del servifor en comptes de la del router ADSL.

En resum, com que cada extrem dels tunels saben quina subnet hi ha a l'extrem contrari, i com arribar-hi, en teoria no calen els MASQUERADES.

A veure si aixi funciona

NO HI HA FORMA

Hola de nou. Estic pegamme de cabotades contra la taula i no hi ha forma.

 

No se si he dit que desde el servidor i la xarxa que porta darrere d'ell si que puc vore la IP que li dona de tunel (11.0.3.1 SERVIDOR) y (11.0.3.2 MIKROTIK). Eixes dos desde els dos llocs es poden vore ambes, pero la xarxa interna al darrere del mikrotik desde la xarxa del Servidor MEEC.

A vore si podem en aço

Gracies

PEP