무료 Let's Encrypt SSL인증서를 미크로틱(Mikrotik)에 설치하자

Mikrotik + Let's Encrypt
미크로틱 장비 자체에서 Lets Encrypt를 사용할 수 있게 되었다!

이전에 Mikrotik WebProxy 기능으로 외부에서 Home 서버를 웹으로 연결할 수 있도록 작업을 하고 조금 아쉬웠던 부분중에 하나가 https처리를 백엔드의 웹서버에서 하거나 Mikrotik장비에서 처리를 하려면 SSL 인증서 별도로 Import를 해야하는 부분이었다. 그리고 시간이 좀 지나 미크로틱 RouterOS v7 부터는 이제 장비 자체에서 무료 Let's Encrypt SSL인증서를 설치할 수 있고, 스크립트를 통해 3개월마다 업데이트 작업까지 할 수 있게 되었다.

 

Mikrotik에서 이런 업데이트를 하게된 이유는 미크로틱에서 제공하는 WEB 관리콘솔을 https로 연결할때 SSL인증서를 Import하지 않는 이상 장비 자체에서 생성된 사설인증서를 사용하게 되어 경고 메시지를 보여주기 때문이지만 ^^

이것을 이용해 WebProxy로 작동하는 External 포트에도 SSL적용 가능하다.(미크로틱의 www-ssl 포트는 마음대로 수정할 수 있으니까 ^^)

Mikrotik Cert Error page
사설인증서 사용시 브라우저에서 인증서 오류가 발생한다.

 

아무리 공짜가 좋아도 몇년간 잘 써왔던 RouterOS v6버전을 v7로 업그레이드해야 하기 때문에 살짝 두렵긴 하지만, v7버전에서 많은 부분에서 좋은 개선들이 나와주었기에 안그래도 언젠가 꼭 해야만할 업그레이드인 것이다.

 

1. RouterOS v7 업그레이드를 위한 검토 

v7로 업그레이드가 실패하거나 업그레이드가 완료 되면 v6로 다운그레이드가 불가능하기 때문에, 아래 사이트에서 v6에서 v7로 RouterOS를 업그레이드시의 변경점을 먼저 살펴 보고 주의해서 진행을 했다.

https://help.mikrotik.com/docs/display/ROS/Upgrading+to+v7#Upgradingtov7-usermanager

 

Upgrading to v7 - RouterOS - MikroTik Documentation

Introduction This document describes the recommended steps for upgrading RouterOS to v7 major release and the possible caveats when doing so.  Upgrading from v6 to v7 happens exactly the same way, as upgrading within v6 releases. Please follow the Upgrade

help.mikrotik.com

 

그리고, 업데이트 피쳐중에서 눈에 확 들어오는

Let's Encrypt certificate generation!!

(엇! v7에서 WireGuard (OpenVPN의 대안) 도 지원한다니! 어머 이건 해야해....)

 

기능적으로 v6버전과 v7버전의 호환성도 따져보았다.

(IP tv때문에 IGMP Proxy기능에 문제가 있으면 업그레이드를 포기할까도 했다)

Feature Status
CAPsMAN OK
Interfaces OK
Wireless OK
Bridge/Switching OK
Tunnels/PPP OK
IPv6 OK
BGP
OK, but attention is required  *
OSPF OK, but attention is required **
MPLS OK, but attention is required ***
Routing filters OK, but attention required ****
PIM-SM See notes
IGMP Proxy OK
Tools OK
Queues OK
Firewall OK
HotSpot OK
Static Routing OK
User Manager See notes

 

2.  RouterOS v7로 업그레이드

v6에서 v7업그레이드는 Winbox GUI에서 Channel을 upgrade로 선택해 RouterOS v7버전으로 업그레이드할 수 있다.

set channel : upgrade

Mikrotik v7 Upgrade
Upgrade로 채널을 선택하면 v7버전으로 업그레이드를 할 수 있다.

 

또는 Winbox Terminal이나 ssh로 접속해서 업그레이드를 할수도 있다.

 ## set channel을 upgrade로 선택해 진행하면 된다.
 > system package update set channel=upgrade
            channel: upgrade
  installed-version: 6.49.2
     latest-version: 7.11.2
             status: New version is available
 > system package update download
 > system reboot

 

걱정했던 것에 비해 업그레이드 작업은 아무런 문제 없이 완료 되었다.

그리고, 연결되어 있는 기기들도 전과 다름없이 그냥 잘 작동해주었다.

RouterOS v7.11.2
RouterOS 7.11.2

 

다 잘될것 같은 행복한 느낌이 온다 ㅎㅎ

다행히 IGMP 프록시로 아이피티비도 여전히 잘나오고, 와이파이로 연결된 세탁기, 건조기, 냉장고, 에어컨 등등 모두 잘 연결되어 동작하는 것까지 확인했다. 그리고 v6과는 다르게 거의 모든 패키지들이 routeros 패키지 속으로 들어갔는지 패키지 리스트가 심플해졌다.

Mikrotik RouterOS v7의 Package List
Mikrotik RouterOS v7의 Package List

 그리고, 이제 Mikrotik장비에 SSL인증서를 설치하면 되는 것이다.

 

3. 미크로틱 장비에 Let's Encrypt SSL인증서 설치

Winbox GUI 에서는 아직 Let's Encrypt SSL인증서를 생성할 수 있는 UI를 제공하지 않는 것 같다.

대신 Winbox Terminal에서 커맨드라인으로 Let's Encrypt SSL인증서를 설치할 수 있다.

 

3-1. DDNS 도메인 이름부터  생성하자

우선 IP cloud 메뉴에서 DDNS를 등록해 도메인이름을 얻어보자.

(사용하는 도메인 이름이 있다면 그것으로 진행하면 된다.)

## 소유한 도메인이 있다면 이부분은 지나쳐도 된다.
> /ip cloud set ddns-enabled=yes ddns-update-interval=06:00:00 update-time=yes
> /ip cloud force-update
> /ip cloud print
          ddns-enabled: yes
  ddns-update-interval: 6h
           update-time: yes
        public-address: 58.000.207.199
              dns-name: 968909xxxxxx.sn.mynetname.net
                status: updated

 

Mikrotik Dynamic DNS설정이 완료 되었다.

(DNS Name으로 인터넷에서 미크로틱 공유기에 연결할 수 있게 된것이다)

Mikrotik DDNS Setting
외부에서 장비에 접속할때를 위해 DDNS정도는 켜놓는것이 좋다

 

3-2. SSL Validation을 위해 80 포트를 잠시 Open하자.

SSL인증서 발급과정에서 validation할 수 있도록 80포트가 열려 있어야 하고.

Mikrotik ip www 서비스는 활성화가 되어 있어야 한다.

## 다른 방화벽 정책에 막힐수도 있으니까 맨앞에(place-before=1) 정책을 추가하자.
> /ip firewall filter add chain=input action=accept protocol=tcp dst-port=80 in-interface-list=WAN place-before=1 comment="ssl_validation"

## Mikrotik Web Service를 활성화하고 Access 가능한 주소에 "0.0.0.0/0"(all) 을 추가 하자.
> /ip service enable www
> /ip service set www address="192.168.1.0/24, 192.168.100.0/24, 0.0.0.0/0"
> /ip service enable www-ssl
> /ip service set www-ssl address="192.168.1.0/24, 192.168.100.0/24, 0.0.0.0/0"


## firewall 정책이 잘 추가 되었는지 확인하자
> /ip firewall filter print
Flags: X - disabled, I - invalid; D - dynamic 
 0  D ;;; special dummy rule to show fasttrack counters
      chain=forward action=passthrough 

 1    ;;; ssl_validation
      chain=input action=accept protocol=tcp in-interface-list=WAN dst-port=80
    ...
    생략
    
## Web관리 콘솔(www) 서비스가 활성화되어 있는지 정보를 확인한다.
> /ip service print detail
Flags: X - disabled, I - invalid
 0 X name="telnet" port=23 address=192.168.1.0/24 vrf=main 
 1 X name="ftp" port=21 address=192.168.1.0/24 
 2   name="www" port=80 address=192.168.1.0/24,192.168.100.0/24,0.0.0.0/0 vrf=main 
 3   name="ssh" port=22 address=192.168.1.0/24,192.168.100.0/24 vrf=main

 

3-3. certificate 명령으로 Let's Encrypt ssl 인증서를 설치 하자.

/certificate명령으로 ssl 인증서를 활성화하면 미크로틱장비가 알아서 Let's Encrypt인증서를 밸리데이션하고 www-ssl에 연결하는 설정까지 완료해준다.

## 미크로틱 장비에서 제공하는 DDNS 도메인이름으로 인증서를 받아보자.
## success가 아니라면 외부에서 미크로틱 장비의 80포트에 접근하지 못하고 있는 것이다.
> /certificate enable-ssl-certificate dns-name=968909xxxxxx.sn.mynetname.net 
  progress: [success] ssl certificate updated
  
## error메시지가 이런식으로 발생한다면 외부에서 80포트로 validation 접근을 못하는 이유를 찾아야 한다.
> /certificate enable-ssl-certificate dns-name=968909xxxxxx.sn.mynetname.net 
  progress: [error] http challenge validation failed, please make sure www service is enabled and your device is accessible by letsencrypt.org servers

 

설치된 SSL인증서를 확인할 수 있다.

Mikrotik Certificates
Days Valid: 89일 뒤에 만료된다.

 

ip service의 www-ssl에 인증서 연결까지 잘 되어 있다.

www-ssl 에 인증서가 할당되어 있다

 

 

3-4. 웹브라우저로 https접근이 잘 되는지 확인 해보자.

그리고 이제 DDNS로 발급받은 주소를 크롬으로 열어보자! " https://968909xxxxxx.sn.mynetname.net "

Mikrotik WebFig 로그인 페이지가 https연결로 문제없이 보이고 SSL 인증서의 정보를 확인 할 수 있다.

https access test
발급받은 SSL인증서가 확인 된다.

 

3-5. 외부로 열어놓은 설정을 원복하자.

테스트를 위해서 SSL인증서를 설치 했었다면 이제는 SSL Validation을 위해 열었던 80포트를 닫아주고,

Web Service Allow address도 다시 내부 IP만 접근 되도록 변경해주면 된다.

## SSL인증서 발급이 정상으로 끝났다면 열어줬던 80포트를 닫아 주자.
> /ip firewall filter disable [find comment="ssl_validation"]

## http와 https Web service를 사용하지 않는다면 비활성화 시키는것이 좋다.
> /ip service disable www
> /ip service set www address="192.168.1.0/24,192.168.100.0/24"
> /ip service disable www-ssl
> /ip service set www-ssl address="192.168.1.0/24,192.168.100.0/24"

 

 

4. 마치며

제약사항_1 : 테스트를 하면서 확인해보니 SSL인증서를 멀티 호스트(*)로 받을 수 없고, 여러개를 받을수도 없다. 단 1개의 호스트에 대한 SSL인증서만 지원한다. (그래도 안되던게 되니까 이게 어디냐 싶다 ㅎㅎ) 

제약사항_2 : 아직 RouterOS는 Let's Encrypt SSL인증서 자동 업데이트를 지원하지 않고 있다.(살짝 실망...) 때문에 SSL인증서 자동 업데이트를 위해서는 미크로틱 스케줄러에서 일정기간마다 인증서를 자동 업데이트 하도록 만들어 줘야 한다. 다음 내용은 89일 이내에 자동업데이트를 할 수 있도록 Web Proxy설정과 함께 사용할 수 있는 스크립트를 스케줄러로 동작시키는 내용이 되어야겠다.

 


참고자료

https://help.mikrotik.com/docs/display/ROS/Upgrading+to+v7

https://help.mikrotik.com/docs/display/ROS/Certificates

https://youtu.be/T1Dyg4_caa4?si=Y7wTS8Fvt_3pK-Qs

https://wiki.mikrotik.com/wiki/SSL_Certificate_setup

https://wiki.mikrotik.com/wiki/Manual:Create_Certificates