What is DoH and how to cook it?

The dark times are coming… Threats of confidentiality and privacy on the Internet become more serious day by day. There are many ways to secretly harvest and track our personal data and data about behavior in the network, for example to sale it. The even bigger problem is that intruders or not honesty ISP’s or government structures can be spoofing our requests to the sites and divert traffic to other resources. For censorship purposes or for scamming.

How they can do it? I’ll try to explain. There are three big whales on which the Internet stands on: TCP/IP, DNS, and BGP. Let’s see how one of these works. How all we know all sites have their unique names, such as github.com or stackoverflow.com and so on. But they are for humans not for machines and network devices. Network devices are working with IP addresses, like this 1.1.1.1 or this 140.82.118.4 These addresses are hard to remember. That’s why we have a Domain Name System or DNS.

What going on when you type github.com in the address bar in your browser? Your browser needs to know where to find it on the Internet. He asks a DNS service to resolve the name github.com and DNS returns his IP address.

- You don't know how to get to the wikipedia.com? 
- Oh, yes, just go to 208.80.154.232

How does browser find DNS service? He asks operating system about it.

- Can you help me? I need a resolver.
- Of course! I use this resolver.

How does an operating system know about resolver? There are two ways. You may configure a specific resolver to which you trust. But if you don’t do this, by default it will be using any resolver that comes from a network. When you connect your device to a network (laptop, or smartphone and so on) this device receives an IP address from network equipment, and in addition, address of preferred DNS server(s).

And this is a problem. Even if you configured your preferred DNS server. Because the DNS protocol does not have any security. Questions and answers (queries) between your device and DNS service can be tracked or spoofed. Network devices of ISP’s, such as routers, for example, can read DNS queries without any problem. Also, they can manipulate them. We are under risks and often don’t know about it.

Luckily there is the technology to prevent it - its name is DNS over HTTPS (DoH). It encapsulates DNS queries into secured and encrypted HTTPS requests. As a result, these queries become encrypted and confidential. Already now you may start to use it. It supported by giants such as Google, Mozilla, Cloudflare and so on. This is yet young technology but I recommend to start using it.

If you use Firefox, ensure that you have version 62 or above. Go to the menu, choose Tools, and then Preferences. Go to the General section and into the Network Settings. Select Enable DNS over HTTPS, then types DoH resolver address. If you prefer Mozilla products you may use https://mozilla.cloudflare-dns.com/dns-query.

If you use Chrome, for now, you may turn on this feature via command line:

$ /usr/bin/google-chrome-stable --enable-features="dns-over-https<DoHTrial" --force-fieldtrials="DoHTrial/Group1" --force-fieldtrial-params="DoHTrial.Group1:server/https%3A%2F%2F1.1.1.1%2Fdns-query/method/POST"

Finally, visit https://1.1.1.1/help to ensure that your DNS queries are now encrypted. You will see something like this:

image

And this is good!

P.S.: for mobile devices, there are also brand name apps from Cloudflare for iOS and Android.

Let's speak English

Some time ago I started this blog for writing small notes about working issues. But… in a half year I wrote only two posts. I can say that I don’t have time to write, or I don’t have any interesting working issues I can write about. This is not a truth. I think that I don’t see a sense for it.

I know, that if I have a clear goal and it makes sense for me, it drives me ahead. Especially if I decide to do this public. So, what can be this special goal for me? What can be useful for a long time? I think this is English. I am a nonnative speaker. And it is a problem for me to understand spoken speech. The even bigger problem is to speak free. Speaking freely does not have a sense in itself. It must be needed for something else. For something bigger. And this is a goal.

So, I translated this site to English and decide to write posts only in English. At least that one in a week. I believe that it will be useful. Writing in English then thinking in English and then free to speak on it. For one year. After that, I will try to pass an interview and to take a job in a foreign company.

So, let’s start!

Один в поле не воин, или причем тут OSS?

Что такое команда? Чем она отличается от коллектива? За годы работы в телекоме я видел и общался со многими управленцами - от линейных руководителей до топ-менеджеров. Многие из них неплохие люди. Все они, чаще всего, являлись просто менеджерами, но не были лидерами.

В чем же разница между менеджером и лидером? В чем состоит феномен лидерства? Из чего он состоит? А как стать лидером? Что для этого можно сделать? Или нужно им родиться? Британские ученые, наверняка уже нашли ответы на эти вопросы, но я не знаю на них однозначного ответа. Могу только порассуждать об этом с не совсем обычной стороны.

На март 2019 года на GitHub насчитывается больше 96 миллионов репозиториев, которые созданы почти 30 миллионами зарегистрированных разработчиков. Эта цифра постоянно растет. И это только GitHub, а есть еще не менее известные BitBucket, SourceForge, LaunchPad и с десяток чуть менее известных. Все вместе это гигантская вселенная программных продуктов, хотя большинство из них, скорее всего, известны только авторам и паре-отройке их близких друзей. Тем не менее, если возникает потребность в какой-то программе или библиотеке, то с очень большой вероятностью, решение можно найти.

Думаю что не сильно преувеличу, если скажу что open source постепенно становится одной из основных тенденций в разработке программного обеспечения. В настоящее время сложно найти программный продукт, который так или иначе не использует в своем коде библиотеки или программные продукты с открытым исходным кодом. Да и в повседневном, обывательском смысле, практически в каждом используемом нами устройстве, мобильном телефоне, телевизоре, умном доме - есть хотя бы часть от open source.

А как мы, разработчики, чаще всего используем открытые исходники? Например, просто ищем то, что нужно для решения текущей проблемы или задачи. Клонируем, подключаем и используем. Круто же - просто и быстро, халява! Хотя некоторые и любят в таких случаях порассуждать, что библиотека унылое или глючное говно. Но, на самом деле, практически ничего не стоит хотя бы зарепортить о найденном баге или просто опечатке. Это нужно просто потому что вот так, небольшими совместными усилиями open source и развивается.

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

Уверен что каждый, так или иначе, может внести свой вклад. Сделать это совсем не сложно. И квалификация тут фактически не играет никакой роли. Никто перед merge-м не будет спрашивать вас где вы работали или учились. Главное чтобы код был хорошим.

С чего можно начать? С того, что под рукой - у каждого из нас найдется пара-тройка любимых библиотек или фреймворков которые используешь регулярно, а то и каждый день. Почти у каждого такого проекта есть комьюнити, есть список открытых Issue, во многих репозиториях есть что-то вроде «How To Contribute». Многие из них ждут нашей помощи.

Найти их легко, например, сделать поиск по GitHub по словам «good first issue», «help wanted» и так далее. Не хочется копаться во всем этом многообразии? Не беда, есть специальные ресурсы вроде up-for-grabs.net, codetriage.com или helpwanted.apache.org на которых любой сможет найти проект на свой вкус и профессиональный уровень. На самом деле даже необязательно обладать навыками программирования - можно писать или переводить документацию, быть тестировщиком, поддерживать инфраструктуру или делать дизайн. Задачи найдутся для всех!

И всегда есть вариант начать писать что-то свое. Или открыть миру уже существующий проект. Если конкретно вам он (ваш проект, проектик или библиотечка) полезен, то во всём мире, наверняка, найдется десяток другой, а то и тысяча-другая человек, которым это так же принесет пользу и которые будут вам благодарны.

Остается ответить на вопрос - зачем все это нужно? Из очевидного - это хорошая возможность прокачать свои профессиональные навыки. Заработать репутацию и улучшить свое резюме. Уверен, что есть на свете мифические рекрутеры-единороги, которые оценивают кандидатов, в том числе и по их профилю на GitHub. А еще можно создать свой «комплект увольнения» - то есть то, что останется с вами, когда вы поменяете место работы. Так же это прекрасная возможность улучшить свой английский и получить удовольствие от общения с единомышленниками - с самыми разными людьми со всего мира. Открыв свой проект сообществу вы получаете возможность улучшить его - все что вы не учли при разработке и тестировании - все это обязательно «сломают» и найдут.

И самое главное - это отличная возможность развить свои soft skills. Чтобы решать задачи, которые вы один выполнить не сможете вам потребуется команда. И вот это как раз про лидерство.

Даже два человека это уже команда. А чтобы она двигалась - как минимум ей потребуется общая цель. Для начала ее формулировка. Хорошо если вы еще и выработаете стратегию - назовем это «вИдение». Сформулируете общие правила, а лучше несколько простых принципов. В общем организуете совместную работу. И чтобы это не превратилось в затыкание дыр, а было системно, вам потребуется наладить процессы - планирования, организации, контроля и так далее.

А дальше что? Писать код? Нет, не только. Потребуется развить умение добиваться результата, нести ответственность, решать возникающие вопросы и коммуницировать.

И это самое интересное. Уверен в том, что для того чтобы быть хорошим программистом, как и хорошим лидером, нужно быть отличным коммуникатором. Не оратором, не мастером публичных выступлений. Можно быть с виду ботаником или задротом и ходить в свитере с оленями. Но быть при этом отличным коммуникатором. Уметь доносить свои мысли и свою точку зрения до других, а значит и уметь писать «хороший», то есть понятный для других код.

Итого, какой вывод? А вывод простой - open source это отличная возможность «прокачать» себя. И даже если после этого к вам не выстроится толпа рекрутеров из Google, Facebook или Яндекс - да и фиг с ними. В любом случае вы в плюсе - и опыт получите и свою конкурентоспособность на рынке труда повысите. А наработанные вами навыки, эти самые soft skills, навсегда останутся с вами.

GRUB rescue mode

В данной статье кратко описан личный опыт восстановления GRUB после установки Windows 10 в качестве второй ОС.

После установки Windows 10 в качестве второй ОС, grub может быть поврежден. Да, да, знаю, что необходимо сначала установить Win, а затем Linux. Но в моем случае это была не установка, а вынужденное обновление, поэтому grub был затерт и после перезагрузки я получил примерно следующее:

error: unknow filesystem.
Entering rescue mode...
grub rescue>

Это аварийная консоль восстановления grub с сильно ограниченным набором команд. Grub устанавливается в два места. Первая часть - в таблицу разделов MBR. Поскольку там очень мало места, то весь загрузчик туда поместиться не может. Именно поэтому grub имеет модульную структуру, и вторая часть - основные модули, конфигурационные файлы и т.п., располагаются на обычном разделе, который монтируется после загрузки в /boot.

Для начала нужно посмотреть список разделов командой:

grub rescue> ls
(hd0) (hd0,gpt1) (hd0,gpt2) (hd0,gpt3) 

далее можно попытаться посмотреть содержимое разделов, чтобы найти раздел с /boot:

grub rescue> ls (hd0,1)/

Если раздел с /boot найден, то все хорошо - устанавливаем этот раздел в качестве загрузочного:

grub rescue> set root=(hd0,2)
grub rescue> set prefix=(hd0,2)/boot/grub

и затем запускаем модуль normal, который загрузит все необходимое:

grub rescue> insmod normal
grub rescue> normal

Если раздел с /boot не был поврежден, то загрузчик запустит привычное меню grub.

Последним шагом, после загрузки системы, необходимо восстановить загрузчик grub:

 sudo grub-install /dev/sda
 sudo grub-mkconfig -o /boot/grub/grub.cfg