Простой способ закрыть все порты в Windows при помощи Брандмауэра Windows (Windows Firewall) и оставить только нужные
Проблема
Проблема Брандмауэра Windows (Windows Firewall) заключается не в том как закрыть все порты, а в том, как открыть только необходимые. И главное, что сходу хрен поймешь, каким образом ограничить подключение к некоторым портам по IP адресам клиентов. По отдельности решить эти задачи не сложно, но чтобы было вместе - не встретил ни одного толкового руководства, поэтому и написана данная заметка. Так же, найденное решение не предполагает установки стороннего фаервола.
Недостатки Брандмауэра Windows:
- Если создать запрещающее правило для всех портов, а потом разрешающие для необходимых, то они не попадают в белый список, т.к. запрещающие правила приоритетнее разрешающих. Т.е. если запрет на подключение по порту существует, то разрешение на этот порт работать уже не будет.
- Нет приоритетов правил, как в нормальных фаерволах, чтобы сначала указать открытые порты, а последним задать запрещающее правило для всех остальных.
Допустим, есть VPS на винде, но у хостера нет внешнего фаервола, которым можно прикрыться. Свежеустановленная винда торчит наружу как минимум 135/tcp, 445/tcp, 49154/tcp и 3389/tcp (если включен RDP) портами даже в публичной сети (Public network), что требует исправления.
Алгоритм
Есть три типа портов, это:
- Общедоступные порты, которые должны быть открыты для всего интернета. Пусть будут 80 и 443 (http и https)
- Фильтруемые порты, доступные только с определенных IP адресов. Возьмем 3389 (RDP)
- Все остальные, должны быть закрыты
Требуется:
1. Создать правило, запрещающее всё, кроме трех вышеобозначенных портов.
2. Для общедоступных больше делать ни чего не требуется.
3. Для фильтруемого создать разрешающее правило, указав белые адреса.
Секрет в том, что при запрещении всех портов надо явно указать разрешенные. Иначе, как было сказано выше, не получится открыть нужные.
Пример
Задача 1: оставить открытыми для всего интернета 80, 443 и 3389 порты. Все остальные закрыть.
1. Создать новое правило для входящих подключений
2. Тип правила (Rule Type). Настраиваемые (Custom)
3. Программа (Program). Все программы (All programs)
4. Протокол и порты (Protocol and Ports). Тип протокола (Protocol type) - TCP. Локальный порт (Local port) - Специальные порты (Specific Ports). В поле вписать диапазон портов, за исключением 80, 443 и 3389. Должно выглядеть так - 1-79, 81-442, 444-3388, 3390-65535
5. Область (Scope). Локальный (local) - Любой IP-адрес (Any IP address). Удаленный (remote) - Любой IP-адрес (Any IP address).
6. Действие (Action). Блокировать подключение (Block the connection).
7. Профиль (Profile). Выбрать на свое усмотрение. Если не уверен, то выбрать все.
8. Имя (Name). Назвать его, например, Block_TCP.
Теперь указанные порты открыты для всего интернета, но, как минимум, не безопасно открывать всем порт RDP и желательно ограничить подключение только со своих IP адресов.
Задача 2: оставить открытыми для всего интернета 80 и 443 порты. Ограничить подключение на порт 3389 только с разрешенных IP адресов. Все остальные закрыть.
Шаги 1-8 аналогичны предыдущей задаче, т.е. создается правило, разрешающее коннект по трем указанным портам.
Для фильтрации по IP надо создать второе правило:
9. Создать новое правило для входящих подключений
10. Тип правила. Настраиваемые
11. Программа. Все программы
12. Протокол и порты. Тип протокола - TCP. Локальный порт - специальные порты. Вписать порт 3389
13. Область. Локальный - Любой IP-адрес. Удаленный - Указанные IP-адреса. Сюда вписать белый список IPшников или подсетей, которым разрешен коннект по данному порту
14. Действие. Разрешить подключение.
15. Профиль. Выбрать на свое усмотрение. Если не уверен, то выбрать все.
16. Имя. Назвать его, например, RDP.
Если фильтруемых портов несколько, то создается по одному правилу на каждый порт.
Ну и чтобы стать совсем защищенным - создать правило, блокирующее все UDP соединения.
Задача 2 из консоли
Для хардcore
щиков приведу вторую задачу в виде консольных команд:
netsh advfirewall firewall add rule dir=in action=block protocol=TCP localport=1-79,81-442,444-3388,3390-65535 name="Block_TCP" netsh advfirewall firewall add rule dir=in action=allow protocol=TCP localport=3389 remoteip=192.168.0.0/24,x.x.x.x name="RDP" netsh advfirewall firewall add rule dir=in action=block protocol= UDP name="Block_All_UDP"
В конечном итоге, в гуёвине должно выглядеть так:
Для правила RDP:
Для правила Block_TCP:
UPDATE
Выяснилось, что приведенный выше синтаксис командной строки не работает на WS2008R2, а конкретно - перечисления в любом параметре, поэтому пришлось разбивать два правила на восемь:
netsh advfirewall firewall add rule dir=in action=block protocol=TCP localport=1-79 name="Block_TCP-1" netsh advfirewall firewall add rule dir=in action=block protocol=TCP localport=81-442 name="Block_TCP-2" netsh advfirewall firewall add rule dir=in action=block protocol=TCP localport=444-3388 name="Block_TCP-3" netsh advfirewall firewall add rule dir=in action=block protocol=TCP localport=3390-65535 name="Block_TCP-4" netsh advfirewall firewall add rule dir=in action=allow protocol=TCP localport=80 name="HTTP" netsh advfirewall firewall add rule dir=in action=allow protocol=TCP localport=443 name="HTTPS" netsh advfirewall firewall add rule dir=in action=allow protocol=TCP localport=3389 remoteip=192.168.0.0/24 name="RDP-1" netsh advfirewall firewall add rule dir=in action=allow protocol=TCP localport=3389 remoteip=x.x.x.x name="RDP-2"
…да-а-а-а-с… Все це цікаво… Але в мене «4 класи» компьютерної освіти, а пояснення розраховано мабуть на вищу к.о…. Тому скористатись цими поясненнями можна тільки за допомогою спеціаліста… А прочитати варто, щоб мати загальне уявлення яким чином все це робиться…
тут же розписано, що куди вписувати, навіть на скрінах показано, що вибирати і вписувати. Можна просто:
1) натиснути winkey + R (або пуск-выполнить)
2) ввести «cmd» і натиснути enter, з’явиться консоль
3) в консоль по черзі береш з блоку, обведеного пунктиром кожен рядок, копіюєш або вводиш сам і тиснеш enter, потім слідуючий. І так всі, крім останнього (там де «remoteip=x.x.x.x» — туди просто треба вписати ip, з якого ти хочеш мати можливість підключатись віддалено до даного ПК)
правда там ще й пропущено:
netsh advfirewall firewall add rule dir=in action=block protocol=TCP localport=444-3388 name=»Block_TCP_444-3388″
Действительно, пойду добавлю. Спасибо!
Але как же порты 25 110 для почты?
а как открыть порт только для конкретной программы?
Для этого есть вкладка «Программы и службы», там указывайте путь к исполняемому файлу
Возможно я некорректно выразился… Вопрос был в рамках статьи: создаем общее запрещающее правило для всех портов кроме http(s) и нужно для одной из программ открыть еще один порт (к примеру порт 45678, который должен быть открыт только для этой одной программы)
Для того чтобы открыть порт надо обязательно выполнить в брэндмауэре две вещи:
— открыть нужный порт (протокол, номер)
— перестать блокировать вашу конкретную программу (путь, имя) от доступа к любым портам (и открытым, и закрытым)
!важно, что открытие нужного порта не включает в себя разблокирование приложений, как может показаться на первый взгляд, оба типа блокировки работаю независимо.
Полезно