Mikrotik: Импортирование подписанного сертификата

Мы получили настоящий, подписанный SSL-сертификат для управления нашим Микротиком через HTTPS.
Нам нужны три файла:
— сертификат, подписанным неким провайдером сертификатов — файл «my.crt»;
— приватный ключ — файл «my.key»;
— промежуточные сертификаты (корневой и этого провайдера) вместе в одном файле — файл «im.crt»;

Загружаем эти файлы на Микротик через меню Files.

По моему опыту лучше начать с импорта промежуточного сертификата, иначе может случиться, что система выдаст в логи сообщение о неправильной подписи сертификата. Впрочем, возможно, это не помешает и уладится после загрузки промежуточных сертификатов.
В разделе System — Certificates нажимаем кнопку Import и в выпадающем меню «Only File», выбираем файла «im.crt» и нажимаем кнопку «Import». В моём случае появилось два сертификата, т.к. у нас в файле их два. Вероятно, можно импортировать их и по-отдельности, но я не пробовал, просто взял тот файл, который я использовал для Апача.

Затем так же загружаем файл с подписанным сертификатом «my.crt». Он должен появиться в списке сертификатов и перед ним буквы L (crl) и T (trusted).

Теперь надо добавить наш приватный ключ — делаем это так же через Import, после чего возле уже появившегося после предыдущего шага сертификата появится буква K (private-key).

Теперь осталось указать веб-серверу Микротика использовать наш сертификат — в разделе IP — Services — www-ssl меню Certificate. Без этого HTTPS может не работать и выдавать ошибку «ERR_SSL_VERSION_OR_CIPHER_MISMATCH».

Убедитесь, что у вас есть другой вход, например, ssh или простой HTTP, т.к. ошибка с сертификатами может привести к тому, что вы не сможете зайти через HTTPS. Также можно подстраховаться и нажать кнопку «Safe Mode», главное потом, если всё нормально, не забыть отжать эту кнопку, иначе роутер перезагрузится и ваши изменения пропадут.
Включите, если она ещё не включена, службу www-ssl в разделе IP — Services и проверьте подключение через HTTPS. Если всё нормально, то можно отключить простой HTTP.

Дополнение про обновление сертификата

Обновить только подписанный сертификат у меня не получилось — импортировал новый и пропала связь по HTTPS. Далее пришлось всё делать через SSH, а файлы сертификатов загружать на Микротик через SFTP.

Проще удалить все сертификаты и добавить заново:
certificate remove 0
certificate remove 1
certificate remove 2
certificate import file-name=im.crt
certificate import file-name=my.crt
certificate import file-name=my.key


В результате в выводе команды «certificate pr detail» у меня получилось два промежуточных сертификата и один приватный, причём приватный должен иметь отметки «KL T» (K — private-key, L — crl, T — trusted). В этом же выводе смотрим имя сертификата 'name=«my.crt_0»'

Затем надо проверить привязан ли сертификат к службе www-ssl:
ip service print detail where name=www-ssl
 "номер_службы"   name="www-ssl" port=443 address="" certificate=*A


У меня не привязан, т.к. имя сертификата изменилось
Указываем новое имя:
ip service set "номер_службы" certificate=my.crt_0

Проверяем:
ip service pr detail where name=www-ssl
 0   name="www-ssl" port=443 address="" certificate=my.crt_0


Проверяем HTTPS — работает.

PHP cURL reCAPTCHA

На сайте не работала reCAPTCHA — после клика на баннере «Я не робот» появлялась зелёная галочка, но после отправки формы выводилась ошибка про капчу.

В Интернете часто встречается совет скачать файл с сертификатами (с сайта curl.haxx.se) и прописать путь к нему в php.ini:
curl.cainfo="/www/php/cacert.pem"

Однако, мне это не помогло — php просто не видел этот файл, судя по выводу функции openssl_get_cert_locations:
<?
var_dump (openssl_get_cert_locations());
?>


Я пытался по всякому, но ничего не помогало, пока, к счастью, не попался другой параметр для php.ini:
openssl.cafile = "/www/php/cacert.pem"


Теперь в выводе указанной выше функции файл с сертификатами виден:
...["ini_cafile"]=> string(32) "/www/php/cacert.pem"...

Впечатления от iPhone

Вступление

Примерно полтора года назад купил iPhone 6s Plus.
Понадобился второй телефон, т.к. использовать два номера на одном двухсимочном аппарате очень неудобно.
Покупать простую кнопочную звонилку — не вариант, т.к. в этом случае возникают сложности с синхронизацией контактов между двумя телефонами.
Покупать второй телефон с Android скучно и неинтересно.
К тому же мне нужно было тестировать одно мобильное приложение, у которого есть версия и для Android, и для iOS.
На момент покупки актуальным был iPhone 7 и вот-вот, через пару месяцев, должен был выйти iPhone 8. Однако, цена актуального аппарата и отсутствие миниджека убедили меня выбрать iPhone 6s. А в виду того, что единственный на тот момент телефон был с относительно небольшим экраном — 5 дюймов — выбрал большую версию iPhone 6s Plus.

По прошествие достаточно большого срока хочу высказать своё мнение об iPhone в сравнении с телефонами Samsung C5 и Xiaomi Redmi 5 plus, которые я последовательно, сначала один, потом второй, использовал вместе с iPhone.

Читать дальше →

Sieve: несколько примеров

Не буду объяснять что это такое, просто несколько примеров:
# rule:[logs]
if anyof ( header :contains "Subject"
 [ "Cisco Log", "Juniper Log", "Switch log" ] )
{
        fileinto "INBOX.logs";
        stop;
}

# rule:[web]
if anyof ( header :contains "To" "www@domain.tld",
 header :contains "From" "www@domain.tld" )
{
        fileinto "INBOX.www";
        stop;
}

# rule:[911]
if anyof ( address [ "from", "to", "cc" ]
 [ "911@domain.tld", "911@domain2.tld" ] )
{
        fileinto "INBOX.911";
        stop;
}

# rule:[office]
if anyof ( address "from"
 [ "anna@domain.tld", "petya@mail.tld", "mitya@gmail.tld" ],
 address ["to","cc"] "info@domain.tld",
 address :domain "from" "xxx.tld" )
{
        fileinto "INBOX.office";
        stop;
}


Если надо сразу удалять какие-то сообщения, то можно сделать как-то так:
# rule:[testd]
if anyof (header :contains "Subject" "QQQ")
{
 discard;
 stop;
}


Думаю пояснения по правилам тоже не нужны.

Ремонт техники в Бишкеке.

Техника — это неотъемлемые вещи нашей жизни, которые делают нашу жизнь проще и удобнее каждый день при экономии нашего времени на постоянные рутинные работы и высвобождают драгоценное время для интересных и наших любимых дел. Конечно если ломается техника человек испытывает неудобства в быту и теряет уйму времени на рутинную работу, которую выполняет техника в 21 веке. Огромную роль играет качественный и своевременный ремонт и обслуживание вышедшей из строя так нужной каждый день бытовой или компьютерной техники. Куда и как обратится? Где найти нужного мастера бытовой или компьютерной техники? Где найти адреса ремонта бытовой и компьютерной техники? С полной уверенностью можно заявить, что наша компания Инком сервис делает профессиональный ремонт и сервисное обслуживание мелкой и крупной бытовой и компьютерной техники на одних из самых выгодных условий в г. Бишкек по самым приемлемым ценам на рынке ремонта и обслуживания бытовой и компьютерной техники с 2013 года. Клиенты компании получают качественный и отлаженный сервис и профессиональное техническое обслуживание бытовой и компьютерной техники. Офис в центре города имеет удобное расположение и доступность для наших клиентов. Мы сделали команду профессионалов при слаженной работе, которой вы получаете профессиональное обслуживание и ремонт бытовой и компьютерной техники. В современном мире человеку трудно обойтись без холодильника, телевизора, стиральной машинки, микроволновки, пылесоса, электрочайника, компьютера, ноутбука и прочей бытовой и компьютерной техники. Качественный ремонт — это экономия времени и вовремя поднятое настроение вас и ваших близких. Хороший мастер по первому признаку с легкостью определяет причину поломки и после необходимой диагностики устраняет проблему и все начинает работать. Именно наши специалисты работают по этому принципу – сделать качественно и на долго, что находит отклик среди наших постоянных клиентов, которые обращаются к нам за ремонтом бытовой и компьютерной техники и рекомендуют наши услуги своим родным и близким.

Основными нашими секретами успеха и популярности услуг ремонта и обслуживания бытовой и компьютерной техники в нашей компании являются:

Высококачественный ремонт и сервисное обслуживание компьютерной и бытовой техники – специалисты компании имеют более чем 10 летний опыт и практику работы в сфере ремонта и обслуживания компьютерной и бытовой техники.

В нашей компании всегда в наличии огромный выбор качественных деталей и запасных частей для ремонта компьютерной и бытовой техники, если же необходимой детали нет на складе наши сотрудники могут ее заказать и получить в кратчайшие сроки.

Оперативное обслуживание – наши специалисты по первому звонку выезжают к клиенту для осуществления качественного ремонта холодильников и стиральных машин в Бишкеке.

Мастера в нашем штате имеют богатый опыт и практику по ремонту бытовой и компьютерной техники.

В наше время есть огромное количество мастерских по ремонту бытовой и компьютерной техники в городе Бишкек. Как выбрать нужную мастерскую или мастера среди многообразия ремонтных мастерских чтобы проблема не повторилась снова?

Обратившись к нам в компанию Инком сервис, вы получаете: приемлемую стоимость услуг; услуги быстрого и качественного ремонта; положительные отзывы и репутацию.

Вы получаете высококачественный ремонт и обслуживание ведь наши специалисты знают и делают свою работу качественно и в срок. Обратившись к нам, вы получаете высокий сервис и удовлетворение от выпаленной работы в срок при индивидуальном подходе к каждому клиенту компании.

syslog-ng

Логи интересной мне программы по-умолчанию идут в /var/log/messages, но я хочу это изменить, т.к. в этот файл идёт много всего. Кроме того, туда попадают не все логи, а только определённого в конфиге syslog-а типа.

Направить логи от определённой программы в другой файл:

destination dest_myprog { file("/var/log/myprog.log"); };

filter filter_myprog { program("myprog"); };

log { source(s_sys); filter(filter_myprog); destination(dest_myprog); };


Направить логи от определённой программы на другой syslog-сервер:
destination dest_myserver { udp("10.1.1.1" port(514)); };

filter filter_myprog { program("myprog"); };

log { source(s_sys); filter(filter_myprog); destination(dest_myserver); };


Ну и комбинированный вариант — направить логи от определённой программы и в отдельный файл, и на другой syslog-сервер:
destination dest_myprog { file("/var/log/myprog.log"); };
destination dest_myserver { udp("10.1.1.1" port(514)); };

filter filter_myprog { program("myprog"); };

log { source(s_sys); filter(filter_myprog); destination(dest_myprog); destination(dest_myserver); };


Если те же логи в файле messages уже не нужны, то добавим их исключение в существующий фильтр, который используется для сохранения логов в этот файл:
filter f_default    { level(info..emerg) and
                        not (facility(mail)
                        or facility(authpriv)
                        or facility(cron))
                        and not program("myprog");
                    };


Конечно после изменений надо дать syslog-ng команду перечитать конфиг:
systemctl reload syslog-ng

Отключить масштабирование страницы на мобильных устройствах

Столкнулся с тем, что простая веб-страница криво отображается на смартфоне — размер шрифта разный, например, просто текст больше, чем текст ссылки или текст ссылки отображается большим шрифтом, то после тапа по нему размер уменьшается, а переход по ссылке не происходит.

Отключил масштабирование страницы на мобильных устройствах:
<meta name="viewport" content="width=device-width, initial-scale=1" />


А лучше вот так:
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">


Теперь всё отображается нормально.

Juniper: Мелочи

syslog

Включать в лог название категории (Facility) и уровень детальности (Severity):
set system syslog host syslog.tld.kg explicit-priority


Вот уровни детальности:
0 emergency
1 alert
2 critical
3 error
4 warning
5 notice
6 info
7 any

Пример:
Jul 10 19:45:07 212.42.96.132 mx inetd[12468]: %DAEMON-4: /usr/sbin/sshd[97698]: exited, status 255

Регулярные выражения

Понятно, что можно использовать регулярные выражения при выборке из какого-либо вывода через команду match, например:
user@juniper> show interfaces xe-2/3/3 | match "Input|Output"
  Input rate     : 0 bps (0 pps)
  Output rate    : 0 bps (0 pps)


Или найти сразу несколько нужных номеров вланов:
user@juniper> show configuration vlans | display set | match " (6|10|50|250|500)$"


А может, выбрать строки, начинающиеся с четырёх шестнадцатиричных значений (ipv6-пиры):
show bgp summary | match "^[0-9a-f]{4}"

Или вот так:
show bgp summary | match "^[0-9a-f]+:"


Состояния определённых интерфейсов:
show interfaces  terse | match "xe-(1/2/0|1/3/0|2/1/3|2/2/1|2/3/0)"   
xe-1/2/0                up    down
xe-1/3/0                up    up
xe-2/1/3                up    down
xe-2/2/1                up    down
xe-2/3/0                up    up


Однако, регулярные выражения можно использовать и в самих командах, например:
user@juniper> show interfaces xe-[23]/3/[01] terse
Interface               Admin Link Proto    Local                 Remote
xe-2/3/0                up    down
xe-2/3/1                up    down
xe-3/3/0                up    down
xe-3/3/1                up    down


Или вот так:
user@juniper> show interfaces ge-0/0/4[1-5] descriptions     
Interface       Admin Link Description
ge-0/0/41                  RESERVED
ge-0/0/42       up    up   Computer-1
ge-0/0/43       up    up   Computer-2
ge-0/0/45       up    up   Router-1


Информация о трансивере, например, уровень приёма:
show interfaces diagnostics optics xe-2/0/1


Копирование файлов из одного Routing Engine в другой

У каждого Routing Engine свои диски, так что все изменения с файлами, которые мы делаем на мастере, отсутствуют на бэкапе.

Перейти в _другой_ RE можно при помощи вот этой команды:
request routing-engine login other-routing-engine
Или же можно явным образом указать master или backup:
request routing-engine login master
request routing-engine login backup

Работать с файлами из cli можно, хоть и не очень удобно, например, вот так я создал папку на бэкапе и скопировал туда файлы с мастера:
file make-directory re1:/var/home/test/bin
file copy /var/home/test/bin/* re1:/var/home/test/bin

Juniper: Настройка автоматического копирования конфига при коммите

Конфиг роутера Juniper будем сохранять через scp, причём подключаться будем при помощи публичного ключа, а не пароля.
На сервере заводим пользователя juniper.
На роутере из-под пользователя root генерируем ключи:
>start shell
% su -
% ssh-keygen -t rsa -b 4096
cat /root/.ssh/id_rsa.pub


Обращаю внимание, что именно из-под пользователя root, а не из-под обычного пользователя, под которым вы вошли на роутер.

Полученный публичный ключ сохраняем в одну строку на сервере в папке пользователя juniper (в файле /home/juniper/.ssh/authorized_keys):
ssh-rsa AAAA...[очень много символов]... user@router


Теперь собственно автоматическое копирование конфига при коммите:
set system archival configuration transfer-on-commit
set system archival configuration archive-sites "scp://juniper@10.1.1.11/home/juniper"


Конфиги копируются в домашнюю папку юзера juniper /home/juniper:
router_20180303_072352_juniper.conf.gz
router_20180303_072625_juniper.conf.gz


Если на роутере несколько IP-адресов и вы хотите, чтобы по-умолчанию трафик исходил от адреса интерфейса lo0.0, то нужно сделать вот такие настройки:
set interfaces lo0 unit 0 family inet address 10.1.1.2/32 primary
set system default-address-selection


Указанные настройки влияют не только на копирование по scp, так что после коммита, не закрывая текущую сессию, проверьте доступность роутера открыв новую сессию )

Дополнение.

Если про комите выдаётся ошибка:
[edit security]               
  'ssh-known-hosts'           
    warning: statement has no contents; ignored

То нужно ввести ключ хоста, с которого мы подключаемся, в секции security — security: можно вручную, можно запросить с сервера, а можно импортировать его из уже созданного системой роутера. Лично мне последний вариант показался наиболее логичным:
set ssh-known-hosts load-key-file /var/home/user/.ssh/known_hosts