Спустя долгое время, как проэкспайрился домен itblog.pp.ua, я решил восстановить этот блог на новом домене.

Буду докидывать в него заметки, т.к. проделанная работа забывается.

 

Что хотелось бы добавить и что уже забыл:

  • исправление работы Windows Subsystem for Linux 2 в Windows 11 – исправил и совсем забыл, как это делал
  • продление работы сервера терминалов Windows без лицензии – это помню
  • устранение автоматического завершения работы на неактивированном Windows сервере – где-то находил инфу
  • выкачивание сайта с веб-архива – где-то находил инфу

 

Если ещё что-то вспомню – накидаю в этот пост

Получил недавно такую абузу:

Dear Sir or Madam,
>
> Multicast DNS (mDNS) is used for resolving host names to IP addresses
> within small networks that do not include a local DNS server. It is
> implemented for example by the Apple ‘Bonjour’ and Linux/BSD ‘Avahi’
> (nss-mdns) services. mDNS uses port 5353/udp.
>
> In addition to disclosing information about the system/network,
> mDNS services openly accessible from anywhere on the Internet can be
> abused for DDoS reflection attacks against third parties.
>
> Please find below a list of affected systems hosted on your network.
> The timestamp (timezone UTC) indicates when the openly accessible
> mDNS service was identified.
>
> We would like to ask you to check this issue and take appropriate
> steps to close the openly accessible mDNS services on the affected
> systems or notify your customers accordingly.
>
> If you have recently solved the issue but received this notification
> again, please note the timestamp included below. You should not
> receive any further notifications with timestamps after the issue
> has been solved.

Оказывается, на UDP порт 5353 слушал на всех интерфейсах avahi-daemon, который был установлен непонятно с чем (а может быть и по умолчанию в Linux Mint).

Смотрим, что слушает на этом порту:
netstat -tulpn |grep 5353
avahi-daemon

Побороть можно так следующим образом.

Проверяем зависимости, чаще всего avahi требует именно wine:

apt-rdepends wine | grep avahi

Если не нужен wine или зависимостей нет, то можно смело делать
apt-get remove avahi-daemon

Если нужен, то просто отключим:
update-rc.d avahi-daemon disable
/etc/init.d/avahi-daemon stop

Мне нравится утилита nethogs, которую я использую на своём сервере с Debian, для просмотра соединений и скорости передачи данных по процессам, но как-то она, после обновления, внезапно перестала работать, и стала выпадать с сообщением:

nethogs creating socket failed while establishing local IP — are you root?

Фикс такой:

wget -c https://github.com/raboof/nethogs/archive/v0.8.1.tar.gz
tar xf v0.8.1.tar.gz
cd ./nethogs-0.8.1/
sudo apt-get install libncurses5-dev libpcap-dev
make && sudo make install
sudo nethogs

Вот и всё.

function returnStatus(req, status) {
//console.log(req);
if(status == 200) {
console.log("The url is available");
// send an event
}
else {
console.log("The url returned status code " + status);
// send a different event
}
}

function fetchStatus(address) {
var client = new XMLHttpRequest();
client.onreadystatechange = function() {
// in case of network errors this might not give reliable results
if(this.readyState == 4)
returnStatus(this, this.status);
}
client.open(“HEAD”, address);
client.send();
}


fetchStatus("/");

 

В практике возникла задача удалить записи, созданные ранее определённой даты. Естественно, дата — это одно из полей таблицы.

Таким образом можно проверить какие записи будут удалены:
SELECT * FROM tablename WHERE date < DATE_SUB(NOW(), INTERVAL 385 DAY);

Удалить записи, которые были созданы ранее 385 дней назад:
DELETE FROM tablename WHERE date < DATE_SUB(NOW(), INTERVAL 385 DAY);

sudo !! — запустить последнюю команду от имени рута. Полезно, если вы забыли добавить sudo в начале строки.

python -m SimpleHTTPServer — сделать доступной текущую директорию по адресу http://$HOSTNAME:8000/.

^foo^bar — выполнить предыдущую команду, но с заменой. Например, попробуйте запустить echo «tprogezr», а затем ^z.

ctrl-x e — зажать Ctrl и не отпуская x, затем e. Запускает редактор, чтобы можно было удобно составить большую сложную команду.

пробел команда — выполнить команду, но не запоминать её в истории.

‘ALT+.’ или ‘ .’ — поместить аргумент последней команды в консоль.

reset — восстановить терминал после вывода в него сырых бинарных данных или других ошибок формирования текста на экране.

mount | column -t — информация о текущих смонтированных файловых системах с удобным оформлением по столбцам.

echo “ls -l” | at midnight — выполнить команду в указанное время.

curl ifconfig.me — получить свой внешний IP.

ssh -N -L2001:localhost:80 somemachine — создать туннель от 80 порта на удалённой машине до 2001 на локальной.

man ascii — быстрый доступ к таблице ASCII.

dd if=/dev/dsp | ssh -c arcfour -C username@host dd of=/dev/dsp — перенаправить звук с вашего микрофона на колонки на удалённой машине.

arecord -f dat | ssh -C user@host aplay -f dat — более современный вариант предыдущей команды.

ctrl+u […] ctrl+y — запомнить текущую набираемую команду, а затем восстановить. Например, если в процессе набора команды вы что-то забыли, а затем хотите вернуться и продолжить.

wget -random-wait -r -p -e robots=off -U mozilla http://www.example.com — выкачать весь сайт.

curl -u user:pass -d status=”Tweeting from the shell” [http://twitter.com/statuses/update.xml]; — сделать твит через curl.

(cd /tmp && ls) — перейти к директории, выполнить там команду, вернуться к предыдущей директории.

И так, для начала скачиваем софтину:

Если у Вас нет git, то делаем в Debian/Ubuntu:

apt-get install git

или в RH-based системах:

yum install git

Далее всё просто:
$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
$ ./letsencrypt-auto --help

После выполнения вышеописанной команды letsencrypt-auto подтянет все необходимые зависимости.

Далее, необходимо запустить генерацию сертификата, и чтобы не возиться с автоматическим добавлением ключа к вебсерверу (мало ли как он у нас настроен?), сообщим, что мы хотим сами вручную добавить его на вебсервер:

./letsencrypt-auto certonly --manual

После чего letsencrypt спросит имя доменов, для которых мы хотим сгенерировать сертификат, их нужно указать через пробел (например, domain.com www.domain.com) и приватный ключ а также попросит разрешения на запоминание вашего IP (не знаю, зачем это) и закинуть по указанному адресу файл с определённым именем и хешем:


http://domain.com/.well-known/acme-challenge/ТутДлинноеИмяФайлаБезРасширенияНаАнглийском

с содержимым:

КакойТоХешОснованныйНаИмениФайла.ИЕщёКакомТоКлючеНаАнглийском

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

Если всё проделали правильно, то в /etc/letsencrypt/live/domain.com будут лежать файл сертификата cert.pem и ключа privkey.pem

Поскольку наиболее популярный фронтенд — это nginx, то опишу, также, как должна выглядеть секция server{} с включенной поддержкой SSL (HTTPS):

Включаем принудительно перенаправление HTTP->HTTPS

server {
listen aaa.bbb.ccc.ddd:80;
server_name domain.com www.domain.com;
location / {
return 301 https://domain.com$request_uri;


                }
}

Так выглядит виртуальный хост с указанными сертификатом и ключём:

server {
listen aaa.bbb.ccc.ddd:443 ssl;
server_name domain.com www.domain.com;
keepalive_timeout   60;
...
ssl_certificate       /etc/letsencrypt/live/domain.com/cert.pem;
ssl_certificate_key   /etc/letsencrypt/live/domain.com/privkey.pem;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers  "RC4:HIGH:!aNULL:!MD5:!kEDH";
add_header Strict-Transport-Security 'max-age=604800';
...
}

Проверяем конфиг nginx:

nginx -t

И если всё хорошо, применяем новую конфигурацию:

nginx -s reload

Enjoy your food!

В статье будет описана работа с протоколом IMAP, на примере очистки папки сообщений от системы мониторинга, в моём случае эта папка называется alerts.

1. Чтобы подключиться к почтовому серверу, работающему на IMAP используя шифрование SSL/TLS необходимо в консоли выполнить команду:

openssl s_client -crlf -ign_eof -connect mail.mailserver.com:993

сервер выдаст кучу информации, последней строкой будет

* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN AUTH=CRAM-MD5 AUTH=DIGEST-MD5] MAIL

2. Далее, авторизуемся:

. login [email protected] мойпароль

Сервер должен ответить:

. OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS SPECIAL-USE BINARY MOVE] Logged in

В противном случае неверное имя или пароль и нужно будет снова переходить к п.1

3. Получаем список папок нашего аккаунта:

. list """*"

Ответом должно быть что-то вроде этого:

* LIST (\HasNoChildren) "." blabla
* LIST (\HasNoChildren) "." Trash
* LIST (\HasNoChildren) "." Drafts
* LIST (\HasNoChildren) "." Sent
* LIST (\HasNoChildren) "." alerts
* LIST (\HasNoChildren) "." INBOX
. OK List completed.

4. Получить количество сообщений в любой из вышеуказанных папок можно командой:

. status alerts (messages)

Вместо alerts может быть любая папка из списка выше. В моём случае, сообщения из nagios-а храняться в папке alerts, поэтому чистить буду именно эту папку.

5. Удаляем папку alerts, где, в моём случае, хранятся сообщения от системы мониторинга:

. delete alerts

Снова должно быть сообщение OK

6. Создаём папку alerts снова:

. create alerts

Таким образом я быстро удалил 16к писем и почтовик прогрузил оставшиеся 500 достаточно быстро.

7. Отключение

. logout

P.S. если Вы используется Mozilla Thunderbird, также может потребоваться удалить вручную файлы этой папки из ~/.thunderbird/BLABLA.default/ImapMail/mail.mailserver.com/ (alerts.msf и alerts)

Генерируем приватный ключ:

openssl genrsa -out /etc/exim/dkim.key 2048

На основе приватного, генерируем публичную часть ключа:

openssl rsa -in dkim.key -pubout

В текущей папке файл dkim.key – приватный ключ и тот хеш, что будет выведен на экран – публичный ключ.

Копируем содержимое публичного ключа и добавляем следующую запись в DNS для необходимого домена:

mailxxx._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p=хеш_публичного_ключа_без_пробелов_и_переносов"

 

Копируем и добавляем её на NS сервер в зону нашего домена

 

Меняем права на приватный ключ, чтобы не было проблем с его доступностью для exim:

chmod 755 /etc/exim/dkim.key

 

Копируем конфигурационный файл exim себе, на случай некорректных изменений:

cp /etc/exim/exim.conf /home/login/

где login — ваш логин

 

Редактируем конфиг exim:

edit /etc/exim/exim.conf

 

Перед секцией remote_smtp добавляем следующее:

# DKIM
DKIM_DOMAIN = ${lc:${domain:$h_from:}}
DKIM_FILE = /etc/exim/dkim.key
DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}
DKIM_SELECTOR = mailxxx
DKIM_CANON = relaxed

 

В секции remote_smtp после директивы driver = smtp добавляем следующее:

dkim_domain = DKIM_DOMAIN
dkim_selector = mailxxx
dkim_private_key = DKIM_PRIVATE_KEY

 

Далее проверяем конфиг

exim -bV

 

и если нет ошибок, то перезапускаем exim:

/etc/init.d/exim restart

 

Проверяем, корректно ли работает подписывание DKIM ключём писем:

exim -v login@gmail.com

 

где вместо login — ваш логин (кэп), gmail.com — если у Вас почта на GMail

и вставляем туда примерно такой текст:

 

From: testmailbox@domain.com
To: login@gmail.com
Subject: Testing mail number1
Text of test message

 

Нажимаем Ctrl+D для отправки, смотрим лог события и выходим по Ctrl+C

В пришедшем письме в исходном сообщении (или по-другому говоря, оригинале) должна присутствовать запись о DKIM, похожая на это:

 

dkim=pass [email protected]
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=domain.com; s=mailxxx;
	h=Date:Message-Id:Subject:To:From; bh=4va6Om8rQAC1qwOFl25GK4pspjLbTsksnYxam9/wNvU=;
	b=c7gPxW6HRILCS3xhlsRYa62SkSPzoAceCzcPDWUFynmUhjvElO/xAGIy3NV3k/RUxoPp2fA2OG6y1sUS5rEbMcW+tMZ0gU4ukO03rvodp9OWHixuV+OFCHih/JjZz2eF9kPPjoT02cD/5Ldj6BlZ77jQc/FGRkQX+1+RmxpFvzM=;

 

Обновляем список доступных пакетов
apt-get update

Устанавливаем OpenVPN
apt-get install openvpn

Защита соединения в OpenVPN в данном случае строится на использовании сертификатов и ключей для сервера и для клиентов. Для их генерации в пакете OpenVPN имеются специальные скрипты, расположенные в /usr/share/doc/openvpn/examples/easy-rsa/2.0 Перед началом работы скопируем их, чтобы не изменять оригиналы.

(для старых версий openvpn)

mkdir /etc/openvpn/easy-rsa
cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa

С лета 2013 года easy-rsa не входит в OpenVPN и команда указанная выше не сработает(не найдет easy-rsa), тогда делаем доп команду:

sudo apt-get install easy-rsa

и копируем из другого места:

mkdir /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa /etc/openvpn/easy-rsa
mv /etc/openvpn/easy-rsa/easy-rsa /etc/openvpn/easy-rsa/2.0

Переходим в созданную директорию, где и займёмся генерацией ключей и сертификатов

cd /etc/openvpn/easy-rsa/2.0

Редактируем файл переменных

nano vars

Здесь нужно добавить следующие строки:

# По умолчанию здесь просто openssl, которого нет в директории, в результате чего мы получим ошибку, если не укажем существующий. Я выбрал последнюю версию. Указывается без расширения .conf.
export OPENSSL=»openssl»

# В самом низу файла добавить
export KEY_ALTNAMES=»VPNsUS»

копируем конфиг openssl

cp openssl-1.0.0.cnf openssl.cnf

Загружаем переменные

source ./vars

Очищаем от старых сертификатов и ключей папку keys и создаем серийный и индексные файлы для новых ключей

./clean-all

Подтверждаем очистку.

Создаем сертификат. По умолчанию поля будут заполняться данными, введенными ранее в vars, поэтому можно ничего не менять.

./build-ca

Создаем ключ сервера

A challenge password []: Заполняется произвольным значением, насколько я понял это нужно только для создания ключа и больше нам не потребуется.

./build-key-server server

В конце соглашаемся с запросом на подпись и добавление сертификаты в базу.

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

Создаем ключ Диффи Хельман

./build-dh

Cоздаем ключ для tls-аутификации

openvpn —genkey —secret keys/ta.key

Перемещаем сертификаты

cp -r /etc/openvpn/easy-rsa/2.0/keys/ /etc/openvpn/

Создание файла конфигурации сервера

cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
cd /etc/openvpn
gunzip -d /etc/openvpn/server.conf.gz

nano /etc/openvpn/server.conf

port 1194
proto udp
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key # This file should be kept secret
dh /etc/openvpn/keys/dh2048.pem
server 172.30.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
tls-auth ta.key 0 # This file is secret
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
tls-server
tls-auth /etc/openvpn/keys/ta.key 0
tls-timeout 120
auth SHA1
cipher BF-CBC
push «redirect-gateway def1»
push «dhcp-option DNS 8.8.8.8»
status /var/log/openvpn-status.log
log /var/log/openvpn.log

Можно запускать наш сервер OpenVPN

service openvpn restart

В /etc/sysctl.conf расскомментируем #net.ipv4.ip_forward=1 после чего
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -p

iptables -t nat -A POSTROUTING -s 172.30.0.0/24 -o venet0:0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 172.30.0.0/24 -j SNAT —to 5.45.x.x
вместо venet0:0 указать имя внешнего интерфейса сервера (смотреть командой ifconfig),
вместо 5.45.x.x — указать внешний IP Вашего сервера,

iptables-save

Создание ключей и сертификатов

Ключи клиента создаются на сервере

Переходим в созданную директорию, где и замёмся генерацией ключей и сертификатов

cd /etc/openvpn/easy-rsa/2.0

Загружаем переменные

source vars

Создаем ключ клиента

Common Name (eg, your name or your server’s hostname) []: нужно вписать название файла ключа, в данном случае client

./build-key client

Если хотим защитить ключ паролем, то генерируем его другой командой, но в таком случае поднимать соединение автоматически не получится:

./build-key-pass client

Теперь нужно не забыть скопировать ключи (ca.crt, dh1024.pem, client.crt, client.key, ta.key) на клиента OpenVPN в /etc/openvpn/keys/

mv /etc/openvpn/keys/ /etc/openvpn/keys_backup
mv /etc/openvpn/easy-rsa/2.0/keys/ /etc/openvpn/

Создание файла конфигурации клиента, это делается на домашнем компьютере в любом простом текстовом редакторе вроде блокнота:

client
dev tun
proto udp
remote 5.45.x.x 1194
resolv-retry infinite
ca ca.crt
cert client.crt
key client.key
tls-client
tls-auth ta.key 1
auth SHA1 # по-умолчанию. Можно MD5
cipher BF-CBC
remote-cert-tls server
comp-lzo
persist-key
persist-tun

вместо 5.45.x.x — нужно вписать внешний IP вашего сервера

И сохраняем с именем client.ovpn в отдельную папку, например «C:\Program Files\OpenVPN\config»

В этой же папке, где мы сохранили client.ovpn, создаём ещё 4 пустых файла, и называем их:
ca.crt
ta.key
client.crt
client.key

и заполняем их содержимым, которое берём из (текст копируем прямо из консоли)
cat /etc/openvpn/keys/ca.crt
cat /etc/openvpn/keys/ta.key
cat /etc/openvpn/keys/client.key
cat /etc/openvpn/keys/client.crt

Сохраняем и запускаем соединение.

Добавление в автозагрузку:

update-rc.d openvpn defaults