RouterOS VPN

Mason Lyu
MischievousBOSS
Published in
15 min readAug 3, 2019

PPTP / L2TP / OpenVPN / SSTP / SSH Tunnel / IPSec / IKEv2

Photo by Petter Lagson on Unsplash

RouterOS支援非常多種的VPN協議,包括PPTP、L2TP、OpenVPN、SSTP、SSH Tunnel、IPSec與IKEv2等,除了支援點對站 (client-to-site)之外,也支援站對站 (site-to-site)。

點對站 (client-to-site)用於電腦或手機連線至RouterOS;而站對站 (site-to-site)則用於RouterOS連線至RouterOS。站對站 (site-to-site)就好像是建立起A-B兩地之間的虛擬私人網路。

這篇文章主要描述在RouterOS上,點對站 (client-to-site)的這種VPN協議設定方式。為了精確描述操作流程,以下將以CLI方式紀錄。

在RouterOS啟用這些VPN Server的同時,有以下幾個項目需要視個別情況作設定

/ip pool
add name=VPN_Pool ranges=192.168.88.100–192.168.88.150
add name=OVPN_Pool ranges=192.168.88.32/30
/ppp profile
set [find name=default-encryption] dns-server=192.168.88.1 local-address=192.168.88.1 remote-address=VPN_Pool
add name=OpenVPN dns-server=192.168.88.1 local-address=192.168.88.32 remote-address=OVPN_Pool use-encryption=yes change-tcp-mss=yes
/ppp secret
add name=帳號 password=密碼 profile=default

PPTP

Point to Point Tunneling Protocol. 有關PPTP的詳細說明,可以參考MikroTik PPTP

/interface pptp-server server
set authentication=mschap2 default-profile=default-encryption enabled=yes
/ip firewall filter
add chain=input dst-port=1723 protocol=tcp
add chain=input protocol=gre

PPTP的設定只要使用上面的CLI,基本上就可以連線了,在電腦或iOS裡面新增VPN,輸入帳號與密碼即可

L2TP over IPSec

Layer 2 Tunneling Protocol over Internet Protocol Security. 有關L2TP的詳細說明,可以參考MikroTik L2TP

/interface l2tp-server server
set authentication=mschap2 enabled=yes

/ip ipsec proposal
set [ find default=yes ] enc-algorithms=aes-128-cbc,aes-192-cbc,aes-256-cbc lifetime=8h pfs-group=none
/ip ipsec peer
add enc-algorithm=aes-128,aes-192,aes-256 exchange-mode=main-l2tp generate-policy=port-override lifetime=8h passive=yes secret=密鑰 send-initial-contact=no
/ip firewall filter
add chain=input dst-port=1701,500,4500 protocol=udp
add chain=input protocol=ipsec-esp

L2TP/IPSec的設定只要使用上面的CLI,基本上就可以連線了,在電腦或iOS裡面新增VPN,輸入帳號、密碼與密鑰即可。

-=Apple iOS額外注意事項=-

在RouterOS上有一點要注意,因為當你使用以下CLI,若系統會自動幫你完成IPSec的設定,則IPSec中Peer的generate-policy要設成port-override,而以下CLI的預設值是port-strict

/interface l2tp-server server
set authentication=mschap2 enabled=yes ipsec-secret=密鑰

OpenVPN

Open Source VPN. 有關OpenVPN的詳細說明,可以參考MikroTik OVPN

/certificate
import file-name=OpenSSL_CA.crt
import file-name=OpenSSL_CA.key
/interface ovpn-server server
set auth=sha1 certificate=匯入OpenSSL_CA後的名稱 cipher=blowfish128,aes128,aes192,aes256 default-profile=OpenVPN enabled=yes
/ip firewall filter
add chain=input dst-port=1194 protocol=tcp

RouterOS的設定按照以上CLI即可,而OpenVPN需要用到CA的Certificate與Private Key,這部份可以自己產生,利用NAS或是Linux/MacOS上的OpenSSL來跑,以下是範例,會產生上面CLI需要的OpenSSL_CA.key與OpenSSL_CA.crt。亦可以參考MikroTik Create Certificates

openssl genrsa -des3 -out OpenSSL_CA.key 2048openssl req -new -x509 -days 365 -key OpenSSL_CA.key -out OpenSSL_CA.crt

然後在電腦端的採用以下設定就可以連線了 (RouterOS.ovpn)

client
dev tun
proto tcp
remote 改成RouterOS的IP 1194
keepalive 10 120
auth SHA1
auth-user-pass
cipher AES-256-CBC
verb 5
redirect-gateway def1
dhcp-option DNS 8.8.4.4
ca OpenSSL_CA.crt

若是要用iPhone/iPad連OpenVPN,則要再多以下步驟:

  • 產生iOS要用的Certificate與Private Key,這會需要用到剛剛CA的Certificate與Private Key
openssl genrsa -des3 -out iOS.key 2048openssl req -new -key iOS.key -out iOS.csropenssl x509 -req -days 365 -in iOS.csr -CA OpenSSL_CA.crt -CAkey OpenSSL_CA.key -set_serial 01 -out iOS.crt
  • 設定檔改成如下所示 (iOS.ovpn)
client
dev tun
proto tcp
remote 改成RouterOS的IP 1194
keepalive 10 120
auth SHA1
auth-user-pass
verb 5
redirect-gateway def1
dhcp-option DNS 8.8.4.4
ca OpenSSL_CA.crt
cert iOS.crt
key iOS.key

然後將iOS.ovpn / iOS.crt / iOS.key / OpenSSL_CA.crt 用iTunes匯入iOS裡的OpenVPN App

  • 或者設定檔改成如下所示 (Client.ovpn)
client
dev tun
proto tcp
remote 改成RouterOS的IP 1194
keepalive 10 120
auth SHA1
auth-user-pass
verb 5
redirect-gateway def1
dhcp-option DNS 8.8.4.4
<ca>
— — -BEGIN CERTIFICATE — — -
OpenSSL_CA.crt的內容
— — -END CERTIFICATE — — -
</ca>
<cert>
— — -BEGIN CERTIFICATE — — -
iOS.crt的內容
— — -END CERTIFICATE — — -
</cert>
<key>
— — -BEGIN RSA PRIVATE KEY — — -
iOS.key的內容
— — -END RSA PRIVATE KEY — — -
</key>

然後將Client.ovpn透過Email附件的方式由OpenVPN App開啟

  • 在iOS的設定->OpenVPN->Force AES-CBC ciphersuites,這個選項要關閉,因為OpenVPN App使用128-bit、CBC模式的Blowfish。若沒關閉則會發生Transport Error。
  • 打開OpenVPN App,依序輸入使用者帳號、iOS.key的密碼(pass phrase, not challenge password)、使用者密碼,即可連線
  • 如果不是完全依循上面的流程設定,而無法連線時,請看一下Log檔是否有出現以下訊息:

TUN Error: tun_prop_error: ifconfig addresses are not in the same /30 subnet (topology net30)

這說明在使用OpenVPN連線時,Local Address與Remote Address不在同一個/30的子網域內,請修正

  • Apple iOS 8+版本的iPhone/iPad可以開啟「Seamless tunnel」,這樣一來可以在暫停、恢復、重連線時仍維持VPN連線為有效狀態

SSTP

Secure Socket Tunneling Protocol. 有關SSTP的詳細說明,可以參考MikroTik SSTP

/certificate
import file-name=StartSSL_CA.crt
import file-name=StartSSL_CA.key
/interface sstp-server server
set certificate=匯入StartSSL_CA後的名稱 default-profile=default-encryption enabled=yes force-aes=yes

RouterOS的設定按照以上CLI即可,而SSTP需要用到CA的Certificate與Private Key,可以按照上面產生iOS用的Certificate與Private Key的方始產生,但是Client端就要匯入這些自行產生的憑證。

然後在電腦上透過SSTP連線軟體,輸入Domain name及帳號與密碼即可連線,注意一定要是Domain name而不是IP喔

SSH Tunnel

Secure Shell Tunnel. 有關SSH的詳細說明,可以參考MikroTik SSH

/ip service
set ssh disabled=no
/ip ssh
set forwarding-enabled=yes

RouterOS的設定按照以上CLI即可,主要是確定有開啟SSH服務及打開SSH的forward功能。接下來只要在電腦端設定好SOCKS Proxy即可連線,其中Proxy指向127.0.0.1而Port則指向PuTTY、iSSH(MacOS)、SSH Proxy(MacOS)設定的port

IPSec

Internet Protocol Security.
有關IPSec的詳細說明,可以參考MikroTik IPSec

/ip ipsec mode-config
add address-pool=VPN_Pool name=Cisco_Mode split-include=其他Subnet
/ip ipsec policy group
add name=Cisco_Group
/ip ipsec proposal
set [ find default=yes ] enc-algorithms=aes-128-cbc,aes-192-cbc,aes-256-cbc \
lifetime=8h pfs-group=none
/ip ipsec peer
add auth-method=pre-shared-key-xauth enc-algorithm=aes-128,aes-192,aes-256 generate-policy=port-strict lifetime=8h mode-config=Cisco_Mode passive=yes policy-template-group=Cisco_Group secret=密鑰
/ip ipsec policy
add dst-address=VPN_Pool網段 group=Cisco_Group src-address=其他Subnet tunnel=yes template=yes
add dst-address=其他Subnet group=Cisco_Group src-address=VPN_Pool網段 tunnel=yes template=yes
/ip ipsec user
add name=帳號 password=密碼

其中Mode Config、Policy Group、Policy Template是用來解決generate-policy所帶來的其他問題,譬如Client端可以產生任何Policy並存取任何區網段

IKEv2

Internet Key Exchange v2. 有關IKEv2的詳細說明,可以參考MikroTik Road Warrior Setup IKEv2 RSA Auth

Step 1:建立Certificate,之前OpenVPN採用OpenSSL的方式來產生Certificate,這邊採用RouterOS內建的功能來作示範

/certificate
add common-name=RouterOS_CA name=ROS_CA key-size=4096 days-valid=3650
sign ROS_CA ca-crl-host=RouterOS的IP
add common-name=RouterOS的FQDN subject-alt-name=IP:RouterOS的IP key-size=4096 days-valid=3650 key-usage=tls-server name=Server
sign Server ca=ROS_CA
add common-name=IKEv2_Client key-size=4096 days-valid=3650 key-usage=tls-client name=Client
sign Client ca=ROS_CA

Step 2:設定IPSec

/ip ipsec proposal
set [ find default=yes ] auth-algorithms=sha256,sha1 enc-algorithms=aes-128-cbc,aes-192-cbc,aes-256-cbc lifetime=8h pfs-group=none
/ip ipsec mode-config
add address-pool=VPN_Pool address-prefix-length=32 system-dns=yes name=IKEv2 split-include=其他Subnet
/ip ipsec peer
add auth-method=rsa-signature certificate=Server dh-group=modp2048 enc-algorithm=aes-256 exchange-mode=ike2 generate-policy=port-strict hash-algorithm=sha256 mode-config=IKEv2 passive=yes

Step 3:匯出Certificate

/certificate export-certificate ROS_CA/certificate export-certificate Client export-passphrase=自行設定的密碼

此時應該會產生三個檔案 cert_export_ROS_CA.crt, cert_export_Client.key, cert_export_Client.crt。這時我們需要使用額外的工具如OpenSSL來將.crt與.key的檔案轉換成PKCS12的格式(副檔名為.pfx)

openssl pkcs12 -export -out RouterOS.pfx -inkey cert_export_Client.key -in cert_export_Client.crt -certfile cert_export_ROS_CA.crt

Step 4:將產生的RouterOS.pfx與cert_export_ROS_CA.crt匯入手機或電腦(例如透過電子郵件寄送給自己後,在手機上打開,先安裝cert_export_ROS_CA.crt,再安裝RouterOS.pfx,這時需要輸入匯出Certificate時自行設定的密碼

Step 5:設定IKEv2 VPN,以Apple iOS為例
1. 類型:IKEv2
2. 描述:欲識別的名稱
3. 伺服器:RouterOS的FQDN或IP
4. 遠端識別碼:RouterOS的FQDN或IP
5. 本機識別碼:
6. 使用者認證:無
7. 使用憑證:啟用
8. 憑證:IKEv2_Client (產生憑證時所設定的Common Name)

然後就可以透過IKEv2 VPN連線了

各種VPN協議比較

VPN Protocol Comparison

--

--