Massive headline yes, but It’s a nice little setup that I like.
Difficulty: Easy to Advanced, change the values as you need to suit your setup.
Requirements:
- IP cloud enabled or equivalent domain name or a DNS provider. For this guide, I’ll be using Mikrotik’s built-in ip cloud ddns system.
/ip cloud set ddns-enabled=yes update-time=yes
Write down the dns-name obtained from the command below as we will need that a bit later
/ip cloud print
Creating the certificates
- Create a self-signed CA certificate (valid for ten years!)
NB: common-name should be the dns-name from the ip cloud print command
/certificate add name=My-CA common-name=123.sn.mynetname.net key-usage=key-cert-sign,crl-sign trusted=yes days-valid=3650
- Sign the Certificate
/certificate sign My-CA
- Generate a certificate for the router (Server) (valid for 10 years!)
NB: common-name should be the dns-name from the ip cloud print command
/certificate add name=VPN-Server-Certificate common-name=123.sn.mynetname.net days-valid=3650 key-usage=digital-signature,key-encipherment,data-encipherment,ipsec-tunnel,ipsec-end-system,tls-server
- Sign the server certificate
/certificate sign VPN-Server-Certificate ca=My-CA
- Trust the server certificate
/certificate set trusted=yes VPN-Server-Certificate
- Create a client certificate
/certificate add name=VPN-Client-Certificate common-name=client.123.sn.mynetname.net days-valid=3650 key-usage=digital-signature,key-encipherment,data-encipherment,ipsec-user,tls-client
- Sign the client certificate
/certificate sign VPN-Client-Certificate ca=My-CA
- Trust the client certificate
/certificate set trusted=yes VPN-Client-Certificate
- Export the CA certificate & the Client certificate and import it on the IOS & Android devices (I just e-mail the certificates to the devices)
/certificate export-certificate My-CA type=pem
/certificate export-certificate VPN-Client-Certificate type=pkcs12 export-passphrase=12345678
L2TP/IPSEC RSA for Android
- First off we need a VPN pool for all our clients to obtain IP addresses.
/ip pool add name=vpn-pool ranges=192.168.89.2-192.168.89.22
- A ppp profile
/ppp profile set default-encryption local-address=192.168.89.1 remote-address=vpn-pool
- A ppp secret (A username and password)
/ppp secret add name=l2tp-user password=userpassword service=l2tp profile=default-encryption
- An IPSec proposal (offering your devices a choice of encyrption types)
/ip ipsec proposal set [find default=yes] enc-algorithms=aes-128-cbc,aes-192-cbc,aes-256-cbc
- A mode config
/ip ipsec mode-config add name=vpn-mode-config address-pool=vpn-pool static-dns=1.1.1.1
- An IPSec peer
NB: Use fqdn obtained from ip cloud print command dns-name
/ip ipsec peer add address=0.0.0.0/0 auth-method=rsa-signature certificate=VPN-Server-Certificate remote-certificate=VPN-Client-Certificate exchange-mode=main-l2tp passive=yes my-id=fqdn:123.sn.mynetname.net mode-config=vpn-mode-config generate-policy=port-strict proposal-check=obey hash-algorithm=sha1 enc-algorithm=aes-128,aes-192,aes-256 dh-group=modp1024 comment=L2TP-RSA
- Enable L2TP server
/interface l2tp-server server set enabled=yes default-profile=default-encryption use-ipsec=no caller-id-type=ip-address authentication=mschap2
- Add a masquerade rule for the VPN traffic
/ip firewall nat add action=masquerade chain=srcnat src-address=192.168.89.0/24
- Finally, allow it via the firewall - make sure the rule precedes any drop rule.
(eg: use place-before=3 to create the rule as number 3 on your firewall config)
/ip firewall filter add action=accept chain=input comment="L2TP-Server" protocol=udp dst-port=500,1701,4500
On Android, set up a vpn connection (L2TP/IPSec PSK) with the following values from above:
Name: My-vpn
Type: L2TP/IPSec RSA
Server Address: 123.sn.mynetname.net (the dns-name obtained from the ip cloud print command above)
L2TP Secret: (not used)
IPSec identifier: (not used)
IPSec User Certificate: VPN-Client-Certificate
IPSec CA Certificate: My-CA
IPSec Server Certificate: (received from server)
IKEv2 for IOS (certificate based)
Since we have the majority of the items already set up from above we just need to add a few things to for this to work.
- Create the IPSec peer (since we use the same proposal from above)
NB: Use fqdn obtained from ip cloud print command dns-name
/ip ipsec peer add address=0.0.0.0/0 auth-method=rsa-signature exchange-mode=ike2 passive=yes certificate=VPN-Server-Certificate remote-certificate=VPN-Client-Certificate send-initial-contact=yes my-id=fqdn:123.sn.mynetname.net mode-config=vpn-mode-config generate-policy=port-strict enc-algorithm=aes-128 dh-group=modp1024 comment=IKEv2
- Trust the root certificate on iOS, go to Settings > General > About > Certificate Trust Settings. Under “Enable full trust for root certificates,” turn on trust for the CA certificate.
Setup the VPN on IOS as follows:
Type: IKEv2
Description: My-VPN
Server: 123.sn.mynetname.net (your ip cloud dns name)
Remote ID: 123.sn.mynetname.net
local ID: client.123.sn.mynetname.net (this must match the client certificate name)
User Authentication: None
User certificate: On
Certificate: VPN-Client-Certificate
SSTP: (For Pc’s)
Why SSTP? Most free/public wifi’s block the ports needed for IKEv2 & L2TP-IPsec. So I set SSTP to use a common port of 443 - The same port for secure web browsing which is available on any free/public wifi)
- Enable SSTP
(For added security you can set verify-client-certificate=yes which will require you to load the VPN-Client-Certificate onto the pc as well as the My-CA certificate)
/interface sstp-server server set enabled=yes port=443 default-profile=default certificate=VPN-Server-Certificate authentication=mschap2
- Create firewall rule to allow the traffic - make sure the rule precedes any drop rule.
(eg: use place-before=3 to create the rule as number 3 on your firewall config)
Note: check that ssl http is disabled -miktotik webfig- as the port will conflict.
/ip firewall filter add chain=input protocol=tcp dst-port=443 in-interface=all-ppp action=accept comment="SSTP-server"
- Create a user account
/ppp secret add name=sstp-user password=sstppassword service=sstp profile=default
Next, import the CA certificate (and client certificate if you chose the extra security on step 1) onto your windows systems, under the user & machine certified root authorities for My-CA and the user certificate under the user section. Linux you can import the certificate or just ignore it - you will however need the client certificate if you chose the extra security option.
Setup a SSTP vpn connection on your systems. (not going to cover this here - google it)
Server: 123.sn.mynetname.net (as above you should be used to this by now!)
Username: sstp-user (step 3)
Password: sstppassword (step 3)