Как заблокировать доступ к сайту в Windows с помощью PowerShell
Рассмотрим несколько способов, которые помогут вам запретить доступ к отдельным сайтам, URL и IP адресам в Windows без использования сторонних программ. Обычно блокировку сайтов наиболее эффективно настраивать на уровне сетевого шлюза (роутер, маршрутизатор, Wi-Fi точка доступа, через которую вы выходите в Интернет), или с помощью стороннего ПО (фильтры контента, DNS фильтры и т.д.). В нашем случае мы попробуем заблокировать определенный сайт с помощью встроенных средств Windows 10 и автоматизации PowerShell.
Блокировка сайтов в Windows с помощью файла hosts
Самый известный способ заблокировать определенный сайт в Windows – отредактировать файл hosts. Обычно файл находится в каталоге %windir%system32driversetc. Обратите внимание, что у файла hosts нет расширения.
Файл hosts используется для ручного назначения соответствий между IP адресами и DNS именами. При выполнении разрешении имен файл hosts имеет приоритет над DNS серверами, указанными в настройках сетевых подключений,
Чтобы заблокировать определенный сайт (например, ok.ru), откройте на редактирование файл hosts (с правами администратора) и добавьте в него строки вида:
127.0.0.1 ok.ru
127.0.0.1 www.ok.ru
Сохраните файл и перезагрузите компьютер (или очистите DNS кэш командой:
ipconfig /flushdns
).
После этого при попытке открыть сайт ok.ru в любом браузере будет появляется сообщение “Страница не найдена” / “Страница не доступна”.
Вы можете добавлять новые строки с URL сайтов в файл hosts с помощью такого bat файла:
@echo off
set hostspath=%windir%System32driversetchosts
echo 127.0.0.1 www.facebook.com >> %hostspath%
echo 127.0.0.1 facebook.com >> %hostspath%
exit
Либо можно воспользоваться следующими PowerShell функциями для автоматизации блокировки (разблокировки) определенных сайтов в списке запрещенных доменов в файле hosts.
Function BlockSiteHosts ( [Parameter(Mandatory=$true)]$Url) {
$hosts = 'C:WindowsSystem32driversetchosts'
$is_blocked = Get-Content -Path $hosts |
Select-String -Pattern ([regex]::Escape($Url))
If(-not $is_blocked) {
$hoststr="127.0.0.1 ” + $Url
Add-Content -Path $hosts -Value $hoststr
}
}
Function UnBlockSiteHosts ( [Parameter(Mandatory=$true)]$Url) {
$hosts = 'C:WindowsSystem32driversetchosts'
$is_blocked = Get-Content -Path $hosts |
Select-String -Pattern ([regex]::Escape($Url))
If($is_blocked) {
$newhosts = Get-Content -Path $hosts |
Where-Object {
$_ -notmatch ([regex]::Escape($Url))
}
Set-Content -Path $hosts -Value $newhosts
}
}
Теперь чтобы добавить определенный сайт в заблокированные достаточно выполнить функцию:
BlockSiteHosts ("vk.com")
Чтобы разблокировать сайт запустите:
UnBlockSiteHosts ("vk.com")
Блокировка сайтов через DNS
Если ваши клиенты пользуются одним DNS сервером, вы можете аналогичным образом заблокировать определенный сайты с помощью создания DNS записи в этом DNS, указывающей на 127.0.0.1 (или что-то в таком роде). По такому принципу, кстати, работают большинство коммерческих контент фильтров DNS (OpenDNS, SkyDNS, Яндекс.DNS и т.д.).
Блокируем IP адрес сайта в брандмауэре Windows
Также вы можете заблокировать определенные сайты с помощью встроенного Windows Firewall. Главный недостаток такого метода – вы не сможете использовать имя домена или сайта в правиле блокировке. Брандмауэр Windows в качестве источника/назначения позволяет указать только IP адрес или подсеть.
Сначала нужно определить IP адрес сайта, который вы хотите заблокировать. Проше всего это сделать командой nslookup.
nslookup ok.ru
Как вы видите в результатах команды присутствует несколько IP адресов, которые назначены сайту. Вам нужно заблокировать их все.
Теперь нужно запустить панель настройки Windows Firewall (Панель управления Все элементы панели управленияБрандмауэр Защитника WindowsДополнительные параметры или firewall.cpl).
В секции “Правила для исходящих подключений” создайте новое правило со следующими параметрами:
- Тип правила: Настраиваемые;
- Программа: Все программы;
- Тип протокола: Любой;
- Область: в секции “Укажите удаленные IP адреса, к которым применяется данное правило” выберите пункт “Указанные IP адреса” -> Добавить. В открывшемся окне укажите IP адреса, IP подсети или диапазон IP адресов сайтов, которые нужно заблокировать.
Нажмите OK-> Далее -> Действие: “Блокировать подключение”.
В окне со списком профилей брандмауэра, к которым применяется это правило оставьте все опции. Осталось указать имя правила и сохранить его.
После этого Брандмауэр Защитника Windows будет блокировать все соединения с данным сайтом. В браузере при подключении к заблокированному сайту будет появляться ошибка:
Unable to connect
или
Доступ в Интернет закрыт
Возможно, подключение заблокирована брандмауэром или антивирусным ПО.
ERR_NETWORK_ACCESS_DENIED
В домене AD вы можете распространить на компьютеры пользователей политику блокирующую сайт с помощью GPO. Но еще раз скажем, это нецелесообразно. Фильтровать сайты правильнее на шлюзе доступа в Интернет.
PowerShell: правила блокировки сайтов по имени и IP адресу в брандмауэре Windows
Вы также можете с помощью PowerShell создать правило брандмауэра, блокирующее исходящие подключения к определенному сайту:
New-NetFirewallRule -DisplayName "Block Site" -Direction Outbound –LocalPort Any -Protocol Any -Action Block -RemoteAddress 217.20.147.1, 217.20.141.0/26
Строка “ The rule was parsed successfully from the store” говорит о том, что правило новое правило брандмауэра успешно применено. Вы можете найти его в графическом интерфейсе Windows Firewall.
Чтобы не резолвить имя сайта в IP адреса вручную можно использовать PowerShell командлет Resolve-DnsName для получения IP адресов сайтов.
Resolve-DnsName "ok.ru"| Select-Object -ExpandProperty IPAddress
Таким образом мы можем преобразовать имя домена в IP адреса и сразу добавить запрещающее правило для блокирования доступа к сайту:
$IPAddress = Resolve-DnsName "ok.ru"| Select-Object -ExpandProperty IPAddress
New-NetFirewallRule -DisplayName "Block Site" -Direction Outbound –LocalPort Any -Protocol Any -Action Block -RemoteAddress $IPAddress
Получается, что теперь вы можете добавить запрещающее правило в Windows Firewall сразу для нескольких сайтов:
$SitesToBlock = “lenta.ru”,”mail.ru”,”facebook.com”
$IPAddress = $SitesToBlock | Resolve-DnsName -NoHostsFile | Select-Object -ExpandProperty IPAddress
New-NetFirewallRule -DisplayName "Block Web Sites" -Direction Outbound –LocalPort Any -Protocol Any -Action Block -RemoteAddress $IPAddress
У командлета Resolve-DnsName я добавил параметр –NoHostsFile, чтобы не использовать при проверке файл hosts.
Проверим, что блокирующее правило для исходящего появилось в консоли.
Эта статья прежде всего разминка для ума. В корпоративной сети для ограничения доступа к сайтам нужно использовать фильтрацию на уровне шлюза доступа в интернет или прокси-сервере. Блокировка доступа на уровне хостов не столь эффективна.
Windows Server 2016
Как заблокировать доступ к сайту в Windows с помощью PowerShell