VPN site to site with OpenVPN in Mikrotik

Discussion in 'Proxy, VPN Network Security' started by Mickey, Dec 17, 2017.

  1. Mickey

    Mickey Hacking For Hacker Staff Member

    • Administrator
    Ngày nay, nhu cầu có 1 modem đáp ứng được về số lượng user lớn, giá thành rẻ là luôn luôn cần thiết đối với mỗi công ty. Chính vì thế nên Mirotik nổi lên như ứng viên số một đáp ứng được 2 tiêu chí nói trên. Nhưng để control được mikrotik thì các bạn phải bỏ thời gian nghiên cứu rất nhiều chứ không hề đơn giản như các modem bình thường khác.

    Về VPN site to site thì có rất nhiều kiểu kết nối như IPSec, PPTP hay OpenVPN. Bản thân mình thì đã sử dụng OpenVPN và cảm thấy chạy khá ổn. Trong bài viết này mình sẽ hướng dẫn các bạn cấu hình VPN site to site trên mikrotik bằng OpenVPN.

    [​IMG]

    Đây là mục tiêu trong bài của mình.

    1. Cấu hình trên main site (site A)
    1.1. Cấu hình NTP Client
    Trước tiên, mình sẽ dùng NTP để đảm bảo thời gian trên các site luôn luôn đồng nhất với nhau

    [​IMG]

    • Vào system -> SNTP Client -> Enabled và điền các server cần sync.
    1.2. Tạo certificate
    Bước này mình sẽ tạo cert trên mikrotik main site và sau đó sẽ copy cert này gửi cho các client. Bước này mình sẽ dùng câu lệnh trên terminal của mikrotik nhé.

    • Gen certificate
    PHP:
    [admin@MikroTik] > /certificate add name=ca-template common-name=CA key-usage=key-cert-sign,crl-sign
    [admin@MikroTik] > /certificate add name=site-a-template common-name=site-a
    [admin@MikroTik] > /certificate add name=site-b-template common-name=site-b
    [admin@MikroTik] > /certificate add name=site-c-template common-name=site-c
    • Sign certificate
    PHP:
    [admin@MikroTik] > /certificate sign ca-template ca-crl-host=172.16.0.254 name=CA
    [admin@MikroTik] > /certificate sign ca=CA site-a-template name=site-a
    [admin@MikroTik] > /certificate sign ca=CA site-b-template name=site-b
    [admin@MikroTik] > /certificate sign ca=CA site-c-template name=site-c
    • Trust CA và site a
    PHP:
    [admin@MikroTik] > /certificate set CA trusted=yes
    [admin@MikroTik] > /certificate set site-a trusted=yes
    • Export CA và cert của site b, c
    PHP:
    [admin@MikroTik] > /certificate export-certificate CA
    [admin@MikroTik] > /certificate export-certificate site-b export-passphrase=123456
    [admin@MikroTik] > /certificate export-certificate site-c export-passphrase=123456
    Các bạn nhớ đặt password khi export ra nhé. và nhớ cái password này nhé. Sau khi export xong, các bạn vào Files để lấy CA và cert của site b + c download về máy nhé

    1.3. Tạo OpenVPN Server
    • Tạo pool DHCP cho branch site kết nối
      IP -> Pool -> Add
      [​IMG]
      Tại phần này mình có 1 lưu ý nho nhỏ với các bạn. Nếu các bạn kết nối nhiều branch site thì phải gán tĩnh IP theo mac nhé. Để khi kết nối lại thì không bị đổi IP.

    • Tạo PPP Profile
      PPP -> Profile -> Add
      [​IMG]
      [​IMG]
      Ở bước này nhớ trỏ Remote Address về pool DHCP các bạn vừa tạo bên trên nhé

    • Tạo PPP Secret
      PPP -> secret -> Add. Và điền thông tin. Bước này nhớ chọn Service là ovpn và Profile là profile các bạn vừa tạo.
      [​IMG]

    • Tạo OVPN server
      PPP -> OVPN server.
      [​IMG]
      Tại bước này, các bạn nhớ tích vào Enabled , Port (tùy các bạn. Ở đây là port TCP nhé. Mikrotik chưa hỗ trợ UDP đâu). Chọn mode là IP (để tạo 1 mạng ảo mới giữa các site). Default profile tới profile các bạn vừa tạo. Và Certificate là cert của main site. trong bài mình tạo là site-a

    • Tạo rule firewall
      IP -> Firewall -> Filter Rule -> Add. Chain: input, Protocol: TCP, Dst. Port: port ở bước trên
      [​IMG]

    • Bước cuối cùng trên main site là tạo route cho các dải mạng kết nối từ branch site. Lưu ý: bước này chỉ thực hiện sau khi branch site đã kết nối được tới main site qua vpn nhé.
      /ip route add dst-address=network gateway=<ovpn-openvpnuser-1>
      VD: [​IMG]
    2. Cấu hình trên branch site (site B + C)
    2.1. Import CA and cert
    Ở bước trước, mình có nhắc các bạn download CA và cert branch site về máy đúng không. Giờ là lúc cần các cert đấy để import vào mikrotik đây.
    Sau khi các bạn Upload CA và cert lên Files như này: [​IMG]

    Ta sẽ tiến hành import tiếp.
    Go System -> Certificates -> Import.
    [​IMG]
    Với CA thì các bạn chỉ cần import 1 lần. Nhưng với Cert thì các bạn phải import 2 lần. Lần đầu là file .crt và lần thứ 2 là file .key (với password khi export từ main site)

    2.2. Tạo OVPN Client
    • Tạo PPP interface OVPN
      Interface -> OVPN Client
      [​IMG]
      [​IMG]
      Bước này thì các bạn nhớ điền IP của man site vào phần Connect To. Port cấu hình trên main site. Mode: ip. User với Password của phần PPP Secret nhé. Certificate: theo cert branch import. Phần Add Default Route thì trừ khi các bạn muốn branch site connect và sử dụng mạng của main site thì tích nhé. (khuyến khích là không nên)
      OK. xong phần này thì các bạn có thể check ở phần Interface, sẽ thấy 1 cổng mới. Đó chính là kết nối VPN.
      Phần cuối cùng trên branch site là add route tới main site
      /ip route add dst-address=main-network gateway=10.9.9.49
      [​IMG]
    Về cơ bản là chúng ta đã cấu hình hoàn tất.
    Đặc điểm của OepnVPN trên mikrotik là khi bị mất kết nối vpn (do mạng chập chờn hoặc down line internet) thì khi có internet lại, các site branch sẽ tự động kết nối lại. Nhưng có 1 vấn đề là các route tới branch ở main site sẽ bị disable. Và chúng ta sẽ phải tự vào chỉnh lại route bằng tay. Mình có viết 1 script nhỏ để khắc phục tình trạng đó.

    Terminal
    PHP:
    ### add srcipt check ping tới site-b, nếu không ping được thì set lại gateway về IP của site b
    /system script add name=up-vpn-site-b source={:if   (  [/ping 172.17.1.1 count=5] = 0) do={[/ip route set  [/ip route find dst-address=10.10.1.0/24gateway=10.9.9.57];[/ip route set  [/ip route find dst-address=172.17.0.0/21gateway=10.9.9.57]}}
    ### add schedule chạy script "up-vpn-site-b" 2 phút 1 lần
    PHP:
    /system scheduler add name=check-vpn interval=2m on-event=up-vpn-site-b
    Khi dùng VPN site to site, các bạn phải đảm bảo rằng hệ thống của mình phải luôn được kết nối. Vì vậy nếu có 1 line dự phòng thì làm sao để khi line chính down thì các branch site sẽ tự động kết nối được tới line dự phòng kia. Vấn đề ở đây được giải quyết với Netwatch trên các branch site. Đây là script của mình:

    Terminal
    PHP:
    ### thay ovpn-site-b bằng tên openvpn connect tới main site. Và phần connect-to tới IP trên main site tương ứng
    /system script add name=vpn source={/interface ovpn-client set ovpn-site-b connect-to=1.2.3.4}
    /
    system script add name=vpn-2 source={/interface ovpn-client set ovpn-site-b connect-o=6.7.8.9}
    ### netwatch: thay host = IP chính của main site. Khi ping được IP đấy thì sẽ dùng script vpn, nếu down thì sẽ dùng script vpn-2 để up đường backup lên
    /tool netwatch add host=1.2.3.4 up=vpn down=vpn-2 interval=00:00:10

    [​IMG]

    Done. Vậy là các bạn có thể yên tâm mà ngủ rồi :D
     

Share This Page