Skip to content

By Тодор in Linux, Windows

ldapmodify е основен инстурмент с който могат да се редактират обекти в една активна директория (АД) посредством *nix среда.

За едно сравнително популярно действие, като смяна на парола, обаче нещата не са толкова лесни, или поне на пръв поглед не са. Смяната на паролата в LDIF формат изглежда така:

dn: CN=Testi Testev,OU=Users,OU=Accounts,DC=corp,DC=local
changetype: modify
replace: userPassword
userPassword: SlivovSladoled

Kомандата се изпълнява успешно и редактира съответния атрибут, но ефект от това няма. Т.е. никаква парола не сме сменили.
Оказва се, че в Windows Active Directory, userPassword полето по подразбиране не е разрешено. Разрешаването му е лесно с ADSI Edit:


Стойността на dsHeuristics трябва да е точно 000000001 (не 1). След промяната е необходима и актуализация на схемата:

И сега вече нещата се случват! Пример:
LDAPTLS_REQCERT=never ldapmodify -D 'CN=Admin,OU=Admins,DC=corp,DC=local' -w AdminPwd -p 389 -ZZ -x -h 192.168.1.1 -f ldif.txt

  • Admin е администраторския акаунт, който има права да редактира чужди пароли.
  • LDAPTLS_REQCERT=never е необходимо, поради тази грешка: TLS: peer cert untrusted or revoked (0x42).
  • -ZZ -x са необходими, за да се закачим към ЛДАП сървъра по сигурен/криптиран канал. Иначе действието не е позволено.
  • 192.168.1.1 е домейн контролера.
  • ldif.txt са ЛДАП командите подобно на тези по-горе в статията.
  • *ADSI Edit е страхотен инструмент, с който, ако не се внимава, може напълно и завинаги да бъде сасипана една Активна Директория.

    Tags: , , , , , , , ,

    By Тодор in Linux

    С конфигурацията на Carbon по подразбиране, Whisper база данни файловете пазят информация само за последните 24часа. Промяната на този период е лесно да се направи в конфигурацията на Carbon:
    /etc/carbon/storage-schemas.conf

    
    [default]
    pattern = .*
    retentions = 1m:30d,15m:10y
    

    Важна е стойността на pattern – в примера ще се отнася за всички броячи, но могат да се правят и шаблони по имената им. Другото важно е, че тези промени се отансят само за новосъздадени броячи. Всички вече създадени бази данни с броячи, трябва да се актуализират ръчно:
    
    # find /var/lib/graphite/whisper/ -type f -name '*.wsp' -exec whisper-resize --nobackup {} 1m:30d 15m:10y \;
    # chown _graphite:_graphite /var/lib/graphite/whisper -R
    # systemctl restart carbon-cache
    

    На кратко:

    • Преравя всички WSP файлове, които са в директорията по подразбиране (ако не са там, да се види в carbon.conf къде са) и променя схемата им за съхранение.
    • Понеже всички редактирани фйалове са собственост на root, ги връща обратно на потребителя _graphite.
    • Рестарт на carbon-cache демона.

    Tags: , , , , , , , , ,

    By Тодор in Uncategorized

    Както всички телефони, и моят се препълни със снимки и клипове.
    Включвам го с УСБ кабел към компютъра и започвам да копирам. По най-стандартния уиндоусовски начин – копи от телефона, пасте на диска на компютъра. Да, ама върви със скорост все едно през телефонна линия го правя. Беше късно, не ми се занимаваше, реших да го оставя да се изкопира през нощта. На другия ден поглеждам какво става и за около 10 часа беше изкопирало 9%. А данните общо са около 30ГБ. Надушвам конспирация! Нарочно са го направили така, за да не могат хората да си копират файловете, а да им ползват облаците. Прекратих го. Обмислях варианта просто да извадя картата памет от телефона и да си взема файловете директно от нея, но исках да опитам и още нещо.

    Дали няма да мога да си помогна с Android Debug Bridge?

    Необходимо е да се активира “Отстраняване на УСБ грешки”, което се намира в “Настройки > Опции на програмиста”. Менюто “Опции на програмиста” по принцип е скрито, и за да се покаже е необходимо първо да отворим “Всичко за телефона” и да натискаме бързо 10-15 пъти върху “Номер на версията”.

    ADB e разархивиран някъде на компютъра. Пускам командния ред (cmd) и отивам в директорията на ADB.
    Първо влизам в телефона и проверявам къде точно са снимките или файловете, които ще копирам:

    >adb shell
    HWVNS-H:/ $ df -h
    Filesystem                          Size  Used Avail Use% Mounted on
    rootfs                              1.3G   14M  1.3G   2% /
    tmpfs                               1.3G  544K  1.3G   1% /dev
    tmpfs                               1.3G     0  1.3G   0% /mnt
    none                                1.3G     0  1.3G   0% /sys/fs/cgroup
    /dev/block/dm-0                     1.8G  1.8G   17M  100% /system
    /dev/block/dm-1                     580M  394M  173M  70% /vendor
    /dev/block/dm-2                     182M  101M   77M  57% /product
    /dev/block/dm-3                      27M  412K   26M   2% /version
    /dev/block/dm-4                     182M   95M   83M  54% /cust
    /dev/block/bootdevice/by-name/cache 248M  164K  243M   1% /cache
    tmpfs                               1.3G     0  1.3G   0% /storage
    /dev/block/dm-5                      10G  8.9G  1.4G  87% /data
    /data/media                          10G  8.9G  1.3G  87% /storage/emulated
    /dev/fuse                            30G   28G  2.0G  94% /storage/4308-131B

    32GB-товата ми SD-карта е ясна – /storage/4308-131B.

    Още малко ориентиране:

    $ cd /storage/4308-131B
    HWVNS-H:/storage/4308-131B $ ls
    Android DCIM Download Huawei HuaweiBackup LOST.DIR Pictures backup z

    Директорията със снимките е DCIM. Излизам от телефона:
    exit

    Копиране:
    adb pull /storage/4308-131B/DCIM/Camera c:\todor\

    След няколко секунди става ясно, че скоростта на копиране е коренно различна. Сега е сравнимо с нормална USB2 флашка. 30те ми ГБ се изкопираха за по-малко от час.

    Има и противоположна команда push, с която пък могат да бъдат копирани файлове в другата посока – към телефона.

    Наздраве!

    Tags: , , , , , , , , , , , ,

    By Тодор in Cisco, Linux

    Маршрутизаторите и комутаторите също имат нужда от архивиране! Не че това ще направи подмяната на изгорял рутер удоволствие, но ще е значително по-лесно. А и решението е почти контрол на версиите – с един commit на ден, което помага и при синдрома “вчера работеше”.
    Най-лесния начин, за който се сещам е автоматична бекъпвачка с Ansible.

    Попълваме инвентара в текстов файл горе-долу по тоя пример (ios-inventory):

    [all:vars]
    backup_dest="/ios_backups/"
    date_stamp="{{ ansible_date_time.year }}{{ ansible_date_time.month }}{{ ansible_date_time.day }}-{{ ansible_date_time.hour }}{{ ansible_date_time.minute }}"
    ansible_connection=local
    ansible_user=ansible
    ansible_password=na-baba-mi-parolata
    ansible_become_method=enable
    
    [sw1]
    192.168.0.254
    [sw2]
    192.168.0.253
    [sw3]
    192.168.0.252

    После създаваме следния ямълски плейбук (playbook.yml):

    ---
    - name: Cisco IOS backup job
      hosts: all
      gather_facts: yes
      strategy: free
    
      tasks:
        - name: Collecting remote facts
          ios_facts:
            gather_subset:
              - all
        - name: Create backup root folder
          file:
            path: "{{ backup_dest }}"
            state: directory
          run_once: yes
        - name: Create backup device folder
          file:
            path: "{{ backup_dest }}{{ ansible_net_hostname }}"
            state: directory
          run_once: yes
        - name: Saving configuration to file
          copy:
            content: "{{ ansible_net_config }}"
            dest: "{{ backup_dest }}{{ ansible_net_hostname }}/{{ inventory_hostname }}-{{ date_stamp }}.txt"

    Изпълняваме ето така:
    ansible-playbook -i ios-inventory playbook.yml

    Добавяйки абсолютните пътища до файловете, тоя ред го мушваме в крон за ежедневно изпълнение и с това връзваме гащите.
    Ако имената и паролите за достъп до техниката са различни, то, където е необходимо, променливите с името и паролата ги слагаме на реда с ИП адреса, разделени с интервал.
    Ретеншън може да се поддържа с logrotate.

    Сега може да си пиете бирата все едно мрежата е архивирана 🙂
    Наздраве!

    Tags: , , , ,

    By Тодор in Linux

    Изходни данни за ситуацията

    • Трябва да се инсталира линукс сървър.
    • Нямаме фиизчески достъп до сървъра.
    • Сървъра няма out-of-band управление (iLO, LOM, IPMI и т.н.).
    • Сървъра разполага с ethernet връзка към Интернет.
    • На място (при сървъра) има човек, който може да окаже някакво съдействие. Ще го наречем бай Иван.

    План за действие

    • Ще направим имидж (ISO), който ще изпратим на бай Иван, за да го качи на флашка и да зареди сървъра от него.
    • От флашката ще се заредят достатъчно “неща”, които да ни осигурят отдалечен и сигурен достъп до машината, за да продължим инсталацията.

    Изпълнение

    Ще използваме minimal образ на Ubuntu 20.04 LTS, защото е изключително малък и ще бъде лесно да бъде изпратен на бай Иван.
    Образа е наличен тук.
    Отваряме ISO-то и редактираме txt.cfg. Той би трябвало да съдържа следните редове:

    label install
    menu label ^Install
    menu default
    kernel linux
    append vga=788 initrd=initrd.gz --- quiet

    Редактираме последният ред (всичко е на един ред):
    append vga=788 initrd=initrd.gz console-setup/layoutcode=us locale=en_US.UTF-8 keyboard-configuration/layoutcode=us languagechooser/language-name=English countrychooser/shortlist=BG localechooser/supported-locales=en_US.UTF-8 hostname=ubuntuserver domain=local interface=auto url=http://kamenitza.org/files/preseed.cfg ipv6.disable=1 ---

    Нещата, които този ред върши са сравнително ясни и самообясняващи се. По-интересни са

    • interface=auto – Автоматична настройка на мрежовия интерфейс (DHCP).
    • url=http://kamenitza.org/files/preseed.cfg – Съдържа предврителен избор на опции от инсталацията.

    Ако в мрежата няма DHCP сървър и IP-то трябва да се настрои ръчно, interface=autо се замества със следните примерни параметри:
    netcfg/get_ipaddress=192.168.150.111 netcfg/get_netmask=255.255.255.0 netcfg/get_gateway=192.168.150.1 netcfg/get_nameservers=8.8.8.8 netcfg/disable_dhcp=true

    За редакция на ISO файл в Уиндоус няма особено работещи безплатни програмчета. Аз ползвах WinISO, което в триал/демо режим върши работа за малки образи.
    По наша преценка се прави бутваща USB флашка (с Rufus) или CD или DVD.
    Горещо препоръчвам ползването на възможно най-пълен preseed.cfg, за да се елиминира ръчния труд при повторно изпълнение на задачата:

    d-i preseed/early_command                   string anna-install network-console
    d-i debian-installer/locale                 string en_US.UTF-8
    d-i localechooser/supported-locales         multiselect en_US.UTF-8
    d-i console-setup/ask_detect                boolean false
    d-i keyboard-configuration/layoutcode       string en
    d-i anna/choose_modules                     string network-console
    d-i network-console/authorized_keys_url     string http://kamenitza.org/files/ssh-key.txt
    d-i mirror/country                          string Bulgaria
    d-i mirror/http/hostname                    string bg.archive.ubuntu.com
    d-i mirror/http/mirror                      select bg.archive.ubuntu.com
    d-i mirror/http/proxy                       string
    d-i passwd/user-fullname                    string Todor Kandev
    d-i passwd/username                         string tkandev
    d-i passwd/user-password-crypted            password $5$ceFBePtE$n0S0.mW1tQQUYH4RPfshNIWd/vilV3E2NhBkUWk/yd0
    d-i clock-setup/utc                         boolean false
    d-i time/zone                               string Europe/Sofia
    d-i clock-setup/ntp                         boolean true
    d-i clock-setup/ntp-server                  string bg.pool.ntp.org
    d-i pkgsel/update-policy                    select none
    d-i apt-setup/services-select               none
    d-i apt-setup/universe                      boolean true
    d-i tasksel/first multiselect               standard system utilities, OpenSSH server
    d-i preseed/late_command                    string \
        in-target mkdir -p /home/tkandev/.ssh; \
        echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN1hQH5HHB8U2PUbUn7nwYUHm0jdz3URoFdYZY1+QSVk kandev-v2" > /target/home/tkandev/.ssh/authorized_keys; \
        in-target chown tkandev:tkandev /home/tkandev/.ssh -R; \
        in-target sed -i s/#PasswordAuthentication\ yes/PasswordAuthentication\ no/g /etc/ssh/sshd_config; \
        apt-install mc net-tools
    d-i finish-install/reboot_in_progress       note

    Опциите са достатъчно говорящи и самообясняващи се. Основна опция тук е network-console/authorized_keys_url. Представлява URL адрес до SSH ключа, който ще се ползва за автентикация при инсталацията. Трябва да е достъпен по HTTP (не HTTPS). Друго интересно е създаването на потребител, задаването на парола, добавянето на SSH ключ, включването на този потребител в sudoers и забраняването за ползване на пароли при влизане през SSH. Паролата на потребителя се генерира ето така:
    mkpasswd -m sha-256

    Сега бай Иван трябва да буутне сървъра с нашия имидж и да избере опцията за инсталация по подразбиране. След няколко минути всичко спира на следния екран:
    Linux network instal
    Може да си знаем адреса, а може и бай Иван да ни го изпрати по някакъв начин. Инструкциите са ясни. Свързваме се с дадения IP адрес по SSH с потребител installer, като се автентикираме с личния си ключ. Довършваме инсталацията с всичко, което липсва от preseed фйла.

    Наздраве! 🙂

    Tags: , , , , ,

    By Тодор in Uncategorized

    Ползвал съм собственоръчно направени НАС-ове, било то полу-готови с Freenas, изградени от стандартна Linux дистрибуция или напълно готови хардуерни решения, за които съм писал и преди. В крайна сметка най-доволен останах от Synology. Не защото е перфектно, а защото има най-малко проблеми и бъгове.
    Разбира се че е пълно с бъгове! Пакетът му с основни приложения е абсолютен качамак! Нито снимките можеш да си архивираш по някакъв полезен начин, нито файловете. Но целта на поста не е да правя ревю на продукта, а да споделя един особено дразнещ и неприятен дефект.

    Притежавам един от малките модели – DS218+. Машинката е закачена за APC UPS, има и комуникационен кабел между нея и UPS-a, за да ѝ е по-ясно каква е ситуацията с тока. Включена е 24/7, като е разрешено единствено да гаси дисковете, ако не се ползват известно време.
    Няколко пъти намирам НАС-а загасен. Ама все едно съм му натиснал копчето и се е изключил. А още по-неприятното е, че не може и да се включи. След натискане на бутона, светва, развърта вентилатора, но не развърта дисковете и след 10сек се изключва отново. После пак натискам бутона и стискам палци. И така понякога от 5-тия, понякога от 10-тия опит, вземе, че развърти дисковете и тръгне.

    Актуализирах софтуера. Сканирах за грешки. Проверявах захранващия блок. Не открих проблем.
    Единствената закономерност, която открих е, че, ако извадя единия или и двата диска, след като се е самозагасил, и натисна копчето, зарежда веднага. Не открих в Интернет някой да е писал за дискова несъвместимост, а и ползвам доста стандартни дискове – 4TB HGST (HDN726040ALE614).
    Все още не се предавам и не звъня в гаранционния сервиз за рекламация!

    След поредната проверка на конфигурацията и търсене на скрити детайли или каквито и да е улики за проблема из интерфейса на устройството се натъквам на следната опция:
    DS218+ Problem

    Естествено това беше включено. Даже кой би си помислил, че такава екстра няма да си я има бай-дизайн вградена и ще се налага ръчно да я пускаш и спираш!?

    Ами изключих я и проблемите изчезнаха! Вече повече от година не се е самоизключвало.

    Наздраве!

    Tags: , , , , , , , , , , , , , , ,

    By Тодор in Linux

    Натъкнах се на неочаквана мотика при комуникацията от контейнер към самия себе си, но през публичния му адрес.

    Очаквано тук трябва да се случат някои гимнастики с iptables, за да има двупосочна транслиране, известно още като nat reflection или hairpin nat. Да, обаче пак не работи!

    В крайна сметка се оказва, че Docker си прави всичко сам, ама само, ако си поискаме 🙂

    Вградената userland proxy услуга трябва да бъде спряна, за да се получи това, което желаем, а именно, ако контейнера ни е с адрес 172.17.0.2, който от Интернет е достъпен на 70.80.90.100, да можем от самия контейнер да се свържем към адреса 70.80.90.100 и това да бъде правилно транслирано от хоста обратно към контейнера.

    На кратко:

    Създаваме файл /etc/docker/daemon.json със следното съдържание:

    {
    "userland-proxy": false
    }

    И рестартираме докер услугата:
    
    systemctl restart docker
    

    Дали се е получило можем да видим от следния параметър на ядрото на ОС съдържаща контейнерите (трябва да е със стойност 1):
    
    # sysctl net.ipv4.conf.docker0.route_localnet
    net.ipv4.conf.docker0.route_localnet = 1
    

    Tags: , , , , , , , , , , , ,

    By Тодор in Фун

    Като млад, зелен и бесен метъл пишех разни щуротии на Паскал и Делфи. Прости инструментчета или шеговити програми от сорта на тази в чиято памет е този пост. Писана е някъде 1999-2000-та година – сиреч преди ДВАЕСЕ години! Т.е. аз съм вече чичка…

    Компютъра ми по онова време беше Cyrix 6×86 PR166 с 16MB RAM и чернобял монитор. Уиндоуса беше ’95, а линукса – Red Hat 5 (Hurricane) с ядро 2.0. Най бързата връзка с Интернет беше 2.5КБ/с през домашния телефон на дядо ми и съм чакал по цяла нощ, за да сваля новата песен на Гуано Ейпс от Напстера…

    Качвам си играта ТУК, да ми седи за спомен, че хостинга на официалния ѝ сайт фалира преди години. Бахур Хак Тийм също се оказаха няк’ви несериозници…

    Хав фун! 😉

    Tags: , , , ,

    By Тодор in Linux

    Онлайн скенерите, с които Интернет е претъпкан са основна отправна точка за “втвърдяването” (hardening) на всеки уеб сървър. Много от препоръките, които дават са ясни, точни и лесни за изпълнение. Голяма част от тях обаче правят така, че някои уеб страници спират да работят или в най-добрия случай започват да се държат неадекватно.

    Едни от най-популярните са internet.nl и ssllabs.

    Основни настройки на Apache

    ServerSignature Off
    ServerTokens Prod
    Header set X-Frame-Options: "sameorigin"
    Header set X-XSS-Protection "1; mode=block"
    Header set Referrer-Policy "no-referrer"
    Header set X-Content-Type-Options: "nosniff"
    SSLStrictSNIVHostCheck On
    SSLUseStapling On
    SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
    SSLOpenSSLConfCmd DHParameters /etc/apache2/dhparam
    Options -Indexes -FollowSymLinks
    SSLProtocol TLSv1.2

    А следното трябва да фигурира в конфигурацията на всеки виртуален сайт:

    SSLProtocol TLSv1.2
    Protocols h2 http/1.1
    SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256
    Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

    Изтегляне на правилните Дифи-Хелман параметри (файла вече сме го посочили по-горе):
    curl https://ssl-config.mozilla.org/ffdhe4096.txt > /etc/apache2/dhparam

    Изтеглянето на този файл наистина е важно и има значение. По последни данни саморъчното генериране на DH е пълна скръб и не трябва да се практикува. Задълбано инфо по темата има тук.

    Примера е за Апач, но хедърите са същите какъвто и да е уеб сървъра. Разлика има единствено в това, как се подават в конфигурацията.

     

    Tags: , , , , , , , , , ,

    By Тодор in Linux

    Що пък да не си направим LAMP (linux+apache+mysql+php) в докер контейнер?

    • Портативно
    • Съвместимо
    • Лесно за размножаване и разкрасяване
    • Винаги подходящата версия за претенциозни приложения

    Започнах с Alpine Linux, като един от най-подходящите за подобни цели, но се оказа че пакета на Апач има редица проблеми, а и разнообразието от готови допълнителни пакети е леко бедно и щеше да се наложи ръчна компилация на това-онова.

    В крайна сметка се спрях на последния наличен Ubuntu Server, който към този момент е 18.04. А до няколко дни ще излезе 20.04 и ще актуализирам.

    Готов контейнер качвам в Docker Hub. А изходния код и рецептата за забъркване, в Github.

    На кратко:

    • Файловете на уеб сайтовете, базата данни, логовете и сертификатите са съхранени извън контейнера.
    • Контейнера онаследява часовата зона на основния сървър.
    • Ползва се PHP-FPM. Процеса е сравнително оптимизиран за стандартно ползване.
    • MariaDB работи в режим TCP/IP, като поддържа SSL/TLS криптиране на трафика. Конфигурацията е оптимизирана.
    • Ежедневна крон задача проверява сертификатите на уеб сайтовете и автоматично издава Letsencrypt сертификати при нужда.
    • Конфигурацията на Апач е оптимизирана по всички основни препоръки за сигурност и съвместимост.

    Ще се радвам, ако свърши работа и на някой друг, освен мен 🙂

    Tags: , , , , , , ,

    By Тодор in Мрън-мрън

    След многобройни промени през годините и подскачане от шрифт на шрифт, винаги с частичен и никога задоволителен успех, попаднах на подходящ, който мога да приема за стандарт в сайта. Шрифта се нарича Iosevka и е с отворен код. Чист, ясен и лесен за очите.
    Изглежда ми много добре! Доволен съм!

    By Тодор in Linux

    Според издателя на квалифицирания електронен подпис, инсталацията му в линукс е предизвикателство от различно ниво. Приемам, че подписа е коректно инсталиран според заводската му документация, и че плъгина на Firefox работи.

    Това е достатъчно, за да се влезе в почти всеки сайт искащ удостоверяване с КЕП. Включително и в портала с електронни услуги, предоставяни от Националната Агенция по Приходите (НАП).

    За да свършим някаква работа в този портал, обаче, само удостоверяването при влизане не е достатъчно. Всичко, което се попълва и изпраща, трябва да е допълнително подписано. А това става с… Java приложение разбира се 🙂

    В Linux Mint 19.03 е необходимо да се инсталира icedtea-netx:

    sudo apt install icedtea-netx

    След това вече jnlp-то може да се изпълни, за да видим това:

    StampIT LocalServices cannot start: access denied (“java.util.PropertyPermission” “com.sun.net.httpserver.HttpserverProvider” “read”)

    И тук приказквата свършва.

    Всичкото търсене води до стари документи обясняващи как да ползваме вече не съществуващи плъгини и методи. Firefox ликвидира Java плъгина преди време, защото е твърде голяма дупка.

    Необходимо е да се инсталира “оригиналният” пакет Oracle Java.

    Изтегляме актуалната Жава от https://java.com/en/download/linux_manual.jsp

    След, като се разкомпресира пакета, се мести на подходящо място:

    sudo mkdir -p -v /opt/java/64
    sudo mv -v jre1.* /opt/java/64

    Правим новото JRE по подразбиране:

    sudo update-alternatives --install "/usr/bin/java" "java" "/opt/java/64/jre1.8.0_241/bin/java" 1
    sudo update-alternatives --set java /opt/java/64/jre1.8.0_241/bin/java

    Добра идея е да ограничим размера на дисковия кеш след това:

    /opt/java/64/jre1.8.0_241/bin/ControlPanel

     

    И сега, най-ключовия момент – да кажем на icedtea да ползва новата Жава, вместо вградената:

    Това е всичко.

    Приятно подаване и подписване!

    Tags: , , , , , , , , , , ,

    By Тодор in Linux

    Най-бързия начин за генериране на частен ключ и SSL сертификат известен на човечеството:
    openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -nodes -days 42000 -subj "/C=BG/ST=Plovdiv/L=Plovdiv/O=Kamenitza.ORG/OU=IT Department/CN=kamenitza.org"
    И съответно да се конвертира във формат разбираем от Windows:
    openssl pkcs12 -export -out cert.pfx -inkey key.pem -in cert.pem
    А за да може да се ползва и от MySQL/MariaDB, личният ключ трябва да се превърне във формат PKCS#1:
    openssl rsa -in key.pem -out key.pem

    By Тодор in Mikrotik

    Вероятно много “колеги” ще си помислят, че да се конфигурира IPSec/L2TP тунелче е далеч по-съвместимо откъм клиентксата част – поддържа се “извън кутията” от всичко от Windows XP насам. Андроид, IOS, Windows имат вграден клиент за такъв тип тунел, което значи, че не е необходимо да се инсталира допълнителен софтуер. Не, че не може, но не е задължително.
    Напрактика обаче, не е толкова сладко, колкото звучи 🙂
    Ще го обясня максимално разбираемо и минимално подробно – ipsec-esp, ike и l2tp трафика е гаден за рутиране и често нещата изобщо не се случват, ако в мрежата има NAT. Най-обичайната ситуация е да седнете в заведение с наличен свободен безжичен Интернет, който изглежда като да работи, обаче VPN тунела не успява да се закачи. И всичко това, защото са сложили рутер, който се е паднал от пакет зрънчо или нарочно са блокирали nat-traversal, без който ще видим ipsec само през крив макарон.

    И така, следващото достатъчно съвместимо, достъпно, безплатно и т.н. решение се явява OpenVPN. Има клиенти за всякакви устройства и операционни системи. Може да се ползва в режим dial-up за пътуващи “работници”, а може и като site-to-site, свързвайки цели мрежи. Изключително гъвкав протокол, може да работи по TCP или по UDP на порт по избор. Минава през всякакви рутери, нескопосано маршрутизиране и куци NAT-ове.
    Сървър може да се конфигурира на OpenWRT, Mikrotik и други достъпни решения, както за вкъщи, така и за офиса.

    Ще опиша пример със сървър на Mikrotik.

    Създаване на пул от адреси за клиентите:
    /ip pool add name=remote-pool ranges=10.10.10.100-10.10.10.120

    Добавяме профил:
    /ppp profile add local-address=10.10.10.1 name=openvpn remote-address=remote-pool use-encryption=required
    10.10.10.1 е ИП-то на LAN (вътрешния) интерфейса.

    Създаваме си потребител:
    /ppp secret add name=todor password=p4ssW00 profile=openvpn

    Без сертификат, обаче няма да минем:

    /certificate add name=vpn-cert common-name=vpn.kamenitza.org days-valid=3650
    /certificate sign 0
    /certificate export-certificate 0

    С тези команди ще бъде издаден, подписан и експортнат 10 годишен сертификат за домейна vpn.kamenitza.org. Изнесения сертификат е съхранен във файл на рутера.

    Вземаме публичния ключ:

    /file print detail
     0 name="flash" type="disk" creation-time=jan/01/1970 02:00:03
     1 name="cert_export_vpn-cert.crt" type=".crt file" size=1192 
       creation-time=nov/28/2018 22:34:18 contents=
         -----BEGIN CERTIFICATE-----
         MIIDQzCCAiugAwIBAgIIS74buY1yHXAwDQYJKoZIhvcNAQELBQAwHDEaMBgGA1UE
         AwwRdnBuLmthbWVuaXR6YS5vcmcwHhcNMTgxMTI4MjAzMzIyWhcNMjgxMTI1MjAz
         MzIyWjAcMRowGAYDVQQDDBF2cG4ua2FtZW5pdHphLm9yZzCCASIwDQYJKoZIhvcN
         AQEBBQADggEPADCCAQoCggEBAMBP8cDeknHKYPXCvgZkT+KeNXmjazXmcShNtGY6
         uUcuVbPBOn6FcqA/VwSAdVeNnkY0IqZM1zHCr/kXtgWVGNld2/GnkGCoNgm6SrkZ
         O6dZraC/B3LRIRLp0OR0aZ8/vTO3TwSP+/M/3rWKcs5LdpS8SoheHZBbcK43/qB1
         dR2si5sWJ4l34ketjuJrduzxxD+TE4QLwovMzNyE9S+tKidBBN+/PEJDv3njUZwe
         II+CN0JwosEZ2FfW7MYsx1kUyYZtrBUjCjxerMom9iQR9gWUpsey3yhNKGCDHe/v
         z1h3vkZ5znDAjf/uRbnwGRHkUbIiZ1XKIhmOnPnlgqw4qasCAwEAAaOBiDCBhTAP
         BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBtjAdBgNVHSUEFjAUBggrBgEF
         BQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYEFBHDtmEAUdv54tr/tRHkHWu9BA5lMCQG
         CWCGSAGG+EIBDQQXFhVHZW5lcmF0ZWQgYnkgUm91dGVyT1MwDQYJKoZIhvcNAQEL
         BQADggEBACa76JK+oUgYddfrfABWGEQDDvSUv37Sfo4WqqokM1r4xuQsF8V+/oEO
         ifdTTX4r/48tohct+jRBCW5vh6Jkx5mVie8MlhFG5oY1dxtd/M9F1Kc6PpyRipCw
         yvuJFOU8ESxEQSwFsElckvaamc09fw55rUgaFmMebuhleXUuyg7WAPUlLSgeGqyd
         RB4lOitA4qmOgEBIUs7Y6jiUe44orWzgGrQGP9zoI8aPwRGvKJoe11PCocrEJvIM
         xMcHyOdrqECY4LlgNLoDGRXJYASWSqTzPvl4TAH1ffKhdp+aUP3/EoHYaF2nu8fD
         wYHuD/lP0Cy21zbobDaFPF4iKdAk2qc=
         -----END CERTIFICATE-----

    Всичко между BEGIN CERTIFICATE и END CERTIFICATE, включително, ще ни трябва за конфигурирането на клиента.

    Остана и интерфейса:

    /interface ovpn-server server
    set auth=sha1 certificate=vpn-cert cipher=aes256 default-profile=openvpn 
        enabled=yes mode=ip netmask=24 port=1194 require-client-certificate=no

    Евентуално ще трябва да отворим tcp/1194 на фиревала.

    Харесва ми възможността отдалечените клиенти да са в същата мрежа, в която са и LAN клиентите, но за да работи изобщо тази екстра, която е на ръба на стандартите, трябва да се активира proxyarp на вътрешния интерфейс.

    Клиенската конфигурация изглежда по следния начин:

    dev tun
    persist-tun
    persist-key
    cipher AES-256-CBC
    auth SHA1
    tls-client
    client
    auth-user-pass
    resolv-retry infinite
    remote vpn.kamenitza.org 1194 tcp-client
    verb 3
    <ca>
    -----BEGIN CERTIFICATE-----
    MIIDQzCCAiugAwIBAgIIS74buY1yHXAwDQYJKoZIhvcNAQELBQAwHDEaMBgGA1UE
    AwwRdnBuLmthbWVuaXR6YS5vcmcwHhcNMTgxMTI4MjAzMzIyWhcNMjgxMTI1MjAz
    MzIyWjAcMRowGAYDVQQDDBF2cG4ua2FtZW5pdHphLm9yZzCCASIwDQYJKoZIhvcN
    AQEBBQADggEPADCCAQoCggEBAMBP8cDeknHKYPXCvgZkT+KeNXmjazXmcShNtGY6
    uUcuVbPBOn6FcqA/VwSAdVeNnkY0IqZM1zHCr/kXtgWVGNld2/GnkGCoNgm6SrkZ
    O6dZraC/B3LRIRLp0OR0aZ8/vTO3TwSP+/M/3rWKcs5LdpS8SoheHZBbcK43/qB1
    dR2si5sWJ4l34ketjuJrduzxxD+TE4QLwovMzNyE9S+tKidBBN+/PEJDv3njUZwe
    II+CN0JwosEZ2FfW7MYsx1kUyYZtrBUjCjxerMom9iQR9gWUpsey3yhNKGCDHe/v
    z1h3vkZ5znDAjf/uRbnwGRHkUbIiZ1XKIhmOnPnlgqw4qasCAwEAAaOBiDCBhTAP
    BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBtjAdBgNVHSUEFjAUBggrBgEF
    BQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYEFBHDtmEAUdv54tr/tRHkHWu9BA5lMCQG
    CWCGSAGG+EIBDQQXFhVHZW5lcmF0ZWQgYnkgUm91dGVyT1MwDQYJKoZIhvcNAQEL
    BQADggEBACa76JK+oUgYddfrfABWGEQDDvSUv37Sfo4WqqokM1r4xuQsF8V+/oEO
    ifdTTX4r/48tohct+jRBCW5vh6Jkx5mVie8MlhFG5oY1dxtd/M9F1Kc6PpyRipCw
    yvuJFOU8ESxEQSwFsElckvaamc09fw55rUgaFmMebuhleXUuyg7WAPUlLSgeGqyd
    RB4lOitA4qmOgEBIUs7Y6jiUe44orWzgGrQGP9zoI8aPwRGvKJoe11PCocrEJvIM
    xMcHyOdrqECY4LlgNLoDGRXJYASWSqTzPvl4TAH1ffKhdp+aUP3/EoHYaF2nu8fD
    wYHuD/lP0Cy21zbobDaFPF4iKdAk2qc=
    -----END CERTIFICATE-----
    </ca>

    Съхранява се във файл с разширение .ovpn и се импортира в желания клиент или устройство. При свързване ще попита за име и парола.

    С тази конфигурация през тунела ще има връзка единствено до отдалечената вътрешна мрежа.
    Към момента Микротик не поддържа “route-push” – възможността да изпрати към клиента маршрути за допълнителни мрежи, които да се рутират през тунела. И така, ако има нужда от рутиране на допълнителни мрежи през тунела или изобщо за целия Интернет трафик, ще трябва към клиентската конфигурация да се добавят следните редове:
    route 10.0.0.0 255.0.0.0
    или
    route 0.0.0.0 0.0.0.0 vpn_gateway 0

    Дано не съм забравил нещо 🙂