суббота, 26 марта 2022 г.

Запуск Docker внутри LXC контейнера (Debian, Ubuntu).

 1. В конфиге контейнера /var/lib/lxc/name_container/config в низ файла добавляем строки:

lxc.apparmor.profile = unconfined

lxc.cgroup.devices.allow = a

lxc.cap.drop =

2. Подгружаем модули ядра:

modprobe aufs

modprobe overlay

Вносим записи в файл: 

/etc/modules-load.d/modules.conf

чтобы модули загружались после включения:

aufs

overlay

3. Внутри контейнера с установленным Docker создаем файл:

/etc/docker/daemon.json

в который добввляем:

{

  "storage-driver": "overlay2"

}

4.Проверяем работу Docker:

docker run hello-world


вторник, 15 марта 2022 г.

Конвертация vhdx (Hyper-V) в vmdk(ESXi), и не только.

Например для использование в windows. Нужперейти в папку с распакованной программой:

cd C:\users\user\Downloads\qemu-img-win-x64-2_3_0 qemu-img.exe convert -p D:\old_disk.VHDX -O vmdk D:\new_disk.vmdk

где опции -p – показывать прогресс, -O – выходной файл

Скачать можно здесь.

четверг, 17 февраля 2022 г.

Добавление объема в LUN (LVM) отдаваемого в iSCSI target и добавление полученного места в Esxi Storage.

 1. lvextend -L+1Tb /dev/vg01/lv02
Увеличиваем место на один терабайт для нужной области.


2. systemctl restart tgt
Рестартуем iSCSI таргет


3. esxcli storage core adapter rescan --all
Подключаемся по SSH к ESXI, выполняем команду.


4. Затем в web Esxi Storage, выбираем нужный storage делаем rescan, затем Action -> Increase capacity -> Expand an existing VMFS datastore extent ->Выбираем наш IET iSCSI Disk и расширяем место, далее все интуитивно понятно.


Все это можно делать "на лету", не отмонтируя storage, не выключая виртуалки расположенные на нем расположенныe.


И еще: глупо в конфигах и конфигурациях писать емкость storage, как у меня напр. - storage-10Tb.conf, я уже не стал менять названия и содержание файлов во избежание возможных сюрпризов. Короче - емкость storage нужно смотреть по факту, в Esxi в Datastores -Capacity, и в lvdisplay.


пятница, 3 декабря 2021 г.

Ansible

Появилось много ПК с Astra Linux, ими надо как-то рулить, был выбран Ansible.

На управляемом хосте создан пользователь ansible, и помещен в группу sudo.

На узле управления требуется создать пару SSH-ключей

# ssh-keygen

и передать публичный ключ на управляемый хост

# ssh-copy-id ansible@managed-host

cat /etc/ansible/hosts

[corp:vars]

ansible_sudo_pass=strongpass

ansible_become=yes

ansible_become_method=sudo

ansible_user=ansible


[corp]

astra1.corp.ru

astra2.corp.ru

Плэйбуки для тестов:

cat /root/anisble-workspace/apt.yaml
---
- hosts: all
  become: true
  become_user: root
  tasks:
  - name: Update and upgrade apt packages
    apt:
      upgrade: yes
      update_cache: yes
      cache_valid_time: 86400


cat /root/anisble-workspace/reboot.yaml
---
- hosts: all
  become: true
  become_user: root
  tasks:
          - name: Rebooting the cloud server/bare metal box
            reboot:

Проверяем работу плейбуков:
cd /root/anisble-workspace

ansible-playbook test.yaml
ansible-playbook apt.yaml


среда, 6 октября 2021 г.

Создание HTTP принципала, и добавление новых к существующему.

Таким образом мы создаем файл keytab на контроллере домена, в PS, под админской учеткой (PS от админа!) для специально созданного сервисного пользовате в AD - akhchservice@CORP.DOMAIN.LOCAL

ktpass /princ HTTP/srv-multiweb.corp.domain.local@CORP.DOMAIN.LOCAL /mapuser akhchservice@CORP.DOMAIN.LOCAL /crypto ALL /ptype KRB5_NT_PRINCIPAL /out C:\multiweb.keytab /pass *

Будет запрошен пароль, следует ввести пароль, который назначался при создании пользователя akhchservicе.

Затем файл C:\multiweb.keytab следует перенести на Linux-сервер в нужный каталог, напр. /etc

Усложняем задачу - на том же web-сервере появляется новый виртуал-хост - srv-phonebook, нужно добавить этого принципала в keytab-файл.

Опять идем на контроллер домена, под админской учеткой вводим следующую команду в PS:

ktpass /princ HTTP/srv-phonebook.corp.domain.local@CORP.DOMAIN.LOCAL /mapuser akhchservice@CORP.DOMAIN.LOCAL  /crypto All /ptype KRB5_NT_PRINCIPAL /in C:\multiweb.keytab /out C:\multiweb2.keytab /setupn /setpass /pass *

При этом, новый файл - C:\multiweb2.keytab создается на основе файла C:\multiweb.keytab, который так и лежал на КД в корне диска С. Запрашивается пароль для akhchservice@CORP.DOMAIN.LOCAL, вводим его, переносим файл multiweb2.keytab на Linux.

Можем просмотреть содержимое файла multiweb2.keytab на Linux.

klist -K -e -t -k /etc/multiweb2.keytab

Keytab name: FILE:/etc/multiweb2.keytab

KVNO Timestamp           Principal

---- ------------------- ------------------------------------------------------

   6 01.01.1970 03:00:00 HTTP/srv-multiweb.corp.domain.local@CORP.DOMAIN.LOCAL (des-cbc-crc)  (0x4f29081ab51f8c7c)

   6 01.01.1970 03:00:00 HTTP/srv-multiweb.corp.domain.local@CORP.DOMAIN.LOCAL (des-cbc-md5)  (0x4f29081ab51f8c7c)

   6 01.01.1970 03:00:00 HTTP/srv-multiweb.corp.domain.local@CORP.DOMAIN.LOCAL (arcfour-hmac)  (0x8867da9b89eb48be56b132c9a176f9da)

   6 01.01.1970 03:00:00 HTTP/srv-multiweb.corp.domain.local@CORP.DOMAIN.LOCAL (aes256-cts-hmac-sha1-96)  (0xcec5a1d9182afd58cea26323e044f5c4b8bdd839474880c13e1c4c59d0724f7d)

   6 01.01.1970 03:00:00 HTTP/srv-multiweb.corp.domain.local@CORP.DOMAIN.LOCAL (aes128-cts-hmac-sha1-96)  (0x2f750fd25ff19a57a61249716a2f7614)

   6 01.01.1970 03:00:00 HTTP/srv-phonebook.corp.domain.local@CORP.DOMAIN.LOCAL (des-cbc-crc)  (0xe091fd80c438b67a)

   6 01.01.1970 03:00:00 HTTP/srv-phonebook.corp.domain.local@CORP.DOMAIN.LOCAL (des-cbc-md5)  (0xe091fd80c438b67a)

   6 01.01.1970 03:00:00 HTTP/srv-phonebook.corp.domain.local@CORP.DOMAIN.LOCAL (arcfour-hmac)  (0x8867da9b89eb48be56b132c9a176f9da)

   6 01.01.1970 03:00:00 HTTP/srv-phonebook.corp.domain.local@CORP.DOMAIN.LOCAL (aes256-cts-hmac-sha1-96)  (0x5e8baa1ee5ece62022fc7b5db0d972d3d4e32fe14350575adcab6e88a0d480ad)

   6 01.01.1970 03:00:00 HTTP/srv-phonebook.corp.domain.local@CORP.DOMAIN.LOCAL (aes128-cts-hmac-sha1-96)  (0x6221daab711b0c124e12e26af6cb0d5b)

Таким образом мы можем создавать на одном web-сервере множество виртуал-хостов для доменной авторизации.

Ну и на всякий случай листинг файлов с упоминанием keytab.

cat /etc/krb5.conf
[libdefaults]
        default_realm = CORP.DOMAIN.LOCAL
        kdc_timesync = 1
        ccache_type = 4
        forwardable = true
        proxiable = true
        v4_instance_resolve = false
        v4_name_convert = {
                host = {
                        rcmd = host
                        ftp = ftp
                }
                plain = {
                        something = something-else
                }
        }
        fcc-mit-ticketflags = true
# test  default_keytab_name = FILE:/etc/multiweb.keytab
        default_keytab_name = FILE:/etc/multiweb2.keytab

[realms]
        CORP.DOMAIN.LOCAL = {
                kdc = dc
                kdc = dc2
                admin_server = dc
                default_domain = CORP.DOMAIN.LOCAL
        }

[domain_realm]
        .corp.domain.local = CORP.DOMAIN.LOCAL
        corp.domain.local = CORP.DOMAIN.LOCAL
[login]
        krb4_convert = false
        krb4_get_tickets = false

Один из виртуал-хостов апача. (У нас их два - srv-phonebook и srv-multiweb.)

cat /etc/apache2/sites-available/srv-phonebook.corp.domain.local
<VirtualHost *:80>
ServerName srv-phonebook
DocumentRoot  /var/www/html/srv-phonebook
ServerAlias srv-phonebook.corp.domain.local
<Directory  /var/www/html/srv-phonebook>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    allow from all
</Directory>
  LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
  CustomLog ${APACHE_LOG_DIR}/srv-phonebooki_access.log combined
  ErrorLog ${APACHE_LOG_DIR}/srv-phonebook_error.log
</VirtualHost>
<Location />
AuthType Kerberos
KrbAuthRealms CORP.DOMAIN.LOCAL
KrbServiceName HTTP/srv-phonebook.corp.domain.local@CORP.DOMAIN.LOCAL
# тест Krb5Keytab /etc/multiweb.keytab
Krb5Keytab /etc/multiweb2.keytab
KrbMethodNegotiate On
KrbMethodK5Passwd Off
require valid-user       
</Location>




среда, 23 декабря 2020 г.

Разное для Freeswitch

 Вывести номера и ip абонентов:

fs_cli -x "sofia status profile internal_rtcp reg" | awk '/Auth-User:/ {print $2"    "}  /IP:/ {print $2,$3" "}' | sed 'N;s/\n/ /'

вывести модели аппаратов и ip абонентов:

fs_cli -x "sofia status profile internal_rtcp reg"| awk '/Agent:/ {print $2,$3,$4"    "} /IP:/ {print $2,$3" "}' | sed 'N;s/\n/ /'

менять internal_rtcp и internal.

четверг, 15 октября 2020 г.

Freeswitch первоначальная настройка.

 Freeswitch установлен из репозитория. Как известно, Freeswitch имеет свой репозиторий, а не как Asterisk. Да, я собирал из исходников Freeswitch, но видимо что-то пошло не так, видимо из-за отсутствия опыта, по этому я переставил Freeswitch из репозитория.

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

Делаем:

cd /etc/freeswitch/directory

mv default.xml default.xml.orig

nano default.xml.orig

здесь меняем:

<X-PRE-PROCESS cmd="include" data="default/*.xml"/>

на 

<X-PRE-PROCESS cmd="include" data="test/*.xml"/> 

при выходе из nano сохраняем файл под именем test.xml.

Находясь в каталоге /etc/freeswitch/directory создаем каталог test, в 

него копируем два-три профиля телефонных аппаратов (каждый файл - аппарат), и файл default.xml из каталога default. Каталог default я на всякий случай переименовал переименовал.

mv default default.orig

Открываем профили учеток телефонных аппаратов:

nano  /etc/freeswitch/directory/test/100X.xml

Приводим в соответствие контекст:

<variable name="user_context" value="test"/>

На всякий выкладываю листинг:

cat /etc/freeswitch/directory/test/1000.xml

<include>

<user id="1000">

    <params>

      <param name="password" value="1000"/>

      <param name="vm-password" value="1000"/>

    </params>

    <variables>

      <variable name="toll_allow" value="domestic,international,local"/>

      <variable name="accountcode" value="1000"/>

      <variable name="user_context" value="test"/>

      <variable name="effective_caller_id_name" value="1000"/>

      <variable name="effective_caller_id_number" value="1000"/>

      <variable name="outbound_caller_id_name" value="$${outbound_caller_name}"/>

      <variable name="outbound_caller_id_number" value="$${outbound_caller_id}"/>

      <variable name="callgroup" value="techsupport"/>

    </variables>

  </user>

</include>


Делаем на всякий копию файла 

mv /etc/freeswitch/autoload_configs/acl.conf.xml /etc/freeswitch/autoload_configs/acl.conf.xml.orig

Открываем /etc/freeswitch/autoload_configs/acl.conf.xml, и приводим его к такому виду:

<configuration name="acl.conf" description="Network Lists">

 <network-lists>

<list name="lan" default="allow">

<node type="allow" cidr="192.168.11.0/26"/>

<node type="allow" cidr="192.168.11.9/32"/>

</list>

<list name="domains" default="deny">

</list>

</network-lists>

</configuration>

192.168.11.0/26 моя подсеть, 192.168.11.9/32 хост с freeswitch.

Открываем файл /etc/freeswitch/vars.xml (так же предварительно можно скопировать оригинал, и переименовать). Здесь добавляем:

звуки

<X-PRE-PROCESS cmd="set" data="default_language=ru"/>

общий пароль для аппаратов

<X-PRE-PROCESS cmd="set" data="default_password=1000"/>

IP сервера для sip и rtp:

<X-PRE-PROCESS cmd="stun-set" data="external_rtp_ip=192.168.11.9"/>
<X-PRE-PROCESS cmd="stun-set" data="external_sip_ip=192.168.11.9"/>

Дефолтное удаляем или комментим
<X-PRE-PROCESS cmd="stun-set" data="external_rtp_ip=stun:stun.freeswitch.org"/>
<X-PRE-PROCESS cmd="stun-set" data="external_sip_ip=stun:stun.freeswitch.org"/>

Далее идем в /etc/freeswitch/sip_profiles/external, и здесь создаем файлы с учетками своих транков, у меня их два. Привожу как пример, вам самим (с помощью провайдера sip) нужно будет их настроить. Мои учетки транков:
cat sip1.xml
<include>
    <gateway name="sip1">
        <param name="username" value="1111111"/>
        <param name="password" value="XXXXXXXXX"/>
        <param name="realm" value="sip1.ru"/>
        <param name="from-user" value="1111111"/>
        <param name="from-domain" value="sip1.ru"/>
        <param name="proxy" value="sip1.ru"/>
        <param name="expire-seconds" value="300"/>
        <param name="register" value="true"/>
        <param name="register-transport" value="udp"/>
        <param name="context" value="sip1"/>
    </gateway>
</include>

cat sip2.xml
<include>
    <gateway name="sip2">
        <param name="username" value="2222222"/>
        <param name="password" value="XXXXXXXXX"/>
        <param name="realm" value="sip2.ru"/>
        <param name="from-user" value="2222222"/>
        <param name="from-domain" value="sip2.ru"/>
        <param name="proxy" value="sip2.ru"/>
        <param name="expire-seconds" value="300"/>
        <param name="register" value="true"/>
        <param name="register-transport" value="udp"/>
        <param name="context" value="sip2"/>
    </gateway>
</include>

Теперь идем в /etc/freeswitch/dialplan и создаем тут файл test.xml
Обращаю внимание, что входящие вызовы тут не описаны, только исходящие.
Мой text.xml - диалплан.
<?xml version="1.0" encoding="UTF-8"?>
<include>
    <context name="test">
        <extension name="unloop">
            <condition field="$${unroll_loops}" expression="^true$" />
            <condition field="${sip_looped_call}" expression="^true$" >
                <action application="deflect" data="${destination_number}" />
            </condition>
        </extension>
      <extension name="out-sip1">
            <condition field="destination_number" expression="^(8\d{10})$">
                <action application="bridge" data="sofia/gateway/sip1/$1" />
                <action application="hangup"/>
            </condition>
        </extension>
        <extension name="out-sip2">
               <condition field="destination_number" expression="^(7\d{10})$">
               <action application="bridge" data="sofia/gateway/sip2/$1" />
                <action application="hangup" />
            </condition>
        </extension>
       <extension name="local">
            <condition field="destination_number" expression="^\d{4}$">
                <action application="answer" />
                <!-- <action application="sleep" data="1000" /> -->
                <action application="bridge" data="user/${destination_number}@$${domain}" />
                <action application="hangup" />
            </condition>
            </extension>
    </context>
</include>

Обратите внимание, на то, что выделено красным - вызов с первой цифры 8 и затем 10 цифр, и вызов пойдет через sip1, вызов с первой цифры 7 и затем 10 цифр, и вызов пойдет через sip2.

Можно настроить аппараты или софтфоны, перезапустить Freeswitch и попробовать позвонить.
Вход в консоль: FS - fs_cli
Статус транков: sofia status gateways
Статус транка: sofia status gateway sip

Если вы работали с Asterisk полезно взглянуть сюда
Я не претендую на абсолютную правильность написанного, т.к. основная цель данного текста зафиксировать свой опыт по работе с новой платформой. С данным конфигом у меня все работало - звонили внутренние телефоны, уходили звонки на внешние транки. Если будут вопросы - пишите, постараюсь ответить.