пятница, 20 февраля 2026 г.

Apache Guacomole

 Для удаленного доступа пользователей, посредством протоколов SSH, RDP, VNC, возможно использовать Apache Guacomole - инструмент работающий в браузере, посредством HTML5 отображающий графику удаленных рабочих столов. Возможно интегрировать посредством LDAP с работой в  домене, использовать второй фактор - TOTP. Помимо возможной безопасной реализации доступа, представляет несомненный плюс в своей простоте для пользователей, которым для работы теперь нужен только современный браузер поддерживающий HTML5, для администраторов и сотрудников ИБ, с которых снимает головную боль о соблюдении необходимых соответствий (compliance) на удаленных ПК пользователей. 

В Сети масса инструкций по сборке конструктора - Apache Guacomole, Tomcat9, mysql (pgsql) и т.п., Nginx, LetsEncrypt и т.д. в разных вариациях.
Предлагается сборка из исходников, скачивание ПО непосредственно с сайта производителя, с последующей инсталляцией, установка из репозиториев, установка сразу всего в контейнере Docker.
В данной статье приводится пример инсталляции полученной из репозиториев ОС - Ubuntu 22.04.

Для понимания, что есть что:

guacd — основной сервер Guacamole, который обрабатывает подключения и передает данные между клиентом и удаленными системами;
tomcat9 — веб-сервер для развертывания веб-приложения Guacamole;
поддержка протоколов:
libguac-client-rdp0 — протокол RDP (для подключения к Windows и Linux с xrdp);
libguac-client-ssh0 — протокол SSH (терминальный доступ);
libguac-client-vnc0 — протокол VNC (удаленный рабочий стол);
libguac-client-telnet0 — протокол Telnet;
guacamole.war — Java-приложение (Apache Tomcat).


1. Обновим содержимое репозиториев:
apt update
2. Установим нужное, если оно отсутствует:
apt install nano wget mc  
3. Установим нужное ПО:
apt install guacd libguac-client-rdp0 libguac-client-ssh0 libguac-client-telnet0 libguac-client-vnc0 tomcat9 tomcat9-admin tomcat9-common tomcat9-user libguac19 libguac-dev
4. Скачиваем web-приложение Guacomole. Для начала смотрим, какая версия пришла из репозитория, они обязательно должны совпадать:
dpkg -l | grep guacd

видим:  ii  guacd  1.3.0-1.1

скачиваем:
wget https://downloads.apache.org/guacamole/1.3.0/binary/guacamole-1.3.0.war
и затем копируем его:
cp guacamole-1.3.0.war /var/lib/tomcat9/webapps

Создадим символическую ссылку на каталог, чтобы в дальнейшем было удобнее  писать адрес в адресной строке браузера:
ln -s /var/lib/tomcat9/webapps/guacamole-1.3.0 /var/lib/tomcat9/webapps/guacamole

5. Наполним файл /etc/guacamole/guacd.conf следующим содержимым:

[server]
bind_host = 127.0.0.1
bind_port = 4822

Если файл отсутствует, его нужно создать.

6. Создадим хэш пароля администратора для использования в вэб-интерфейсе:
echo -n password | openssl md5
(stdin)= 5f4dcc3b5aa765d61d8327deb882cf99

вставим хэш в файл /etc/guacamole/user-mapping.xml

<user-mapping>

<!-- Per-user authentication and config information --> 

<!-- A user using md5 to hash the password

example below uses the md5 hash of "PASSWORD")--> 

    <authorize 

            username="admin"

            password="5f4dcc3b5aa765d61d8327deb882cf99"

            encoding="md5">


        <!-- RDP connection -->

                <connection name="RDP SL">

            <protocol>rdp</protocol>

            <param name="hostname">192.168.0.128</param>

            <param name="port">3389</param>

            <param name="username">user</param>

            <param name="ignore-cert">true</param>

        </connection>


        <!-- SSH connection -->

        <connection name="SSH SL">

            <protocol>ssh</protocol>

            <param name="hostname">192.168.0.190</param>

            <param name="port">22</param>

           </connection>

        <!-- VNC authorized connection -->

        <connection name="VNC WORK">

            <protocol>vnc</protocol>

            <param name="hostname">192.168.0.120</param>

            <param name="port">5900</param>

            <param name="username">user</param>

            <param name="password">123</param>

        </connection>

   </authorize>

</user-mapping> 

В секциях RDP SL, SSH SL, VNC WORK требуется указать ip серверов, и порты которые используют протоколы. Команду с паролем лучше удалить из истории.
Смотрим историю:
history
смотрим номер команды, и удаляем его:
history -d XX

7. Далее следует открыть (создать если нет) файл nano /etc/guacamole/guacamole.properties, и вставить в него следующее содержимое:
guacd-hostname: localhost
guacd-port:     4822
user-mapping:   /etc/guacamole/user-mapping.xml
auth-provider: net.sourceforge.guacamole.net.basic.BasicFileAuthenticationProvider

Здесь описывается на каких основаниях производится подключение к guacomole.

8. Рестартуем guacomole и tomcat:
systemctl restart tomcat9 guacd

9. После всего вышеперечисленного мы можем открыть web-интерфейс Guacomole:
http://192.168.X.X:8080/guacamole

Должна открыться страница авторизации Guacomole:

После авторизации (admin:password), мы увидим настроенные ранее ( в фале файл user-mapping.xml) соединения:










На данном этапе базовую настройку Guacomole можно считать оконченной.

 

  

суббота, 18 октября 2025 г.

Обновление записей в DNS (Windows) c Linux-хостов в домене Active Directory

Такая ситуация: Linux-хост введен в домен AD, но при смене ip-адреса на хосте, A запись не обновляется автоматически.

Скрипт dns_update.sh который обновляет A, AAA, PTR записи:

#!/bin/bash
# Prepare with some variables
#
# Change to your DNS admin file location
dns_admin_file="/path/to/pass"
dns_admin=`cat $dns_admin_file | awk 'NR==1 {print; exit}'`
dns_admin_pw=`cat $dns_admin_file | awk 'NR==2 {print; exit}'`
# ipv4 may need some adjustment in case of multiple eth interfaces
# In default case we assume that you have only one eth interface
ipv4=`/bin/ip -o -4 addr list | grep -v 127.0.0.1 | awk '{print $4}' | cut -d/ -f1`
rev_ipv4=`echo $ipv4 | awk -F. '{print $4"."$3"." $2"."$1}'`.in-addr.arpa.
fqdn=`hostname --fqdn`
# Get old ipv4 for future deletion
old_ipv4=`dig $fqdn |grep 'ANSWER SECTION' -A1 | grep 'IN' | awk '{print $5}'`
rev_old_ipv4=`echo $old_ipv4 | awk -F. '{print $4"."$3"." $2"."$1}'`.in-addr.arpa.
domain=`echo $fqdn | sed 's/^[^.]*.//g'`
dom_up_case=`echo $domain | tr [:lower:] [:upper:]`
kdc=`cat /etc/krb5.conf | grep 'admin_server =' | awk '{print $3}' | tr [:upper:] [:lower:]`
# Change the ttl to your liking
ttl=3600
# Change file location to your liking
keytab_file="/etc/krb5.keytab"
# Check if DNS update is needed
if [[ "$ipv4" != "$old_ipv4" ]]; then
# Create/update keytab file
ktutil <<EOF
addent -password -p $dns_admin@$dom_up_case -k 1 -e rc4-hmac
$dns_admin_pw
write_kt $keytab_file
quit
EOF
# Get ticket for DNS admin
kinit -k $dns_admin
# Create file for forward zone update
/bin/echo "gsstsig
server $kdc
zone $domain
update delete $fqdn a
update add $fqdn $ttl a $ipv4
send
" > /tmp/ad_dns_fw
# Create file for reverse zone update
/bin/echo "gsstsig
server $kdc
update delete $rev_old_ipv4 PTR
update add $rev_ipv4 $ttl PTR $fqdn.
send
" > /tmp/ad_dns_rev
# Run reverse zone update first
/usr/bin/nsupdate /tmp/ad_dns_rev
# And then run forward zone update
/usr/bin/nsupdate /tmp/ad_dns_fw
fi

Файл /path/to/pass, (см. dns_admin_file="/path/to/pass"), содержащий логин и пароль учетки в AD, которая может удалять/добавлять, читать/записывать в нужной зоне, или (это небезопасно) учетка входящая в группу DNSAdmins в Active Directory.
Содержимое /path/to/pass:


dns_adm1
3215178

Права на чтение только для владельца:
chmod 400 /path/to/pass

Можно добавить скрипт длы выполнения в cron, но лучше обернуть его в systemd юнит.
Создадим файл /etc/systemd/system/ad_dns_update.service, и добавим в него следующее содержание:

[Unit]
Description=AD DNS entries updater
Wants=network-online.target
After=network.target network-online.target
[Service]
ExecStart=/path/to/dns_update.sh
[Install]
WantedBy=multi-user.target

После этого:
systemctl daemon-reload && systemctl enable ad_dns_update.service




среда, 27 марта 2024 г.

Перенос почты в Iredmail.

Важно понимать какие квоты определить. Насколько заполенены ящики. Лучше не создавать квоты вообще, разобраться после.

НА СЕРВЕРЕ ПОЧТЫ

1. cd iRedMail-1.6.8/tools

2. Создать одну запись в файл. password обязательно в одинарных кавычках 

bash create_mail_user_SQL.sh admin@domain.ru 'password' > /tmp/users.sql 

3. Чтобы дополнить файл /tmp/users.sql формируем и запускаем скрипт.

#!/bin/sh

bash create_mail_user_SQL.sh    user@domain.ru        'password'     >> /tmp/users.sql;
bash create_mail_user_SQL.sh    user1@domain.ru       'password'     >> /tmp/users.sql;
bash create_mail_user_SQL.sh    user2@domain.ru       'password'     >> /tmp/users.sql; 


4. mysql -uroot -p

sql> USE vmail;

sql> SOURCE /tmp/users.sql; 

создадутся учетки. можно проверить в СУБД и в web почты. Теперь можно переносить почту.


НА МАШИНЕ С Imapsync (промежуточная машина для переноса почты).


1. Формируем файл вида:

172.16.20.49;user@domain.ru;password;172.16.20.5;ert@domain.ru;password;
172.16.20.49;user1@domain.ru;password;172.16.20.5;wem@domain.ru;password;
172.16.20.49;user2@domain.ru;password;172.16.20.5;qan@domain.ru;passwords; 

Важно! Следим что нет пробелов, что все разделено точка с запятой ;
host1;user1_1;password11_1;host2;user2_1;password2_1;   #описание


2. редактируем perenos.sh users.txt - файл сформированный пунком выше его имя users.txt

#!/bin/sh
{ while IFS=';' read h1 u1 p1 h2 u2 p2 fake
do
imapsync --host1 "$h1" --user1 "$u1" --password1 "$p1" \
--host2 "$h2" --user2 "$u2" --password2 "$p2" "$@"
done
} < users.txt

3. Запускаем perenos.sh. imapsync и perenos.sh должны быть в одном каталоге.

https://docs.iredmail.org/sql.create.mail.user.html

пятница, 8 декабря 2023 г.

KVM джентельменский набор команд

 Создание ОС Windows 10:

virt-install -n Win10-test -r 4096 --vcpus=4 \

--arch=x86_64 \

--disk pool=images,size=110,bus=virtio,format=qcow2 \

--disk /kvm/iso/Windows_10_sborka-Luca.iso,device=cdrom \

--disk /kvm/iso/virtio-win-0.1.229.iso,device=cdrom \

--network bridge:br0,model=virtio \

--os-variant=win10 \

--graphics vnc,listen=0.0.0.0,port=5901,password=@dmLuCa \

--boot cdrom,hd,menu=on


Создание ОС Debian:

virt-install \

--name debian_test \

--ram=4096 \

--vcpus=2 \

--arch=x86_64 \

--os-variant=debian11 \

--disk pool=images,size=30,bus=virtio,format=qcow2 \

--disk /kvm/iso/debian-11.0.0-amd64-netinst.iso,device=cdrom \

--network bridge=br0,model=virtio \

--graphics vnc,listen=0.0.0.0,password=@dmLuCa \

--boot cdrom,hd,menu=on 


Создание ОС Ubuntu:

virt-install \

--name timetable \

--ram=8192 \

--vcpus=4 \

--arch=x86_64 \

--os-variant=ubuntu22.04 \

--disk pool=images,size=50,bus=virtio,format=qcow2 \

--disk /kvm/iso/ubuntu-22.04.2-live-server-amd64.iso,device=cdrom \

--network bridge=br0,model=virtio \

--graphics vnc,listen=0.0.0.0,port=5907,password=@dmLuCa \

--boot cdrom,hd,menu=on 


Создание ОС Astra:

virt-install \

--name 1C-BD \

--ram=16384 \

--vcpus=8 \

--arch=x86_64 \

--os-variant=alse17 \

--disk pool=images,size=300,bus=virtio,format=qcow2 \

--disk /kvm/iso/1.7.4-24.04.2023_14.23.iso,device=cdrom \

--network bridge=br0,model=virtio \

--graphics vnc,listen=0.0.0.0,port=5903,password=@dmLuCa \

--boot cdrom,hd,menu=on 


Создание RouterOS:

virt-install \

--name Routeros \

--ram=256 \

--vcpus=1 \

--arch=x86_64 \

--os-variant=debian2.0 \

--graphics vnc,listen=0.0.0.0,port=5905,password=@dmLuCa \

--boot hd \

--disk path=/kvm/images/chr-7.10.2.img \

--network bridge=br2 


Создание Centos:

virt-install \

--name luka-mis \

--ram=48000 \

--vcpus=22 \

--arch=x86_64 \

--os-variant=centos7.0 \

--disk pool=storage_lsi,size=800,bus=virtio,format=qcow2 \

--disk /kvm/iso/CentOS-7-x86_64-Minimal-2009.iso,device=cdrom \

--network bridge=br0,model=virtio \

--graphics vnc,listen=0.0.0.0,port=5906,password=@dmLuCa \

--boot cdrom,hd,menu=on 


Для запуска ОС с использованием UEFI (пример):

<os>

    <type arch='x86_64' machine='pc-q35-7.2'>hvm</type>

    <loader readonly='yes' type='rom'>/usr/share/ovmf/OVMF.fd</loader>

    <boot dev='hd'/>

</os>


конфиг ВМ:

/etc/libvirt/qemu/...


версии ОС:

osinfo-query os


удаление ОС:

virsh list

virsh destroy win10_test2

virsh undefine win10_test2

rm -r /path/to/image


редактировать параметры ВМ в xml:

virsh edit 1C-App


выключить загрузку с boot cd:

<!-- <boot dev='cdrom'/> -->

<!-- <bootmenu enable='yes'/> -->


увеличить объем жесткого диска:

1.остановить ВМ

2.qemu-img resize /kvm/images/Win10-test.qcow2 +5G


увеличить объем ОЗУ, CPU:

virsh edit Win10-test

<topology sockets='1' cores='4' threads='2'/>

</cpu> 

 

Снепшот сделать:

virsh snapshot-create-as --domain Win10-test --name "7.6.23"


Список снепшотов:

virsh snapshot-list --domain Win10-test


Удалить снепшот:

virsh snapshot-delete <vm_name> <snapshot_name>


Возврат к снепшоту:

virsh snapshot-revert --domain Win10-test --snapshotname 7.6.23_2 --running 

virsh snapshot-revert --domain Win10-test --snapshotname 7.6.23_2 --shutoff 


Информация о машине:

virsh dominfo debian_test


Пометить ВМ для автостарта:

virsh autostart Win10-test


Отменить автостарт ВМ:

virsh autostart Win10-test --disable


Приостановить ВМ:

virsh suspend vm_name


Возобновление ВМ:

virsh resume vm_name


добавить сетевой интерфейс:

virsh attach-interface 1C-App --type bridge --source br3 --persistent 


ПРОВЕРКА SMART дисков:

1 cd /opt/MegaRAID/MegaCli

2 ./MegaCli64 -LdPdInfo -aALL | grep Id

3 smartctl -d megaraid,8 -a /dev/sda

  smartctl -d megaraid,4 -a /dev/sda

  smartctl -d megaraid,5 -a /dev/sda  #etc

вывод Device ID дисков:

./MegaCli64 -PDList -aAll | grep Id:

  

Перенос виртуалки с ESXi:

1. scp -r root@172.31.4.204:/vmfs/volumes/5e53a708/migration_test/ /migration

2. qemu-img convert -p -O qcow2  ./migration_test-flat.vmdk  ./migration_test-flat.qcow2

3. создать виртуальную машину с дисками, подменить диски

________________________________________________________

Создать диск:

qemu-img create -f qcow2 /kvm/images/for_tib_with_astra.qcow2 20G


Подключить диск:

virsh attach-disk astra-1.7.3-test --source /kvm/images/for_tib_with_astra.qcow2 --target vdb --persistent --subdriver qcow2


Вывести список поключенных к ВМ дисков:

virsh domblklist astra-1.7.3-test


Отключить диск:

virsh detach-disk --domain luka-mis --target vdb

___________________________________________________________

создание пулов дисков.

смотрим все пулы:

virsh pool-list --all


создаем новый пул:

virsh pool-define-as storage dir --target /kvm_ssd_lsi/images_lsi/


помечаем пул для автостарта:

virsh pool-autostart storage_lsi


Стартуем пул

virsh pool-start storage_lsi


проверяем пул

virsh pool-list –all

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

удаление дисковых пулов

virsh pool-destroy storage_lsi

virsh pool-delete storage_lsi

virsh pool-undefine storage_lsi

смотрим:

virsh pool-list --all

________________________________________________________________________________________


конвертация qcow2 в raw:

выключить машину

сконвертировать диск командой:

qemu-img convert /kvm/images/luka-mis-backups.qcow2 /kvm/images/luka-mis-backups.raw

изменить пути в xml-файле,

включить машину





пятница, 4 августа 2023 г.

Добавить новый iscsi target не перезагружая tgt сервис.

Формируем нужный конфиг (new_target.conf), типа:

<target iqn.2023-01.corp.firma:storage-fs-target>

   backing-store /dev/vg01/lv03

   initiator-address 10.10.12.1

</target>

И подгружаем его командой:

tgt-admin --update ALL -c /etc/tgt/conf.d/new_target.conf

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



четверг, 29 августа 2019 г.

cisco l2tp ipsec vpn, разграничения для клиентов по подсетям

В офисе завалялся Cisco router 2611, это модель начала 2000 годов, решили сделать из него VPN gate. Скорее всего конфиг подойдет и для других Cisco. На нашей 2611 System image file is "flash:c2600-advsecurityk9-mz.124-18.bin", на всякий случай.
Суть: пользователь i_ivanov подключаясь получает адрес из пула VPN-POOL-1,
пользователь n_romanov подключаясь получает адрес из пула VPN-POOL-2.

Для этих пулов разные права доступа - см. ip access-list extended office_and_tech.
vpn-gate#sh run
Building configuration...

Current configuration : 3734 bytes
!
version 12.4
service timestamps debug datetime msec
service timestamps log datetime msec
service password-encryption
!
hostname vpn-gate
!
boot-start-marker
boot-end-marker
!
logging buffered 4096 debugging
enable secret 5 $1$Q/p7$AFkWerymo9xG1/h.g/NdB3.
!
aaa new-model
!
!
aaa authentication ppp VPDN_AUTH local
aaa authorization network VPDN_AUTH local
!
aaa attribute list ATTR-LIST-2
 attribute type addr-pool "VPN-POOL-2" service ppp protocol ip
!
aaa attribute list ATTR-LIST-1
 attribute type addr-pool "VPN-POOL-1" service ppp protocol ip
!
aaa session-id common
no network-clock-participate slot 1
no network-clock-participate wic 0
ip cef
!
!
ip auth-proxy max-nodata-conns 3
ip admission max-nodata-conns 3
!
!
ip domain name domain.name.local
vpdn enable
!
vpdn-group L2TP
! Default L2TP VPDN group
 description Default L2TP VPDN group
 accept-dialin
  protocol l2tp
  virtual-template 1
 no l2tp tunnel authentication
!
vpdn-group L2TP2
 description Default L2TP2 VPDN group
 accept-dialin
  protocol l2tp
  virtual-template 2
 no l2tp tunnel authentication
!
!
!
!
!
username admin privilege 15 secret 5 $1$N5A.$2H.pEryBrQwmTFiAD93/
username i_ivanov password 7 1133101712051F5A53333E
username i_ivanov aaa attribute list ATTR-LIST-1
username j_johnson password 7 1423171915087205147D040725
username i_ivanov aaa attribute list ATTR-LIST-2
username v_lenin password 7 10400810161E17532D
username v_lenin aaa attribute list ATTR-LIST-1
username l_trotskiy password 7 09674F1B1808151D075F500A
username l_trotskiy aaa attribute list ATTR-LIST-1
username n_romanov password 7 013B14100C535502356C
username n_romanov aaa attribute list ATTR-LIST-2
username queen_victoria password 7 09494B1A1C0C0F1B0E
username queen_victoria aaa attribute list ATTR-LIST-1
archive
 log config
  logging enable
  hidekeys
 path tftp://192.168.2.1/cisco_2611/cisco_2611
 write-memory
 time-period 10080
!
!
controller E1 0/0
!
ip ssh version 2
!
!
crypto isakmp policy 1
 encr 3des
 authentication pre-share
 group 2
crypto isakmp key YOUR_SECRET_KEY address 0.0.0.0 0.0.0.0
!
!
crypto ipsec transform-set L2TP-Set2 esp-3des esp-sha-hmac
 mode transport
!
crypto dynamic-map dyn-map 10
 set nat demux
 set transform-set L2TP-Set2
!
!
crypto map outside_map 65535 ipsec-isakmp dynamic dyn-map
!
!
!
interface Loopback1
 description loopback for IPsec-pool
 ip address 192.168.19.1 255.255.255.255
!
interface Loopback2
 description loopback for IPsec-pool2
 ip address 192.168.19.65 255.255.255.255
!
interface FastEthernet0/0
 ip address 8.8.8.8 255.255.255.252
 ip access-group office_and_tech out
 no ip route-cache cef
 duplex auto
 speed auto
 crypto map outside_map
!
interface FastEthernet0/1
 no ip address
 shutdown
 duplex auto
 speed auto
!
interface Virtual-Template1
 ip unnumbered Loopback1
 peer default ip address pool VPN-POOL-1
 ppp authentication ms-chap-v2 VPDN_AUTH
 ppp authorization VPDN_AUTH
!
interface Virtual-Template2
 ip unnumbered Loopback2
 peer default ip address pool VPN-POOL-2
 ppp authentication ms-chap-v2 VPDN_AUTH
 ppp authorization VPDN_AUTH
!
ip local pool VPN-POOL-1 192.168.19.5 192.168.19.62
ip local pool VPN-POOL-2 192.168.19.70 192.168.19.126
ip forward-protocol nd
ip route 0.0.0.0 0.0.0.0 8.8.8.1
!
no ip http server
no ip http secure-server
!
ip access-list extended office_and_tech
 permit ip host 8.8.8.8 any
 permit ip 192.168.19.0 0.0.0.255 172.16.0.0 0.15.255.255
 permit ip 192.168.19.0 0.0.0.63 192.168.0.0 0.0.255.255
!
access-list 23 permit 192.168.2.0 0.0.0.255
!
!
control-plane
!
!
!
!
line con 0
line aux 0
line vty 0 4
 access-class 23 in
 exec-timeout 60 0
 logging synchronous
 transport input ssh
 transport output ssh
!
!
end