Skip to content

Network

ping

Test-Connection -Count 1 $srv1, $srv2 отправить icmp-пакет двум хостам
Test-Connection $srv -ErrorAction SilentlyContinue не выводить ошибок, если хост не отвечает
Test-Connection -Source $srv1 -ComputerName $srv2 пинг с удаленного компьютера

function Test-PingNetwork {
param (
    [Parameter(Mandatory,ValueFromPipeline)][string[]]$Network,
    [ValidateRange(100,10000)][int]$Timeout = 100
)
$ping = New-Object System.Net.NetworkInformation.Ping
$Network  = $Network -replace "0$"
$net = @()
foreach ($r in @(1..254)) {
    $net += "$network$r"
}
foreach ($n in $net) {
    $ping.Send($n, $timeout) | select @{Name="Address"; Expression={$n -replace ".+\."}}, Status
}
}

Test-PingNetwork -Network 192.168.3.0
Test-PingNetwork -Network 192.168.3.0 -Timeout 1000

Get-CimInstance -Class Win32_PingStatus -Filter "Address='127.0.0.1'"
Get-CimInstance -Class Win32_PingStatus -Filter "Address='127.0.0.1'" | Format-Table -Property Address,ResponseTime,StatusCode -Autosize 0 - успех
'127.0.0.1','8.8.8.8' | ForEach-Object -Process {Get-CimInstance -Class Win32_PingStatus -Filter ("Address='$_'") | Select-Object -Property Address,ResponseTime,StatusCode}
$ips = 1..254 | ForEach-Object -Process {'192.168.1.' + $_} сформировать массив из ip-адресов подсети

dhcp

Get-CimInstance -Class Win32_NetworkAdapterConfiguration -Filter "DHCPEnabled=$true" отобразить адаптеры с включенным DHCP
$wql = 'SELECT * from Win32_NetworkAdapterConfiguration WHERE IPEnabled=True and DHCPEnabled=False'
Invoke-CimMethod -MethodName ReleaseDHCPLease -Query $wql включение DHCP на всех адаптерах
Invoke-CimMethod -ClassName Win32_NetworkAdapterConfiguration -MethodName ReleaseDHCPLeaseAll отменить аренду адресов DHCP на всех адаптерах
Invoke-CimMethod -ClassName Win32_NetworkAdapterConfiguration -MethodName RenewDHCPLeaseAll обновить аренду адресов DHCP на всех адаптерах

port

tnc $srv -p 5985
tnc $srv -CommonTCPPort WINRM HTTP,RDP,SMB
tnc ya.ru –TraceRoute -Hops 2 TTL=2
tnc ya.ru -DiagnoseRouting маршрутизация до хоста, куда (DestinationPrefix: 0.0.0.0/0) через (NextHop: 192.168.1.254)

nslookup

nslookup ya.ru 1.1.1.1 с указанием DNS сервера
nslookup -type=any ya.ru указать тип записи
Resolve-DnsName ya.ru -Type MX ALL,ANY,A,NS,SRV,CNAME,PTR,TXT(spf)
[System.Net.Dns]::GetHostEntry("ya.ru")

ipconfig

Get-NetIPConfiguration
Get-NetIPConfiguration -InterfaceIndex 14 -Detailed

Adapter

Get-NetAdapter
Set-NetIPInterface -InterfaceIndex 14 -Dhcp Disabled отключить DHCP
Get-NetAdapter -InterfaceIndex 14 | New-NetIPAddress –IPAddress 192.168.3.99 -DefaultGateway 192.168.3.1 -PrefixLength 24 задать/добавить статический IP-адрес
Set-NetIPAddress -InterfaceIndex 14 -IPAddress 192.168.3.98 изменить IP-адреас на адаптере
Remove-NetIPAddress -InterfaceIndex 14 -IPAddress 192.168.3.99 удалить IP-адрес на адаптере
Set-NetIPInterface -InterfaceIndex 14 -Dhcp Enabled включить DHCP

DNSClient

Get-DNSClientServerAddress
Set-DNSClientServerAddress -InterfaceIndex 14 -ServerAddresses 8.8.8.8

DNSCache

Get-DnsClientCache отобразить кэшированные записи клиента DNS
Clear-DnsClientCache очистить кэш

Binding

Get-NetAdapterBinding -Name Ethernet -IncludeHidden -AllBindings
Get-NetAdapterBinding -Name "Беспроводная сеть" -DisplayName "IP версии 6 (TCP/IPv6)" | Set-NetAdapterBinding -Enabled $false отключить IPv6 на адаптере

TCPSetting

Get-NetTCPSetting
Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -CongestionProvider DCTCP
Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -CwndRestart True
Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -ForceWS Disabled

netstat

netstat -anop tcp -n/-f/-b
Get-NetTCPConnection -State Established,Listen | ? LocalPort -Match 3389
Get-NetTCPConnection -State Established,Listen | ? RemotePort -Match 22
Get-NetUDPEndpoint | ? LocalPort -Match 514 netstat -ap udp`

Statistics

netstat -se
Get-NetAdapterStatistics

hostname

$env:computername
hostname.exe
(Get-CIMInstance CIM_ComputerSystem).Name
(New-Object -ComObject WScript.Network).ComputerName
[System.Environment]::MachineName
[System.Net.Dns]::GetHostName()

arp

ipconfig /all | Select-String "физ" grep
Get-NetNeighbor -AddressFamily IPv4

function Get-ARP {
Param (
$proxy,
$search
)
if (!$proxy) {
$arp = arp -a
}
if ($proxy) {
$arp = icm $proxy {arp -a}
}
$mac = $arp[3..260]
$mac = $mac -replace "^\s\s"
$mac = $mac -replace "\s{1,50}"," "
$mac_coll = New-Object System.Collections.Generic.List[System.Object]
foreach ($m in $mac) {
$smac = $m -split " "
$mac_coll.Add([PSCustomObject]@{
IP = $smac[0];
MAC = $smac[1];
Type = $smac[2]
})
}
if ($search) {
if ($search -NotMatch "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}") {
#$ns = nslookup $search
#$ns = $ns[-2]
#$global:ns = $ns -replace "Address:\s{1,10}"
$rdns = Resolve-DnsName $search -ErrorAction Ignore
$ns = $rdns.IPAddress
if ($ns -eq $null) {
return
}
} else {
$ns = $search
}
$mac_coll = $mac_coll | ? ip -Match $ns
}
$mac_coll
}

Get-ARP -search 192.168.3.100
Get-ARP -search 192.168.3.100 -proxy dc-01

Firewall

$days = 5
$obj = @()
$fw = Get-WinEvent "Microsoft-Windows-Windows Firewall With Advanced Security/Firewall"
foreach ($temp_fw in $fw) {
if ($temp_fw.id -eq 2097) { # 2004
    $type = "Added Rule"
}
elseif ($temp_fw.id -eq 2006) {
    $type = "Deleted Rule"
}
$port = $temp_fw.Properties[7] | select -ExpandProperty value
$name = $temp_fw.Properties[1] | select -ExpandProperty value
$obj += [PSCustomObject]@{
    Time = $temp_fw.TimeCreated;
    Type = $type;
    Port = $port;
    Name = $name}
}
$obj | Where-Object time -gt (Get-Date).AddDays(-$days)

New-NetFirewallRule -Profile Any -DisplayName "Open Port 135 RPC" -Direction Inbound -Protocol TCP -LocalPort 135 открыть in-порт
Get-NetFirewallRule | where DisplayName -match kms | select * найти правило по имени
Get-NetFirewallPortFilter | where LocalPort -like 80 найти действующие правило по номеру порта

Get-NetFirewallRule -Enabled True -Direction Inbound | select -Property DisplayName,
@{Name='Protocol';Expression={($_ | Get-NetFirewallPortFilter).Protocol}},
@{Name='LocalPort';Expression={($_ | Get-NetFirewallPortFilter).LocalPort}},
@{Name='RemotePort';Expression={($_ | Get-NetFirewallPortFilter).RemotePort}},
@{Name='RemoteAddress';Expression={($_ | Get-NetFirewallAddressFilter).RemoteAddress}},
Enabled,Profile

Firewall-Manager

Install-Module Firewall-Manager
Export-FirewallRules -Name * -CSVFile $home\documents\fw.csv -Inbound -Outbound -Enabled -Disabled -Allow -Block (фильтр правил для экспорта)
Import-FirewallRules -CSVFile $home\documents\fw.csv

RDP

Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "PortNumber" отобразить номер текущего RDP порта
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "PortNumber" -Value "3390" изменить RDP-порт
$(Get-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server\" -Name "fDenyTSConnections").fDenyTSConnections если 0, то включен
Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server\" -Name "fDenyTSConnections" -Value 0 включить RDP
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
(gcim -Class Win32_TerminalServiceSetting -Namespace root\CIMV2\TerminalServices).SetAllowTSConnections(0) включить RDP (для Windows Server)
Get-Service TermService | Restart-Service -Force перезапустить rdp-службу
New-NetFirewallRule -Profile Any -DisplayName "RDP 3390" -Direction Inbound -Protocol TCP -LocalPort 3390 открыть RDP-порт

IPBan

auditpol /get /category:* отобразить все политики аудита
auditpol /get /category:Вход/выход отобразить локальные политики аудита для Входа и Выхода из системы
auditpol /set /subcategory:"Вход в систему" /success:enable /failure:enable включить локальные политики - Аудит входа в систему
auditpol /set /subcategory:"Выход из системы" /success:enable /failure:enable

$url = $($(Invoke-RestMethod https://api.github.com/repos/DigitalRuby/IPBan/releases/latest).assets | Where-Object name -match ".+win.+x64.+").browser_download_url получить ссылку для загрузки последней версии
$version = $(Invoke-RestMethod https://api.github.com/repos/DigitalRuby/IPBan/releases/latest).tag_name получить номер последней версии
$path = "$home\Documents\ipban-$version" путь для установки
Invoke-RestMethod $url -OutFile "$home\Downloads\IPBan-$version.zip" скачать дистрибутив
Expand-Archive "$home\Downloads\ipban-$version.zip" -DestinationPath $path разархивировать в путь для установки
Remove-Item "$home\Downloads\ipban-$version.zip" удалить дистрибутив
sc create IPBan type=own start=delayed-auto binPath="$path\DigitalRuby.IPBan.exe" DisplayName=IPBan создать службу
Get-Service IPBan статус службы
$conf = $(Get-Content "$path\ipban.config") читаем конфигурацию
$conf = $conf -replace '<add key="Whitelist" value=""/>','<add key="Whitelist" value="192.168.3.0/24"/>' добавить в белый лист домашнюю сеть для исключения
$conf = $conf -replace '<add key="ProcessInternalIPAddresses" value="false"/>','<add key="ProcessInternalIPAddresses" value="true"/>' включить обработку локальных (внутренних) ip-адресов
$conf = $conf -replace '<add key="FailedLoginAttemptsBeforeBanUserNameWhitelist" value="20"/>','<add key="FailedLoginAttemptsBeforeBanUserNameWhitelist" value="5"/>' указать количество попыток подключения до блокировки
$conf = $conf -replace '<add key="ExpireTime" value="01:00:00:00"/>','<add key="ExpireTime" value="00:01:00:00"/>' задать время блокировки 1 час
$conf > "$path\ipban.config" обновить конфигурацию
Get-Service IPBan | Start-Service запустить службу

Get-NetFirewallRule | Where-Object DisplayName -Match "IPBan" | ForEach-Object {
    $Name = $_.DisplayName
    Get-NetFirewallAddressFilter -AssociatedNetFirewallRule $_ | Select-Object @{Name="Name"; Expression={$Name}},LocalIP,RemoteIP
} # отобразить область применения правил Брандмауэра для IPBan

Get-Content -Wait "$path\logfile.txt" читать лог
Get-Service IPBan | Stop-Service остановить службу
sc delete IPBan удалить службу

SMTP

function Send-SMTP {
param (
[Parameter(Mandatory = $True)]$mess
)
$srv_smtp = "smtp.yandex.ru" 
$port = "587"
$from = "login1@yandex.ru" 
$to = "login2@yandex.ru" 
$user = "login1"
$pass = "password"
$subject = "Service status on Host: $hostname"
$Message = New-Object System.Net.Mail.MailMessage
$Message.From = $from
$Message.To.Add($to) 
$Message.Subject = $subject 
$Message.IsBodyHTML = $true 
$Message.Body = "<h1> $mess </h1>"
$smtp = New-Object Net.Mail.SmtpClient($srv_smtp, $port)
$smtp.EnableSSL = $true 
$smtp.Credentials = New-Object System.Net.NetworkCredential($user, $pass);
$smtp.Send($Message) 
}

Send-SMTP $(Get-Service)

SNMP

Setup SNMP Service

Install-WindowsFeature SNMP-Service,SNMP-WMI-Provider -IncludeManagementTools установить роль SNMP и WMI провайдер через Server Manager
Get-WindowsFeature SNMP*
Add-WindowsCapability -Online -Name SNMP.Client~~~~0.0.1.0 установить компонент Feature On Demand для Windows 10/11Get-Service SNMPGet-NetFirewallrule -DisplayName snmp | ftGet-NetFirewallrule -DisplayName snmp* | Enable-NetFirewallRule`

Setting SNMP Service via Regedit

Agent:
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\RFC1156Agent" -Name "sysContact" -Value "lifailon-user" создать (New) или изменить (Set)
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\RFC1156Agent" -Name "sysLocation" -Value "plex-server"

Security:
New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\services\SNMP\Parameters\TrapConfiguration\public" создать новый community string
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\ValidCommunities" -Name "public" -Value 16 назначить права на public
1 — NONE
2 — NOTIFY позволяет получать SNMP ловушки
4 — READ ONLY позволяет получать данные с устройства
8 — READ WRITE позволяет получать данные и изменять конфигурацию устройства
16 — READ CREATE позволяет читать данные, изменять и создавать объекты
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\PermittedManagers" -Name "1" -Value "192.168.3.99" от кого разрешено принимать запросы
Get-Service SNMP | Restart-Service

snmpwalk

snmpwalk -v 2c -c public 192.168.3.100
snmpwalk -v 2c -c public -O e 192.168.3.100

SNMP Modules

Install-Module -Name SNMP
Get-SnmpData -IP 192.168.3.100 -OID 1.3.6.1.2.1.1.4.0 -UDPport 161 -Community public
(Get-SnmpData -IP 192.168.3.100 -OID 1.3.6.1.2.1.1.4.0).Data
Invoke-SnmpWalk -IP 192.168.3.100 -OID 1.3.6.1.2.1.1 пройтись по дереву OID
Invoke-SnmpWalk -IP 192.168.3.100 -OID 1.3.6.1.2.1.25.6.3.1.2 список установленного ПО
Invoke-SnmpWalk -IP 192.168.3.100 -OID 1.3.6.1.2.1.25.2.3.1 список разделов и памяти (C: D: Virtual Memory и Physical Memory)
Set-SnmpData изменение данных на удаленном устройстве

Install-Module -Name SNMPv3
Invoke-SNMPv3Get получение данных по одному OID
Invoke-SNMPv3Set изменение данных
Invoke-SNMPv3Walk обход по дереву OID
Invoke-SNMPv3Walk -UserName lifailon -Target 192.168.3.100 -AuthSecret password -PrivSecret password -OID 1.3.6.1.2.1.1 -AuthType MD5 -PrivType AES128

Lextm.SharpSnmpLib

Синтаксис
Download lib

Add-Type -LiteralPath "$home\Desktop\lextm.sharpsnmplib-12.5.2\net471\SharpSnmpLib.dll"

$port = 161
$OID = "1.3.6.1.2.1.1.4.0"
$variableList = New-Object Collections.Generic.List[Lextm.SharpSnmpLib.Variable]
$variableList.Add([Lextm.SharpSnmpLib.Variable]::new([Lextm.SharpSnmpLib.ObjectIdentifier]::new($OID)))
$timeout = 3000
[Net.IPAddress]$ip = "192.168.3.100"
$endpoint = New-Object Net.IpEndPoint $ip, $port
$Community = "public"
[Lextm.SharpSnmpLib.VersionCode]$Version = "V2"

$message = [Lextm.SharpSnmpLib.Messaging.Messenger]::Get(
$Version,
$endpoint,
$Community,
$variableList,
$TimeOut
)
$message.Data.ToString()

Walk

[Lextm.SharpSnmpLib.ObjectIdentifier]$OID = "1.3.6.1.2.1.1" # дерево или конечный OID
$WalkMode = [Lextm.SharpSnmpLib.Messaging.WalkMode]::WithinSubtree # режим обхода по дереву
$results = New-Object Collections.Generic.List[Lextm.SharpSnmpLib.Variable]
$message = [Lextm.SharpSnmpLib.Messaging.Messenger]::Walk(
  $Version,
  $endpoint,
  $Community,
  $OID,
  $results,
  $TimeOut,
  $WalkMode
)
$results

$results2 = @()
foreach ($d in $results) {
$results2 +=[PSCustomObject]@{'ID'=$d.id.ToString();'Data'=$d.Data.ToString()} # перекодировать вывод построчно в строку
}
$results2

pki

New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName "$env:computername" -FriendlyName "Test Certificate" -NotAfter (Get-Date).AddYears(5) создать самоподписанный сертификат (в LocalMachine\My - Сертификаты компьютера\Личное) с сроком действия 5 лет

Get-ChildItem -Path Cert:\CurrentUser\Root\ список всех установленных сертификатов в хранилище Доверенные корневые ЦС Текущего пользователя
Get-ChildItem -Path Cert:\CurrentUser\My\ список самозаверяющих сертификатов в Личное хранилище Текущего пользователя
Get-ChildItem -Path Cert:\LocalMachine\My\ список самозаверяющих сертификатов в Личное хранилище Локального компьютера
Get-ChildItem -Path Cert:\LocalMachine\My\ | select NotBefore,NotAfter,Thumbprint,Subject срок действия сертификата
Get-ChildItem -Path Cert:\LocalMachine\My\ | where Thumbprint -eq D9356FB774EE0E6206B7D5B59B99102CA5B17BDA поиск сертификат по отпечатку

Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificates\My\Certificates\ сертификаты в файловой системе, каждый файл соответствует сертификату, установленному в личном хранилище текущего пользователя
Get-ChildItem -Path $env:APPDATA\Microsoft\SystemCertificates\My\Keys\ ссылки на объекты закрытых ключей, созданных поставщиком хранилища ключей (KSP)
Get-ChildItem -Path HKCU:\Software\Microsoft\SystemCertificates\CA\Certificates | ft -AutoSize список сертификатов в реестре вошедшего в систему пользователя

$cert = (Get-ChildItem -Path Cert:\CurrentUser\My\)[1] выбрать сертификат
$cert | Remove-Item удалить сертификат

Export-Certificate -FilePath $home\Desktop\certificate.cer -Cert $cert экспортировать сертификат
$cert.HasPrivateKey проверить наличие закрытого ключа
$pass = "password" | ConvertTo-SecureString -AsPlainText -Force создать пароль для шифрования закрытого ключа
Export-PfxCertificate -FilePath $home\Desktop\certificate.pfx -Password $pass -Cert $certificate экспортировать сертификат с закрытым ключем

Import-Certificate -FilePath $home\Desktop\certificate.cer -CertStoreLocation Cert:\CurrentUser\My импортировать сертификат
Import-PfxCertificate -Exportable -Password $pass -CertStoreLocation Cert:\CurrentUser\My -FilePath $home\Desktop\certificate.pfx

OpenSSL

Invoke-WebRequest -Uri https://slproweb.com/download/Win64OpenSSL_Light-3_1_1.msi -OutFile $home\Downloads\OpenSSL-Light-3.1.1.msi
Start-Process $home\Downloads\OpenSSL-Light-3.1.1.msi -ArgumentList '/quiet' -Wait` установить msi пакет в тихом режиме (запуск от имени Администратора)
rm $home\Downloads\OpenSSL-Light-3.1.1.msi
cd "C:\Program Files\OpenSSL-Win64\bin"
  • Изменить пароль для PFX
    openssl pkcs12 -in "C:\Cert\domain.ru.pfx" -out "C:\Cert\domain.ru.pem" -nodes экспортируем имеющийся сертификат и закрытый ключ в .pem-файл без пароля с указанием текущего пароля
    openssl pkcs12 -export -in "C:\Cert\domain.ru.pem" -out "C:\Cert\domain.ru_password.pfx" -nodes конвертируем .pem обратно в .pfx c указанием нового пароля

  • Конвертация из закрытого и открытого ключа PEM в PFX
    openssl pkcs12 -export -in "C:\tmp\vpn\vpn.itproblog.ru-crt.pem" -inkey "C:\tmp\vpn\vpn.itproblog.ru-key.pem" -out "C:\tmp\vpn\vpn.iiproblog.ru.pfx"
    in – путь до файла с открытым ключом
    inkey – путь до файла с закрытым ключом
    out – путь до файла, в который будет конвертирован сертификат (pfx)

  • Конвертация PFX в CRT
    openssl pkcs12 -in "C:\OpenSSL-Win64\bin\_.domain.ru.pfx" -clcerts -out "C:\OpenSSL-Win64\bin\_.domain.ru.crt" указывается текущий и 2 раза новый пароль PEM pass phrase (файл содержит EGIN CERTIFICATE и BEGIN ENCRYPTED PRIVATE KEY)
    openssl pkcs12 -in "C:\OpenSSL-Win64\bin\_.domain.ru.pfx" -clcerts -nokeys -out "C:\OpenSSL-Win64\bin\_.domain.ru.crt" без ключа, получить открытую часть (файл содержит только EGIN CERTIFICATE)

  • Конвертация PFX в KEY
    openssl pkcs12 -in "C:\OpenSSL-Win64\bin\_.domain.ru.pfx" -nocerts -out "C:\OpenSSL-Win64\bin\_.domain.ru.key" файл содержит только BEGIN ENCRYPTED PRIVATE KEY

  • Снять пароль к закрытого ключа .key
    openssl rsa -in "C:\OpenSSL-Win64\bin\_.domain.ru.key" -out "C:\OpenSSL-Win64\bin\_.domain.ru-decrypted.key"

  • CRT и KEY в PFX:
    openssl pkcs12 -inkey certificate.key -in certificate.crt -export -out certificate.pfx

OpenVPN

Invoke-WebRequest -Uri https://swupdate.openvpn.org/community/releases/OpenVPN-2.6.5-I001-amd64.msi -OutFile $home\Downloads\OpenVPN-2.6.5.msi
Start-Process $home\Downloads\OpenVPN-2.6.5.msi -ArgumentList '/quiet /SELECT_OPENSSL_UTILITIES=1' -Wait
msiexec /i $home\Downloads\OpenVPN-2.6.5.msi ADDLOCAL=EasyRSA /passive /quiet # установить отдельный компонент EasyRSA Certificate Management Scripts
# msiexec /i $home\Downloads\OpenVPN-2.6.5.msi ADDLOCAL=OpenVPN.Service,Drivers,Drivers.Wintun,OpenVPN,OpenVPN.GUI,OpenVPN.GUI.OnLogon,EasyRSA /passive выборочная установка
# Invoke-WebRequest -Uri https://github.com/OpenVPN/easy-rsa/releases/download/v3.1.5/EasyRSA-3.1.5-win64.zip -OutFile $home\Downloads\EasyRSA-3.1.5.zip скачать отдельный пакет EasyRSA
rm $home\Downloads\OpenVPN-2.6.5.msi

cd "C:\Program Files\OpenVPN\easy-rsa"
Copy-Item vars.example vars файл конфигурации для EasyRSA

set_var EASYRSA_TEMP_DIR "$EASYRSA_PKI"
set_var EASYRSA_REQ_COUNTRY "RU"
set_var EASYRSA_REQ_PROVINCE "MSK"
set_var EASYRSA_REQ_CITY "MSK"
set_var EASYRSA_REQ_ORG "FAILON.NET"
set_var EASYRSA_REQ_EMAIL "lifailon@domain.ru"
set_var EASYRSA_REQ_OU "IT"
#set_var EASYRSA_KEY_SIZE 2048
#set_var EASYRSA_CA_EXPIRE 3650
#set_var EASYRSA_CERT_EXPIRE 825

.\EasyRSA-Start.bat среда EasyRSA Shell
easyrsa init-pki инициализация PKI, создает директорию: C:\Program Files\OpenVPN\easy-rsa\pki и читает переменные файла \easy-rsa\vars
easyrsa build-ca генерация корневого CA с указанием пароля и произвольное имя сервера (\pki\ca.crt и \pki\private\ca.key)
easyrsa gen-req server nopass генерация запроса сертификата и ключ для сервера OpenVPN - yes (\pki\reqs\server.req и \pki\private\server.key)
easyrsa sign-req server server подписать запрос на выпуск сертификата сервера с помощью CA - yes (\pki\issued\server.crt)
easyrsa gen-dh создать ключ Диффи-Хеллмана (\pki\dh.pem)
easyrsa gen-req client1 nopassгенерация запроса сертификата и ключ для клиента OpenVPN (\pki\reqs\client1.req и \pki\private\client1.key)
easyrsa sign-req client client1 подписать запрос на выпуск сертификата клиента с помощью CA - yes (\pki\issued\client1.crt)
easyrsa revoke client1 отозвать сертификат пользователя
openssl rsa -in "C:\Program Files\OpenVPN\easy-rsa\pki\private\client1.key" -out "C:\Program Files\OpenVPN\easy-rsa\pki\private\client1_nopass.key" снять защиту паролем для ключа (BEGIN ENCRYPTED PRIVATE KEY -> BEGIN PRIVATE KEY)
exit
cd "C:\Program Files\OpenVPN\bin"
.\openvpn --genkey secret ta.key генерация ключа tls-auth (\bin\ta.key)
Move-Item "C:\Program Files\OpenVPN\bin\ta.key" "C:\Program Files\OpenVPN\easy-rsa\pki\"

server.ovpn

# Copy-Item "C:\Program Files\OpenVPN\sample-config\server.ovpn" "C:\Program Files\OpenVPN\config-auto\server.ovpn"
New-Item -ItemType File -Path "C:\Program Files\OpenVPN\config-auto\server.ovpn"

port 1194
proto udp
# Что именно инкапсулировать в туннеле (ethernet фреймы - tap или ip пакеты - tun)
dev tun
ca "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\ca.crt"
cert "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\issued\\server.crt"
key "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\private\\server.key"
dh "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\dh.pem"
server 192.168.4.0 255.255.255.0
# Хранит список сопоставления ip для клиентов, что бы назначить тот же адрес при перезапуске сервера
# ifconfig-pool-persist "C:\\Program Files\\OpenVPN\\dhcp-client-list.txt"
# Разрешить клиентам подключаться под одним ключом
# duplicate-cn
# max-clients 30
# Разрешить обмен трафиком между клиентами
client-to-client
# compress
tls-auth "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\ta.key" 0
cipher AES-256-GCM
keepalive 20 60
# Не перечитавать файлы ключей при перезапуске туннеля
persist-key
# Оставляет без изменения устройства tun/tap при перезапуске OpenVPN
persist-tun
status "C:\\Program Files\\OpenVPN\\log\\status.log"
log "C:\\Program Files\\OpenVPN\\log\\openvpn.log"
verb 3
mute 20
windows-driver wintun
# Открыть доступ к подсети за сервером
push "route 192.168.3.0 255.255.255.0"
push "route 192.168.4.0 255.255.255.0"
# Завернуть все запросы клиента (в том числе Интернет трафик) на OpenVPN сервер
# push "redirect-gateway def1"
# push "dhcp-option DNS 192.168.3.101"
# push "dhcp-option DOMAIN failon.net"

New-NetFirewallRule -DisplayName "AllowOpenVPN-In" -Direction Inbound -Protocol UDP –LocalPort 1194 -Action Allow на сервере
New-NetFirewallRule -DisplayName "AllowOpenVPN-Out" -Direction Outbound -Protocol UDP –LocalPort 1194 -Action Allow на клиенте
Get-Service *openvpn* | Restart-Service

client.ovpn

# Copy-Item "C:\Program Files\OpenVPN\sample-config\client.ovpn" "C:\Program Files\OpenVPN\config-auto\client.ovpn"
New-Item -ItemType File -Path "C:\Program Files\OpenVPN\config-auto\client.ovpn"

client
dev tun
proto udp
remote 26.115.154.67 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-GCM
connect-retry-max 25
# Использовать драйвер wintun и полный путь до сертификатов при использовании openvpn gui
windows-driver wintun
verb 3

Client

iwr -Uri https://openvpn.net/downloads/openvpn-connect-v3-windows.msi -OutFile "$home\downloads\OpenVPN-Connect-3.msi"
Передать конфигурацию и ключи:
client.ovpn
ca.crt
dh.pem
ta.key
client1.crt
client1.key

Route

Get-Service RemoteAccess | Stop-Service
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" -Name "IPEnableRouter" -Value 1 включает IP маршрутизацию
(Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters").IPEnableRouter
Get-NetIPInterface | select ifIndex,InterfaceAlias,AddressFamily,ConnectionState,Forwarding | ft отобразить сетевые интерфейсы
Set-NetIPInterface -ifIndex 13 -Forwarding Enabled включить переадресацию на интерфейсе

sysctl net.ipv4.ip_forward=1
echo "sysctl net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

Get-NetRoute
New-NetRoute -DestinationPrefix "192.168.3.0/24" -NextHop "192.168.4.1" -InterfaceIndex 8
route -p add 192.168.3.0 mask 255.255.255.0 192.168.4.1 metric 1
route -p change 192.168.3.0 mask 255.255.255.0 192.168.4.1 metric 2
route -p add 192.168.3.0 mask 255.255.255.0 192.168.4.1 metric 1 if 7 указать номер сетевого интерфейса на который необходимо посылать пакет (Wintun Userspace Tunnel)
route print -4
route delete 192.168.3.0

tracert 192.168.3.101 с 192.168.4.6

1    17 ms     *       22 ms  192.168.4.1
2    12 ms    13 ms    14 ms  192.168.3.101

route add -net 192.168.4.0 netmask 255.255.255.0 gw 192.168.3.100
route -e

traceroute 192.168.4.6 с 192.168.3.101

1  192.168.3.100 (192.168.3.100)  0.148 ms  0.110 ms  0.106 ms
2  192.168.4.6 (192.168.4.6)  14.573 ms * *

ping 192.168.3.101 -t с 192.168.4.6
tcpdump -n -i ens33 icmp на 192.168.3.101

14:36:34.533771 IP 192.168.4.6 > 192.168.3.101: ICMP echo request, id 1, seq 2962, length 40 # отправил запрос
14:36:34.533806 IP 192.168.3.101 > 192.168.4.6: ICMP echo reply, id 1, seq 2962, length 40 # отправил ответ

NAT

Get-Command -Module NetNat
New-NetNat -Name LocalNat -InternalIPInterfaceAddressPrefix "192.168.3.0/24"
Add-NetNatStaticMapping -NatName LocalNat -Protocol TCP -ExternalIPAddress 0.0.0.0 -ExternalPort 80 -InternalIPAddress 192.168.3.102 -InternalPort 80
Remove-NetNatStaticMapping -StaticMappingID 0
Remove-NetNat -Name LocalNat

WireGuard

Invoke-WebRequest "https://download.wireguard.com/windows-client/wireguard-amd64-0.5.3.msi" -OutFile "$home\Downloads\WireGuard-Client-0.5.3.msi"
msiexec.exe /i "$home\Downloads\WireGuard-Client-0.5.3.msi" DO_NOT_LAUNCH=1 /qn
Invoke-WebRequest "http://www.wiresock.net/downloads/wiresock-vpn-gateway-x64-1.1.4.1.msi" -OutFile "$home\Downloads\WireSock-VPN-Gateway-1.1.4.1.msi"
msiexec.exe /i "http://www.wiresock.net/downloads/wiresock-vpn-gateway-x64-1.1.4.1.msi" /qn
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
wg-quick-config -add -start
26.115.154.67:8181
192.168.21.4/24
Successfully saved client configuration: C:\ProgramData\NT KERNEL\WireSock VPN Gateway\wsclient_1.conf
Successfully saved server configuration: C:\ProgramData\NT KERNEL\WireSock VPN Gateway\wiresock.conf
get-service *wire*
wg show
wg-quick-config -add -restart add client

wiresock.conf

[Interface]
PrivateKey = gCHC0g2JPwr6sXPiaOL4/KTkMyjN9TculrJUA/GORV8=
Address = 192.168.21.5/24
ListenPort = 8181

[Peer]
PublicKey = NoSxjew2RCHiUzI6mlahjd4I+0EcLsoYom/H01z91yU=
AllowedIPs = 192.168.21.6/32

wsclient_1.conf (добавить маршруты для клиента в AllowedIPs)

[Interface]
PrivateKey = yIpRQRmaGrrk9Y+49E8JhEpFmKzSeecvUAdeNgf1hUM=
Address = 192.168.21.6/24
DNS = 8.8.8.8, 1.1.1.1
MTU = 1420

[Peer]
PublicKey = Fp7674VSYeGj8CYt6RCKR7Qz1y/IKUXCw8ImOFhX3hk=
AllowedIPs = 192.168.21.0/24, 192.168.3.0/24
Endpoint = 26.115.154.67:8181
PersistentKeepalive = 25

VpnClient

Get-Command -Module VpnClient
Add-VpnConnection -Name "vpn-failon" -ServerAddress "26.115.154.67" -TunnelType L2TP -L2tpPsk "123098" -EncryptionLevel "Required" -AuthenticationMethod MSChapv2 -RememberCredential -AllUserConnection –PassThru -Force
-TunnelType PPTP/L2TP/SSTP/IKEv2/Automatic
-L2tpPsk использовать общий ключ для аутентификации (без параметра, для L2TP аутентификации используется сертификат)
-AuthenticationMethod Pap/Chap/MSChapv2/Eap/MachineCertificate
-EncryptionLevel NoEncryption/Optional/Required/Maximum/Custom
-SplitTunneling заворачивать весь трафик через VPN-туннель (включение Use default gateway on remote network в настройках параметра VPN адаптера)
-UseWinlogonCredential использовать учетные данные текущего пользователя для аутентификации на VPN сервере
-RememberCredential разрешить сохранять учетные данные для VPN подключения (учетная запись и пароль сохраняются в диспетчер учетных данных Windows после первого успешного подключения)
-DnsSuffix domain.local
-AllUserConnection разрешить использовать VPN подключение для всех пользователей компьютера (сохраняется в конфигурационный файл: C:\ProgramData\Microsoft\Network\Connections\Pbk\rasphone.pbk)

Install-Module -Name VPNCredentialsHelper модуль для сохранения логина и пароля в Windows Credential Manager для VPN подключения
Set-VpnConnectionUsernamePassword -connectionname vpn-failon -username user1 -password password

rasdial "vpn-failon" подключиться
Get-VpnConnection -AllUserConnection | select * список VPN подключения, доступных для всех пользователей, найстройки и текущий статус подключения (ConnectionStatus)
Add-VpnConnectionRoute -ConnectionName vpn-failon -DestinationPrefix 192.168.3.0/24 –PassThru динамически добавить в таблицу маршрутизации маршрут, который будет активен при подключении к VPN
Remove-VpnConnection -Name vpn-failon -AllUserConnection -Force удалить

Set-VpnConnection -Name "vpn-failon" -SplitTunneling $True включить раздельное тунеллирование
Add-VpnConnectionRoute -ConnectionName "vpn-failon" -DestinationPrefix 172.22.22.0/24 настроить маршрутизацию к указанной подсети через VPN-соединение
(Get-VpnConnection -ConnectionName "vpn-failon").routes отобразить таблицу маршрутизации для указанного соединения
Remove-VpnConnectionRoute -ConnectionName "vpn-failon" -DestinationPrefix "172.22.23.0/24"

Proxy

$user = "lifailon"
$pass = "Proxy"
$SecureString = ConvertTo-SecureString $pass -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential($user, $SecureString)
[System.Net.Http.HttpClient]::DefaultProxy = New-Object System.Net.WebProxy("http://192.168.3.100:9090")
[System.Net.Http.HttpClient]::DefaultProxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials
[System.Net.Http.HttpClient]::DefaultProxy.Credentials = $Credential
Invoke-RestMethod http://ifconfig.me/ip
Invoke-RestMethod https://kinozal.tv/rss.xml

netsh

Proxy

netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=80 connectaddress=192.168.3.108
netsh interface portproxy show all
netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=0.0.0.0

Wlan

netsh wlan show profile список сохраненны профилей Wi-Fi и паролей
netsh wlan show interfaces хар-ки текущей сети (MAC, speed)
netsh wlan show profile SSID-Name-Network key=clear очистить пароль
netsh wlan show networks список видемых сетей
netsh wlan disconnect отключиться от Wi-Fi
netsh wlan connect name="SSID-Name-Network" подключиться
netsh wlan show drivers драйвер Wi-Fi
netsh wlan set hostednetwork mode=allow ssid="WiFi-Test" key="password" создание точки доступа Wi-Fi (SoftAP)

Firewall

netsh advfirewall set allprofiles state off отключить fw
netsh advfirewall reset сбросить настройки
netsh advfirewall firewall add rule name="Open Remote Desktop" protocol=TCP dir=in localport=3389 action=allow открыть порт 3389
netsh advfirewall firewall add rule name="All ICMP V4" dir=in action=allow protocol=icmpv4 открыть icmp

OpenSSH

Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Client*'
Add-WindowsCapability -Online -Name OpenSSH.Client*
dism /Online /Add-Capability /CapabilityName:OpenSSH.Client~~~~0.0.1.0
iwr https://github.com/PowerShell/Win32-OpenSSH/releases/download/v9.2.2.0p1-Beta/OpenSSH-Win64-v9.2.2.0.msi -OutFile $home\Downloads\OpenSSH-Win64-v9.2.2.0.msi скачать
msiexec /i $home\Downloads\OpenSSH-Win64-v9.2.2.0.msi установить msi пакет
Set-Service sshd -StartupType Automatic
Get-NetTCPConnection | where LocalPort -eq 22
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
Get-NetFirewallRule -Name *ssh*
Start-Process notepad++ C:\Programdata\ssh\sshd_config конфигурационный файл
GSSAPIAuthentication yes включить Kerberos аутентификацию (через AD)
SyslogFacility LOCAL0 включить локальное ведение журнала в файл (C:\ProgramData\ssh\logs\sshd.log)
LogLevel INFO
Restart-Service sshd
ssh -K $srv выполнить Kerberos аутентификацию
ssh Lifailon@192.168.3.99 -p 22
pwsh -command Get-Service
ssh -L 3101:192.168.3.101:22 -R 3101:192.168.3.101:22 lifailon@192.168.3.101 -p 22 SSH Tunnel lifailon@localhost:3101 -> 192.168.3.101:3101

WinRM

Enter-PSSession -ComputerName $srv подключиться к PowerShell сессии через PSRemoting. Подключение возможно только по FQDN-имени
Invoke-Command $srv -ScriptBlock {Get-ComputerInfo} выполнение команды через PSRemoting
$session = New-PSSession $srv открыть сессию
Get-PSSession отобразить активные сессии
icm -Session $session {$srv = $using:srv} передать переменную текущей сессии ($using) в удаленную
Disconnect-PSSession $session закрыть сессию
Remove-PSSession $session удалить сессию
Import-Module -Name ActiveDirectory -PSSession $srv импортировать модуль с удаленного компьютера в локальную сессию

Windows Remote Management Configuration

winrm quickconfig -quiet изменит запуск службы WinRM на автоматический, задаст стандартные настройки WinRM и добавить исключения для портов в fw
Enable-PSRemoting –Force включить PowerShell Remoting, работает только для доменного и частного сетевых профилей Windows
Enable-PSRemoting -SkipNetworkProfileCheck -Force для настройки компьютера в общей (public) сети (работает с версии powershell 6)

$NetProfiles = Get-NetConnectionProfile отобразить профили сетевых подключений
Set-NetConnectionProfile -InterfaceIndex $NetProfiles[1].InterfaceIndex -NetworkCategory Private изменить тип сети для профиля (DomainAuthenticated/Public)
(Get-CimInstance -ClassName Win32_ComputerSystem).PartOfDomain проверить, что компьютер добавлен в домен AD
Get-Service WinRM | Set-Service -StartupType AutomaticDelayedStart отложенный запуск
Get-Service -Name winrm -RequiredServices статус зависимых служб
New-NetFirewallRule -Profile Any -DisplayName "WinRM HTTP" -Direction Inbound -Protocol TCP -LocalPort 5985,5986
Test-NetConnection $srv -port 5895 проверить порт
Test-WSMan $srv -ErrorAction Ignore проверить работу WinRM на удаленном компьютере (игнорировать вывод ошибок для скрипта) или локально (localhost)

$Cert = New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName "$env:computername" -FriendlyName "WinRM HTTPS Certificate" -NotAfter (Get-Date).AddYears(5) создать самоподписанный сертификат
$Thumbprint = $Cert.Thumbprint забрать отпечаток
New-Item -Path WSMan:\Localhost\Listener -Transport HTTPS -Address * -CertificateThumbprint $Thumbprint -Name WinRM_HTTPS_Listener -Force создать прослушиватель
New-NetFirewallRule -DisplayName 'WinRM HTTPS' -Profile Domain,Private -Direction Inbound -Action Allow -Protocol TCP -LocalPort 5986 открыть порт в fw

$selector_set = @{
    Address = "*"
    Transport = "HTTPS"
}
$value_set = @{
    CertificateThumbprint = "66ABFDA044D8C85135048186E2FDC0DBE6125163"
}
New-WSManInstance -ResourceURI "winrm/config/Listener" -SelectorSet $selector_set -ValueSet $value_set

winrm get winrm/config отобразить всю конфигурацию (Client/Service)
winrm get winrm/config/service/auth конфигурация авторизации на сервере
winrm enumerate winrm/config/listener текущая конфигурация прослушивателей WinRM (отображает отпечаток сертификата для HTTPS 5986)
Get-ChildItem -Path Cert:\LocalMachine\My\ | where Thumbprint -eq D9356FB774EE0E6206B7D5B59B99102CA5B17BDA | select * информация о сертификате

ls WSMan:\localhost\Client конфигурацию клиента
ls WSMan:\localhost\Service конфигурация сервера
ls WSMan:\localhost\Service\auth список всех конфигураций аутентификации WinRM сервера
Set-Item -path WSMan:\localhost\Service\auth\basic -value $true разрешить локальную аутентификацию к текущему серверу
ls HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN настройки в реестре (например, для включения аудентификации в \Service\auth_basic = 1)
Set-Item WSMan:\localhost\Client\TrustedHosts -Value 192.168.* -Force добавить доверенные хосты в конфигурацию на клиенте, чтобы работала Negotiate аутентификация через NTLM
Set-Item WSMan:\localhost\Client\TrustedHosts -Value 192.168.3.100 -Concatenate -Force добавить второй компьютер
ls WSMan:\localhost\Client\TrustedHosts
Set-Item WSMan:\localhost\Client\AllowUnencrypted $true включить передача незашифрованных данных конфигурации клиента
Set-Item WSMan:\localhost\Service\AllowUnencrypted $true включить передача незашифрованных данных конфигурации сервера (необходимо быть в private сети)

Get-PSSessionConfiguration проверить, включен ли PSremoting и вывести список пользователей и групп, которым разрешено подключаться через WinRM
Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI назначить права доступа через дескриптор безопасности текущей сессии (до перезагруки)
(Get-PSSessionConfiguration -Name "Microsoft.PowerShell").SecurityDescriptorSDDL получить настройки дескриптора в формате SDDL
Set-PSSessionConfiguration -Name Microsoft.PowerShell -SecurityDescriptorSDDL $SDDL применить настройки дескриптора на другом компьютере без использования GUI

New-LocalUser "WinRM-Writer" -Password (ConvertTo-SecureString -AsPlainText "123098") создать пользователя
Add-LocalGroupMember -Group "Remote Management Users" -Member "WinRM-Writer" добавить пользователя WinRM-Writer в локальную группу доступа "Пользователи удаленного управления"
cmdkey /add:192.168.3.99 /user:WinRM-Writer /pass:123098 сохранить пароль в CredentialManager
cmdkey /list
Import-Module CredentialManager
Add-Type -AssemblyName System.Web
New-StoredCredential -Target 192.168.3.99 -UserName WinRM-Writer -Password 123098 -Comment WinRM сохранить пароль в CredentialManager (из PS5)
Get-StoredCredential -AsCredentialObject
$cred = Get-StoredCredential -Target 192.168.3.99
Enter-PSSession -ComputerName 192.168.3.99 -Credential $cred -Authentication Negotiate
Enter-PSSession -ComputerName 192.168.3.99 -Credential $cred -Authentication Basic -Port 5985 работает при отключении allowunencrypted на стороне сервера и клиента
winrs -r:http://192.168.3.100:5985/wsman -u:WinRM-Writer -p:123098 ipconfig передать команду через winrs (-?)
winrs -r:https://192.168.3.100:5985/wsman -u:WinRM-Writer -p:123098 -ssl ipconfig через https
pwsh -Command "Install-Module -Name PSWSMan" установить модуль для использования в Linux системе

Kerberos

.\CheckMaxTokenSize.ps1 -Principals login -OSEmulation $true -Details $true узнать размер токена пользователя в домене
Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters | select maxtokensize максимальный размер токена на сервере
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters изменить размера, если заголовок пакета аутентификации превышает 16 Кб (из за большого кол-ва групп)
MaxFieldLength увеличить до 0000ffff (65535)
MaxRequestBytes увеличить до 0000ffff (65535)