среда, 15 декабря 2021 г.

Список баз 1С для всех

файл который надо положить в %appdata%\1c\1cestart
\\corp.org.ru\1c\cfg\1cestart.cfg
CommonCfgLocation= \\corp.dom.ru\1c\cfg\1CESCmn.cfg
UseHWLicenses=0
AppAutoInstallLastVersion=0
файл в котором перечислены все ИБ
\\corp.dom.ru\1c\cfg\1cescmn.cfg
CommonInfoBases=\\corp.dom.ru\1c\v8i\org-buh-arc-20180831.v8i
CommonInfoBases=\\corp.dom.ru\1c\v8i\org-buh.v8i
CommonInfoBases=\\corp.dom.ru\1c\v8i\org-doc.v8i
CommonInfoBases=\\corp.dom.ru\1c\v8i\org-zup-arc-20180702.v8i
CommonInfoBases=\\corp.dom.ru\1c\v8i\org-zup.v8i
файл с информацией для генерации файлов v8i
\\corp.dom.ru\1c\cfg\v8i_utf8.csv
IB;SRV;IBFN;ORG;CONF;Prod;Description
org-buh-arc-20180831;org-v-1c;Организация Бух Архив 20180831;Организация;Бух;Архив;20180831
org-buh;org-v-1c;Организация Бух;Организация;Бух;;
org-doc;org-v-1c;Организация СЭД;Организация;СЭД;;
org-zup-arc-20180702;org-v-1c;Организация ЗУП Архив 20180702;Организация;ЗУП;Архив;20180702
org-zup;org-v-1c;АТИС ЗУП;АТИС;ЗУП;;
скрипт который генерит файлы v8i. группы в АД, назначает соответствующие разрешения
1c_v8igen.ps1
#$VerbosePreference = "Continue"
$IBListCSV = "\\corp.dom.ru\1c\cfg\v8i_utf8.csv"
$v8iPath = "\\corp.dom.ru\1c\v8i"
$1CECmn = "\\corp.dom.ru\1c\cfg\1CESCmn.cfg"
$CsvEncoding = "utf8"
Write-Verbose -message "$IBListCSV"
Write-Verbose -message "$v8iPath"
$OUPath = "ou=v8i,ou=1c,ou=Группы доступа,dc=corp,dc=org,dc=ru"

$Template = '[%IBFN%]
Connect=Srvr="%SRV%";Ref="%IB%";
Folder=/
External=0
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.3
AppArch=x86
'

Write-Verbose -message "ActiveDirectory module check "
if (Get-Module -ListAvailable -Name ActiveDirectory) {
    Write-Verbose -message "ActiveDirectory module installed"
}
else {
    Write-Host "ActiveDirectory module not installed try"
Write-Host "Install-WindowsFeature -Name ""RSAT-AD-PowerShell"" -IncludeAllSubFeature"
exit
}

$IBList = Import-Csv -Path "$IBListCSV" -Encoding $CsvEncoding -Delimiter ";"
$v8iAll = "$($v8iPath)\_All.v8i"
Out-File -Encoding utf8 -FilePath "$v8iAll"
Out-File -Encoding utf8 -FilePath "$1CECmn"

ForEach ($IB in $IBList) {
Write-Verbose -message $IB.IBFN
$NewTemplate = $Template -replace "%IBFN%", $IB.IBFN
Write-Verbose -message $IB.SRV
$NewTemplate = $NewTemplate -replace "%SRV%", $IB.SRV
Write-Verbose -message $IB.IB
$NewTemplate = $NewTemplate -replace "%IB%", $IB.IB
Write-Verbose -message "$v8i"
$v8i = "$($v8iPath)\$($IB.IB).v8i"
$NewTemplate | Out-File -Encoding utf8 -FilePath $v8i
$NewTemplate | Out-File -Append -Encoding utf8 -FilePath $v8iAll
"CommonInfoBases=$v8i" | Out-File -Append -Encoding utf8 -FilePath $1CECmn
$GroupName = "DL_v8i_$($IB.IB)_RO"
Write-Verbose -message "$chekGroup"
if ( $(Get-ADGroup -LDAPFilter "(sAMAccountName=$GroupName)") -eq $null ) {
Write-Verbose -message "Create $GroupName"
New-ADGroup -Name $GroupName -Path $OUPath -GroupScope Global -GroupCategory Security
}
Write-Verbose -message "Update $GroupName"
Set-ADGroup -Identity $GroupName -Replace @{
info="Path=$v8i; aclType=Read"
Description = "$($IB.IBFN)"
}
Write-Verbose -message "$GroupName addMember DL_v8i_all"
Add-ADGroupMember -Identity $GroupName -Members DL_v8i_all
Write-Verbose -message "DL_1c_list addMember $GroupName"
Add-ADGroupMember -Identity DL_1c_list -Members $GroupName
Write-Verbose -message "Get-ACL $v8i"
$acl = Get-Acl -Path $v8i
Write-Verbose -message "Setup Permissions"
$permission = "MLG\$GroupName", 'Read', 'Allow'
Write-Verbose -message "Setup Rule"
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($permission)
Write-Verbose -message "Setup Acl"
$acl.SetAccessRule($rule)
Write-Verbose -message "Save Acl to $v8i"
$acl | Set-Acl -Path $v8i
}

Что проиcходит?
Скрипт читает CSV
(IB - берёт из колонки IB csv файла)
Создаёт файл IB.v8i 
Создаёт группу в АД с именем DL_v8i_IB_read
Назначает этой группе разрешение read на файл v8i
Добавляет группу в другие группы.
Осталось создать GPO которое будет заменять файл %appdata%\1c\1cestart\1cestart.cfg файлом \\corp.org.ru\1c\cfg\1cestart.cfg

Ратнер Арсений, arsenyratner@gmail.com, 7 985 273 2090

Dell MD32xx Disk Group failed

Случилось, видимо из-за того что не был соблюдён порядок включения полок
Все дисковые группы которые были на полке 1220, подключенной к 3200, были в состоянии Failed.
Все жёсткие диски в состоянии Optimal
Ни один не вынимался и не менялись местами.
Решил попробовать "возродить" дисковую группу с помощью команды:
Возвродить дисковую группу.
smcli -n ИмяПолки -c "revive diskgroup[ИмяГруппы];"
Получить список полок:
smcli -d -i

После этого группа перешла в режим восстановления и диск снова стал доступен на кластере. 

1С. Восстановление из резервной копии бд postgres

# .\1c_pg_restore.ps1 -verbose -dbname buh-new-20211130-1129 -dumpfile e:\tmp\buh-new__20211130-112901.backup

[CmdletBinding()]
param(
    [String]$dbname="",
    [String]$dumpfile="",
    [String]$PG_DIR='C:\Program Files\PostgreSQL 1C\12\',
    [String]$CREATEDB="$PG_DIR\bin\createdb.exe",
    [String]$PGRESTORE="$PG_DIR\bin\pg_restore.exe",
    [String]$PSQL="$PG_DIR\bin\psql.exe",
    [String]$dbserver='localhost',
    [String]$dbuser='postgres',
    [String]$dbpassword='password'
)

Write-Verbose -message dbname=$dbname
Write-Verbose -message CREATEDB=$CREATEDB
Write-Verbose -message PGRESTORE=$PGRESTORE
Write-Verbose -message PSQL=$PSQL
Write-Verbose -message dbserver=$dbserver
Write-Verbose -message dbuser=$dbuser
Write-Verbose -message dbpassword=$dbpassword

$env:PGPASSWORD = $dbpassword
$env:PGUSER = $dbuser
$env:PGHOST = $dbserver

Write-Verbose -message "Check -dbname is set $dbname"
if ($dbname -eq "") {
Write-Host "-dbname not set"
exit
}
Write-Verbose -message "Check -dumpfile is set $dumpfile"
if ($dumpfile -eq "") {
Write-Host "-dumpfile not set "
exit
} else {
Write-Verbose -message "Check existance $dumpfile"
if (!(Test-Path $dumpfile)) {
Write-Host $dumpfile does not exist
exit
}
}
Write-Verbose -message "Check existance $dbname"
# $dblist = &$PSQL --host=$dbserver --username=$dbuser --dbname $dbname -c "\q" 2>&1
$dblist = &$PSQL --dbname $dbname -c "\q" 2>&1
if ($LastExitCode -eq 0) {
Write-Host "$dbname alredy exists, exiting"
exit
}
Write-Verbose -message "$dbname Creating db"
$createdbparams = "--encoding=utf8 --template=template1 --locale=ru_RU.UTF-8 --lc-collate=ru_RU.UTF-8 --lc-ctype=ru_RU.UTF-8 --encoding=UTF8"
$result = & $CREATEDB $dbname $createdbparams
if ($LastExitCode -ne 0) {
Write-Host "$dbname can not create, exiting"
exit
}
Write-Verbose -message "$dbname restoring db $PGRESTORE -d $dbname"
$result = & $PGRESTORE --dbname=$dbname $dumpfile 2>&1
if ($LastExitCode -ne 0) {
Write-Host "$dbname not restored, exiting"
exit
}
Write-Verbose -message "$dumpfile restored to $dbname"


Ратнер Арсений, arsenyratner@gmail.com, 7 985 273 2090

вторник, 30 ноября 2021 г.

Последняя версия скрипта для бекапа 1С # PowerShell.exe -ExecutionPolicy Bypass -File C:\!Scripts\1c_pg_backup.ps1 # powershell -windowstyle minimized -c "powershell -c C:\!Scripts\1c_pg_backup.ps1 -verbose >> C:\!Scripts\1c_pg_backup.log *>&1" [CmdletBinding()] param( [String]$dbname="", [String]$dumpdir= 'E:\\tmp\\backup', [String]$PG_DIR='C:\Program Files\PostgreSQL 1C\12\', [String]$PGDUMP="$PG_DIR\bin\pg_dump.exe", [String]$PSQL="$PG_DIR\bin\psql.exe", [String]$dbserver='localhost', [String]$dbuser='postgres', [String]$dbpassword='Passw0rD', [String]$separateconfig="" ) Write-Verbose -message dbname=$dbname Write-Verbose -message dumpdir=$dumpdir Write-Verbose -message PGDUMP=$PGDUMP Write-Verbose -message PSQL=$PSQL Write-Verbose -message dbserver=$dbserver Write-Verbose -message dbuser=$dbuser Write-Verbose -message dbpassword=$dbpassword Write-Verbose -message datestamp=$datestamp $excludedb="('template0','template1','postgres')" # $excludedb="('template0','template1','postgres','atis-buh-new','atis-doc','mon-buh','mon-zup','ml-buh','ml-zup')" $sql_listdb="select datname from pg_database where not datname in $excludedb order by datname;" $env:PGPASSWORD = $dbpassword $datestamp = Get-Date -UFormat "%Y%m%d-%H%M%S" $alldbdir = "$dumpdir\\pgsql" $IPCUser = "Administrator" # Authentication $IPCPwd = "media!!2004" # for IPC$ share $DstHost = "backupserver" # robocopy dest $DstDir = "D$\1C\pgsql" # robocopy dest $SrcDir = "E:\tmp\backup\pgsql" # robocopy source $LogPath = "C:\!Scripts\1c_rbcp.log" # robocopy log $Params = "/E" # Robocopy params Write-Verbose -message "Проверяем указана ли база данных для копирования" if ($dbname -eq "") { Write-Verbose -message "Проверяем, существует ли папка $alldbdir" if(!(Test-Path -Path $alldbdir )){ Write-Verbose -message "Cоздаём папку $dumpdir" New-Item -ItemType directory -Path $alldbdir | Out-Null } else { Write-Verbose -message "Удаляем папку с дампами" Remove-Item -path $alldbdir -Force -Recurse | Out-Null New-Item -ItemType directory -Path $alldbdir | Out-Null } Write-Verbose -message "Делаем дамп каждой БД кроме $excludedb" $dblist = &$PSQL -t -h $dbserver -U $dbuser -c $sql_listdb foreach($db in $dblist) { $db = $db.TrimStart() if ($db -ne "") { $dbname=$db Write-Verbose -message "Делаем дамп БД $dbname" # &$PGDUMP -h $dbserver -U $dbuser --dbname=$dbname --file=$alldbdir\$($dbname)__$datestamp.sql.gz --compress=1 &$PGDUMP -Fc -b -h $dbserver -U $dbuser --dbname=$dbname --file=$alldbdir\$($dbname)__$datestamp.backup } Write-Verbose -message "Создание дампов завершено" Write-Verbose -message "Начинаем копирование дампов robocopy" Write-Verbose -message "Авторизуемся на $DstHost" NET USE \\$DstHost\ipc$ /U:"$IPCUser" $IPCPwd Write-Verbose -message "Копируем $SrcDir на \\$DstHost\$DstDir" robocopy.exe /NP $SrcDir \\$DstHost\$DstDir\ $Params /UNILOG:$LogPath Write-Verbose -message "Отключаемся от $DstHost" NET USE \\$DstHost\ipc$ /D Write-Verbose -message "Выполнение завершено" } else { if(!(Test-Path -Path $dumpdir\$dbname )){ Write-Verbose -message "Cоздаём папку $dumpdir\$dbname" New-Item -ItemType directory -Path $dumpdir\$dbname | Out-Null } else { Write-Verbose -message "Удаляем папку с дампами" Remove-Item -path $dumpdir\$dbname -Force -Recurse | Out-Null New-Item -ItemType directory -Path $dumpdir\$dbname | Out-Null } Write-Verbose -message "Добавляем разрешения для Network Service" $acl = Get-Acl "$dumpdir\$dbname" $ar = New-Object System.Security.AccessControl.FileSystemAccessRule("NT AUTHORITY\NETWORK SERVICE","FullControl","Allow") $acl.SetAccessRule($ar) $acl | Set-Acl "$dumpdir\$dbname" if ($separateconfig -eq "" ) { Write-Verbose -message "Делаем дамп указанной БД $dbname в $dumpdir\\$($dbname)__$datestamp.sql.gz" #&$PGDUMP -h $dbserver -U $dbuser --dbname=$dbname --file=$dumpdir\\$($dbname)\\$($dbname)__$datestamp.sql.gz --compress=1 &$PGDUMP -Fc -b -h $dbserver -U $dbuser --dbname=$dbname --file=$dumpdir\\$($dbname)\\$($dbname)__$datestamp.backup } else { # Write-Verbose -message "$PGDUMP -h $dbserver -U $dbuser --dbname=$dbname --file=$dumpdir\$dbname\$dbname-config-scheme__$datestamp.sql -s -t config" Write-Verbose -message "Делаем дамп схемы $dbname таблицы config scheme $dumpdir\$dbname\$dbname-config-scheme__$datestamp.sql" &$PGDUMP -h $dbserver -U $dbuser --dbname=$dbname --file=$dumpdir\$dbname\$dbname-config-scheme__$datestamp.sql -s -t config #Write-Verbose -message "$PSQL -h $dbserver -U $dbuser --dbname=$dbname -c ""COPY public.config TO '$dumpdir\\$dbname\\$dbname-config-datafile__$datestamp.bin' WITH BINARY;""" Write-Verbose -message "Делаем бинарный дамп $dbname таблицы config binary $dumpdir\\$dbname\\$dbname-config-datafile__$datestamp.bin" &$PSQL -h $dbserver -U $dbuser --dbname=$dbname -c "COPY public.config TO '$dumpdir\\$dbname\\$dbname-config-datafile__$datestamp.bin' WITH BINARY;" # Write-Verbose -message "$dumpdir\$($dbname)__$datestamp.sql.gz -T config --compress=1" Write-Verbose -message "Делаем частичный дамп $dbname без config $dumpdir\$dbname\$($dbname)__$datestamp.sql.gz" &$PGDUMP -h $dbserver -U $dbuser --dbname=$dbname --file=$dumpdir\$dbname\$($dbname)__$datestamp.sql.gz -T config --compress=1 } }

пятница, 26 ноября 2021 г.

IPSEC Mikrotik Strongswan

Strongswan:
config setup                                                                                                                                    
        charondebug="all"
        uniqueids=yes
conn con1
        # ike=blowfish-sha1-modp1024!
        # esp=blowfish-sha1!
        ike=aes256-sha256-modp2048!
        esp=aes256-sha256!
        aggressive=no
        keyingtries=%forever
        ikelifetime=28800s
        lifetime=3600s
        dpddelay=30s
        dpdtimeout=120s
        dpdaction=restart
        keyexchange=ikev1
        authby=secret
        type=tunnel
        leftid=%net_behind_mktk%
        left=%net_behind_mktk%
        leftsubnet=%net_behind_mktk%/32
        rightid=%mktk_inet_ip%
        right=%mktk_inet_ip%
        # rightsubnet=%1_net_behind_mktk%,%2_net_behind_mktk%
conn con1-1
        also=mlg1
        rightsubnet=%1_net_behind_mktk%
        auto=start
conn con1-2
        also=mlg1
        rightsubnet=%2_net_behind_mktk%
        auto=start
Mikrotik:
/ip ipsec profile add \
  enc-algorithm=aes-256 \
  hash-algorithm=sha256 \
  name=strongswan
/ip ipsec peer add \
  address=%linux_inet_ip% \
  local-address=%mktk_inet_ip% \
  name=strongswan \
  profile=strongswan \
  send-initial-contact=no
/ip ipsec proposal add \
  auth-algorithms=sha256 \
  enc-algorithms=aes-256-cbc \
  lifetime=1h \
  name=strongswan \
  pfs-group=modp2048
/ip ipsec identity add \
  notrack-chain=prerouting \
  peer=strongswan \
  secret=%PSK%
/ip ipsec policy add \
  dst-address=%net_behind_linux% \
  sa-dst-address=%linux_inet_ip% \
  sa-src-address=%mktk_inet_ip% \
  src-address=%1_net_behind_mktk% \
  level=unique \
  proposal=strongswan \
  tunnel=yes
/ip ipsec policy add \
  dst-address=%net_behind_linux% \
  sa-dst-address=%linux_inet_ip% \
  sa-src-address=%mktk_inet_ip% \
  src-address=%2_net_behind_mktk% \
  level=unique \
  proposal=strongswan \
  tunnel=yes

Ратнер Арсений, arsenyratner@gmail.com, 7 985 273 2090

четверг, 18 ноября 2021 г.

Инвентаризация подключенных информационных баз 1с на компьютерах в домене

Сначала получим список всех компьютеров
Get-ADComputer -Filter * -Properties * | 
 Select -Property Name,DNSHostName,Enabled,LastLogonDate,operatingSystem |
 Export-CSV "C:\Users\Public\Documents\AllComputers.csv" -Delimiter ';' -Encoding UTF8 -NoTypeInformation

Проходим по списку компьютеров и копируем файлы AppData\Roaming\1C\1CEStart\ibases.v8i в одну папку. Можно скрипт добавить в планировщик, он будет собирать файлы по расписанию чтобы обработать компьютеры которые в данный момент были выключены. 
$port=445
$timeout=100
$VerbosePreference = "Continue"
#$VerbosePreference = "SilentlyContinue"
$dst = 'C:\Users\Public\Documents\ibases'
$csv = 'C:\Users\Public\Documents\ibases.csv'
$compList = Get-Content "C:\Users\Public\Documents\computerlist.txt"
foreach ($comp in $compList) {
  $requestCallback = $state = $null
  $client = New-Object System.Net.Sockets.TcpClient
  $beginConnect = $client.BeginConnect($comp,$port,$requestCallback,$state)
  Start-Sleep -milli $timeOut
  $src = "\\$comp\c$\users\"
  if ($client.Connected) {
    #write-verbose -Message "$comp connected"
$ibasespath = '\AppData\Roaming\1C\1CEStart\ibases.v8i'
$GC = Get-ChildItem $src
    # where{$_.name -notcontains 'Public' -and $_.name -notcontains 'Default'}
    ForEach ($user in $GC) {
        $v8i = "$($src)$($user)$($ibases_path)"
        if (Test-Path -Path "$v8i") {
            write-verbose -Message "Copy $v8i to $dst\$($user)_$($comp)_ibases.txt"
            Copy-Item -Path $v8i -Destination "$dst\$($user)_$($comp)_ibases.txt"
            Parse-Config -ConfigFilePath $v8i
        } else {
            Write-Verbose -Message "Not found: $($src)$($user)$($ibases_path)"
        }
  }
  } else {
  Write-Verbose -Message "$comp - connection failed"
  }
  $client.Close()
}

Соберём информацию из файлов в один csv
$VerbosePreference = "Continue"
$dst = 'C:\Users\Public\Documents\ibases\'
$csv = 'C:\Users\Public\Documents\ibases2.csv'
$comp = ''

Function parse-v8i {
    param (
        $v8iFilePath
    )
    $dbfn = ''
    $srv = ''
    $db = ''
   
    $ConfigContent = Get-Content $v8iFilePath -Encoding UTF8
    $IBases = $ConfigContent | ForEach-Object {
        if ($_ -match '(?''dbfn''^\[.+\]$)'){
            $dbfn = $Matches['dbfn']
        }
        if ($_ -match 'Connect=Srvr="(?''Srv''[^"]+)";Ref="(?''db''[^"]+)";'){
            $srv = $Matches['srv']
            $db = $Matches['DB']
        }
        if ($db -and $dbfn -and $srv){
            $content=[pscustomobject]@{
                DBFN = $dbfn
                SRV = $srv
                IB = $db
                filename = $file
            }
            $dbfn = ''
            $srv = ''
            $db = ''
            $content | Export-Csv -Path $csv -Delimiter ';' -Encoding UTF8 -NoTypeInformation -Append
        }
    }
}

$GC = Get-ChildItem $dst
ForEach ($file in $GC) {
  $v8i = "$($dst)$($file)"
  write-verbose -Message "Parse $v8i"
  Parse-Config -v8iFilePath $v8i
}


Ратнер Арсений, arsenyratner@gmail.com, 7 985 273 2090

Генератор паролей apg или wapg для Windows

 -n15 -EOI10l -a0 -m 10 -x 10 -MNCL -c cl_seed
Генерирует 15 произносимых паролей 
Без неоднозначных символов O, I, 1, 0, l

Ратнер Арсений, arsenyratner@gmail.com, 7 985 273 2090

среда, 10 ноября 2021 г.

Не пускает доменных пользователей OL8 Centos 8

Не пускает доменных пользователей:
journalctl -f 
pam_sss(sshd:auth): authentication success; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.20.81 user=admin.appc
pam_sss(sshd:account): Access denied for user admin.appc: 4 (System error)
Failed password for admin.appc from 192.168.20.81 port 52914 ssh2
fatal: Access denied for user admin.appc by PAM account configuration [preauth]

Решение:
Добавить в sssd.conf 
[domain/.....]
ad_gpo_access_control = disabled

Ратнер Арсений, arsenyratner@gmail.com, 7 985 273 2090

среда, 3 ноября 2021 г.

Сброс пароля пользователя в 1С 8.3.17 ...

-- Переименовать таблицу v8users
EXEC sp_rename 'v8users', 'v8users_tmp'
GO
-- Переименовать users.usr в users.usr_tmp
UPDATE Params
SET FileName = 'users.usr_tmp'
WHERE FileName = 'users.usr'
GO  
-- Создать пустую таблицу v8users
create   table v8users(
ID binary(16) NOT NULL,
Name nvarchar(64) NOT NULL,
Descr nvarchar(128) NOT NULL,
OSName nvarchar(128) NULL,
Changed datetime2(0) NOT NULL,
RolesID numeric(10,0) NOT NULL,
Show binary(1) NOT NULL,
Data varbinary(max) NOT NULL,
EAuth binary(1) NULL,
AdmRole binary(1) NULL,
UsSprH numeric(10,0) NULL,
PRIMARY KEY (ID)
);

-- меняем пароль

-- удаляем таблицу
DROP TABLE v8users
GO
-- возвращаем копию таблицы
EXEC sp_rename 'v8users_old', 'v8users'
GO
UPDATE Params
SET FileName = 'users.usr'
WHERE FileName = 'users.usr_old'
GO  

Центос не обновляется

Надо было сделать:
unset LD_LIBRARY_PATH

Пишет:
[root@vm-ora7 yum.repos.d]# yum update
Plugin "refresh-packagekit" can't be imported
Loaded plugins: fastestmirror, priorities, security
Determining fastest mirrors
 * base: centos.tt.co.kr
 * updates: centos.tt.co.kr
base                                                                                                                                   | 3.7 kB     00:00
Traceback (most recent call last):
  File "/usr/bin/yum", line 29, in <module>
    yummain.user_main(sys.argv[1:], exit_code=True)
  File "/usr/share/yum-cli/yummain.py", line 276, in user_main
    errcode = main(args)
  File "/usr/share/yum-cli/yummain.py", line 129, in main
    result, resultmsgs = base.doCommands()
  File "/usr/share/yum-cli/cli.py", line 434, in doCommands
    self._getTs(needTsRemove)
  File "/usr/lib/python2.6/site-packages/yum/depsolve.py", line 99, in _getTs
    self._getTsInfo(remove_only)
  File "/usr/lib/python2.6/site-packages/yum/depsolve.py", line 110, in _getTsInfo
    pkgSack = self.pkgSack
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 883, in <lambda>
    pkgSack = property(fget=lambda self: self._getSacks(),
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 668, in _getSacks
    self.repos.populateSack(which=repos)
  File "/usr/lib/python2.6/site-packages/yum/repos.py", line 294, in populateSack
    sack.populate(repo, mdtype, callback, cacheonly)
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 164, in populate
    if self._check_db_version(repo, mydbtype):
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 222, in _check_db_version
    return repo._check_db_version(mdtype)
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1263, in _check_db_version
    repoXML = self.repoXML
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1462, in <lambda>
    repoXML = property(fget=lambda self: self._getRepoXML(),
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1454, in _getRepoXML
    self._loadRepoXML(text=self)
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1444, in _loadRepoXML
    return self._groupLoadRepoXML(text, self._mdpolicy2mdtypes())
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1419, in _groupLoadRepoXML
    if self._commonLoadRepoXML(text):
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1237, in _commonLoadRepoXML
    result = self._getFileRepoXML(local, text)
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1015, in _getFileRepoXML
    size=102400) # setting max size as 100K
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 837, in _getFile
    size=size
  File "/usr/lib/python2.6/site-packages/urlgrabber/mirror.py", line 408, in urlgrab
    return self._mirror_try(func, url, kw)
  File "/usr/lib/python2.6/site-packages/urlgrabber/mirror.py", line 394, in _mirror_try
    return func_ref( *(fullurl,), **kwargs )
  File "/usr/lib/python2.6/site-packages/urlgrabber/grabber.py", line 985, in urlgrab
    return self._retry(opts, retryfunc, url, filename)
  File "/usr/lib/python2.6/site-packages/urlgrabber/grabber.py", line 886, in _retry
    r = apply(func, (opts,) + args, {})
  File "/usr/lib/python2.6/site-packages/urlgrabber/grabber.py", line 980, in retryfunc
    apply(cb_func, (obj, )+cb_args, cb_kwargs)
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1501, in _checkRepoXML
    repoXML = repoMDObject.RepoMD(self.id, filepath)
  File "/usr/lib/python2.6/site-packages/yum/repoMDObject.py", line 124, in __init__
    self.parse(srcfile)
  File "/usr/lib/python2.6/site-packages/yum/repoMDObject.py", line 140, in parse
    parser = iterparse(infile)
  File "/usr/lib/python2.6/site-packages/yum/misc.py", line 1169, in cElementTree_iterparse
    _cElementTree_import()
  File "/usr/lib/python2.6/site-packages/yum/misc.py", line 1164, in _cElementTree_import
    import cElementTree
ImportError: No module named cElementTree

четверг, 2 сентября 2021 г.

Mikrotik vpn server sstp, pptp, l2tp, ikev2

Микротик

:global dnsServer  192.168.1.100;
:global radiusServer 192.168.1.100;
:global radiusSecret IEASrfghasdkalilagf234sdfD;
:global ipsecSecret KudOmjirortuk7Drie;
:global vpnRange 192.168.20.0/24;
:global vpnLocalIp 192.168.20.1;
:global splitNetworks 192.168.0.0/23,192.168.7.0/24;

# ip pool for vpn users
/ip pool add name=vpn-pool ranges=$vpnRange
# profile for pptp,l2tp,sstp
/ppp profile add dns-server=$dnsServer local-address=$vpnLocalIp name=XXtp remote-address=vpn-pool use-compression=yes use-encryption=yes use-mpls=yes wins-server=$dnsServer
#use radius for auth
/ppp aaa set use-radius=yes
/radius add address=$radiusServer secret=$radiusSecret service=ppp,ipsec
#seting up pptp, l2tp, sstp
/interface l2tp-server server set authentication=mschap2 default-profile=XXtp enabled=yes ipsec-secret=$ipsecSecret use-ipsec=yes
/interface pptp-server server set authentication=mschap2 default-profile=XXtp enabled=yes
/interface sstp-server server set authentication=mschap2 certificate=vpn.myreis.ru.pem_0 default-profile=XXtp enabled=yes port=10443 tls-version=only-1.2
#seting up ikev2 ipsec
/ip ipsec policy group add name=ikev2-policies
/ip ipsec profile set [ find default=yes ] enc-algorithm=aes-256,aes-192,aes-128,3des
/ip ipsec profile add enc-algorithm=aes-256,aes-192,aes-128 hash-algorithm=sha256 name=ikev2-profile
/ip ipsec peer add exchange-mode=ike2 name=ikev2-peer passive=yes profile=ikev2-profile send-initial-contact=no
/ip ipsec proposal set [ find default=yes ] auth-algorithms=sha256,sha1 pfs-group=none
/ip ipsec proposal add auth-algorithms=sha256,sha1 name=ikev2-proposal pfs-group=none
/ip ipsec proposal add name=proposal1
/ip ipsec mode-config add address-pool=vpn-pool name=ikev2-cfg split-dns=$dnsServer split-include=$splitNetworks static-dns=$dnsServer system-dns=no
/ip ipsec identity add auth-method=eap-radius generate-policy=port-strict mode-config=ikev2-cfg notrack-chain=prerouting peer=ikev2-peer policy-template-group=ikev2-policies
/ip ipsec policy add dst-address=$vpnRange group=ikev2-policies proposal=ikev2-proposal src-address=0.0.0.0/0 template=yes
/ip ipsec settings set xauth-use-radius=yes

#allow vpn connections
/ip firewall filter add action=accept chain=input protocol=gre
/ip firewall filter add action=accept chain=input protocol=ipsec-esp
/ip firewall filter add action=accept chain=input protocol=ipsec-ah
/ip firewall filter add action=accept chain=input dst-port=443,1701,1723,10443 protocol=tcp
/ip firewall filter add action=accept chain=input dst-port=1701,500,4500 protocol=udp
/ip firewall raw add action=notrack chain=prerouting dst-address=0.0.0.0/0 src-address=$vpnRange
/ip firewall raw add action=notrack chain=prerouting dst-address=$vpnRange src-address=0.0.0.0/0

Certbot

certbot certonly --preferred-challenges=dns --manual -d vpn.domen.ru

И добавляем в letsencrypt-routeros.sh строчку которая обновляет сертификаты для ipsec
$routeros /ip ipsec identity set certificate="$DOMAIN.pem_0,$DOMAIN-chain.pem_0,$DOMAIN-chain.pem_1" numbers=0

Windows 10 sstp клиент

SSTP
$vpn_type = 'sstp'
$vpn_server = 'vpn.myreis.ru'
$vpn_name = $vpn_server+'_'+vpn_type
$vpn_nets = '192.168.0.0/23 192.168.7.0/24'
Remove-VpnConnection -Name $vpn_name -Force -PassThru
Add-VpnConnection -Name $vpn_name -TunnelType $tunel_type -ServerAddress "$($vpn_server):10443" -SplitTunneling -DnsSuffix 'alliancetravel.ru' -RememberCredential -PassThru
$vpn_nets.Split(" ") | foreach { Add-VpnConnectionRoute -ConnectionName $vpn_name -DestinationPrefix $_ -PassThru }

L2TP
$vpn_type = 'l2tp'
$l2tp_psk = 'l2tppsk'
$vpn_server = 'vpn.myreis.ru'
$vpn_name = $vpn_server+'_'+$vpn_type
$vpn_nets = '192.168.0.0/23 192.168.7.0/24'
Remove-VpnConnection -Name $vpn_name -Force -PassThru
Add-VpnConnection -Name $vpn_name -TunnelType $tunel_type -ServerAddress $vpn_server -SplitTunneling -DnsSuffix 'alliancetravel.ru' -L2tpPsk $l2tp_psk -RememberCredential -PassThru -Force
$vpn_nets.Split(" ") | foreach { Add-VpnConnectionRoute -ConnectionName $vpn_name -DestinationPrefix $_ -PassThru }

Остальные типы ВПН настраиваем по аналогии, надо только отключить "использовать впн соединение как шлюз по умолчанию" в ikev2 маршруты добавятся сами.