Доступ к Mikrotik webfig по https
Пришла идея извне настроить ssl доступ к роутеру mikrotik, так чтобы был домен и валидный сертификат. Это делается очень просто. Для решения задачи нам необходимы:
- статический внешний IP адрес роутера
- зарегистрированное доменное имя
- доступ к DNS на хостинге
- доступ к серверу с сайтом
Декомпозиция задачи выглядит следующим образом:
- Настройка DNS (mikrotik.mydomain.ru)
- Генерирование сертификата letsencrypt
- Настройка proxy на роутере на хостинг для подтвержения сертификата
- Установка сертификата на роутер
Настройка DNS
Добавляем А запись mikrotik к вашему домену mydomain.ru с вашим статическим адресом. Не закрываем сервис, возможно придется далее еще вернуться к нему.
Устанаваливаем Certbot
Устанавливаем на рабочую машину, на которой будем генерировать сертификат.
# sudo apt-get install software-properties-common -y
# add-apt-repository ppa:certbot/certbot
# sudo apt-get update
# sudo apt-get install certbot -y
Пробуем сгенерировать сертификат (где mikrotik.mydomain.ru - ваш домен):
# sudo certbot certonly --preferred-challenges=dns --manual -d mikrotik.mydomain.ru --manual-public-ip-logging-ok
где строка preferred-challenges говорит, что проверка домена будет проходить через запись в dns. далее пишется предложение:
[flickr:id=32020684988]
Please deploy a DNS TXT record under the name
_acme-challenge.mikrotik.mydomain.ru with the following value:
aeMwRJe37wluDcnzWE-wE23QkJtex39yZI8AH172xbc
К сожалению, у меня DNS на хостинге обновляется раз в сутки. Для тех у кого, нет таких проблем добавляем еще одну TXT запись в DNS acme-challenge.mikrotik.mydomain.ru c соответствующим значением. Для остальных предлагаю решение, получаем сертификат следующим образом:
sudo certbot certonly --manual -d mikrotik.mydomain.ru --manual-public-ip-logging-ok
Через дефолтный http челендж, и вывод будет такой:
http-01 challenge for mikrotik.mydomain.ru
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Create a file containing just this data:
hBPnwYLqUtUzGXoWrQtG7RVH53pDvLFa2uhly9VfOa8.Xlgp_qCFV-GK1dhg7B_1SP-wxoLQjKSp88PGDBzaxZg
And make it available on your web server at this URL:
http://mikrotik.mydomain.ru/.well-known/acme-challenge/hBPnwYLqUtUzGXoWrQtG7RVH53pDvLFa2uhly9VfOa8
[flickr:id=32020687108]
Необходимо создать файл http://mikrotik.mydomain.ru/.well-known/acme-challenge/hBPnwYLqUtUzGXoWrQtG7RVH53pDvLFa2uhly9VfOa8, который будет возвращать строку hBPnwYLqUtUzGXoWrQtG7RVH53pDvLFa2uhly9VfOa8.Xlgp_qCFV-GK1dhg7B_1SP-wxoLQjKSp88PGDBzaxZg по http.
Настройка proxy на роутере на хостинг для подтвержения сертификата
Естественно наш роутер не может вернуть строки. Суть решения: certbot ---> certbot server ---> mikrotik router (mikrotik.mydomain.ru, proxy) ---> другой сервер который подтвердит владение доменом.
Настраиваем через webfig прокси на mikrotik через nat:
- Необходимо перенести web службу на другой порт 8080
IP => Service => web port 8080
IP => Service => ssh port 2280
IP => Service => web-ssl port 2325
Остальные службы лучше поотключать вовсе.
[flickr:id=32020685438]
- Настроить NAT на 80 порту с переадресацией на другой сервер IP => Firewall => NAT => Add new
Chain: dstnat
Protocol: 6(tcp)
Dst.Port: 80
Action: dst-nat
To Addresses: 192.168.0.2
To Ports: 80
[flickr:id=32020686038]
[flickr:id=32020685758]
- Настроить filter который разрешает трафик на другой сервер В маршрутизаторах mikrotik NAT находится перед фильтром, поэтому необходимости прописывать разрешение для NAT нет. Разрешение необходимо прописать на порт 8080 чтобы он был доступен снаружи и для forward established трафика.
IP => Firewall => Filter Rules => Add new
Chain: input
Protocol: 6(tcp)
Dst.Port: 8080
По умолчанию задан Action: accept.
Теперь пропишем страницу которая будет отдавать ключевое поле. На моем сервере установлен lighttpd:
Создадим конфигурацию:
# nano /etc/lighttpd/conf-enabled/router.conf
$HTTP["host"] =~ "^mikrotik\.mydomain\.ru" {
server.document-root = "/tmp/"
accesslog.filename = "/tmp/access.log"
url.rewrite-once = (
"^/(.*)" => "/acme.txt",
)
}
Любой запрос на сервер по имени хоста mikrotik.mydomain.ru будет возвращать строку с кодом.
Создадим необходимый файл, перезагрузим сервер:
echo 'aeMwRJe37wluDcnzWE-wE23QkJtex39yZI8AH172xbc' >> /tmp/acme.txt
touch /tmp/access.log
sudo lighttpd service restart
Устанавливаем сертификаты на mirotik
Запускаем certbot снова, файлы сертификатов успешно созданы:
/etc/letsencrypt/live/mikrotik.mydomain.ru/fullchain.pem
/etc/letsencrypt/live/mikrotik.mydomain.ru/privkey.pem
Копируем их на маршрутизатор, сервис мы перенесли на порт 2280 для безопасности:
sudo cd /etc/letsencrypt/live/mikrotik.mydomain.ru/
scp -p 2280 fullchain.pem admin@mikrotik.mydomain.ru:/
scp -p 2280 privkey.pem admin@mikrotik.mydomain.ru:/
Подключаемся к маршрутизатору по ssh:
ssh admin@mikrotik.mydomain.ru -p 2280
Импортируем сертификаты
/certificate import file-name=fullchain.pem passphrase=""
certificates-imported: 2
private-keys-imported: 0
files-imported: 1
decryption-failures: 0
keys-with-no-certificate: 0
/certificate import file-name=privkey.pem passphrase=""
certificates-imported: 0
private-keys-imported: 1
files-imported: 1
decryption-failures: 0
keys-with-no-certificate: 0
Для безопасности удалим файлы сертификатов из маршрутизатора:
/file remove fullchain.pem
/file remove privkey.pem
Выведем информацию о сертификатах:
/certificate print
Flags: K - private-key, D - dsa, L - crl, C - smart-card-key, A - authority,
I - issued, R - revoked, E - expired, T - trusted
# NAME CO.. SUBJECT-ALT-NAME FI..
0 K T full... mi.. DNS:mikrotik.mydomain.ru 1d..
1 L T full... Le.. 25..
При установке сертификатов на службу при нажатии на tab, можно увидеть 2 сертификата fullchain.pem_0 сертификат and fullchain.pem_1 Let’s Encrypt CA. Для использования сертификатов нужно ввести следующие команды:
/ip service set www-ssl certificate=fullchain.pem_0
/ip service set api-ssl certificate=fullchain.pem_0
Можно также переименовать сертификаты:
/certificate set 0 name="mikrotik.mydomain.ru"
/certificate set 1 name="Let's Encrypt Authority X3"
Все готово. Проверьте, что https://mikrotik.mydomain.ru:2325 работает, выключите службу web. И желательно выключите учетную запись admin на маршрутизаторе, предварительно добавив другую.
Дополнительный материал: https://blog.effenberger.org/2018/04/22/creating-ssl-certificates-on-routeros-with-lets-encrypt/