Обычно я использую серверы Linux для своих приложений. Поэтому я новичок в системе брандмауэра серверов Windows.
У меня есть приложение C #, которое должно действовать как HTTP-сервер. Есть несколько способов реализовать это с помощью разных уровней абстракции: Конечно, есть Socket
библиотека, обеспечивающая очень фундаментальную функциональность. Для TCP-трафика есть также TcpClient
. Оба прослушивают определенный порт, и для доступа к ним с другого компьютера требуются «правила для входящих подключений», определенные в брандмауэре Windows (правила не требуются, если вам нужен доступ только с вашего компьютера).
Тогда есть HttpListener
. Он не работает для каждого порта, использует префиксы URI для соответствия запросам. Например, префикс «http: // *: 80 /» будет обрабатывать весь http-трафик порта 80.
Что меня действительно беспокоит, так это то, что HttpListener
для работы нет правила в брандмауэре Windows, но требуется запись в urlacl:
netsh http add urlacl url=http://*:80/ user=DOMAIN\user
(Это резервирование пространства имен URL)
Все три метода реализации http-сервера одинаково полезны. Разница в том, что при использовании HttpListener требуется гораздо меньше кода.
Мой вопрос: почему существует концепция резервирования пространства имен URL-адресов, но, тем не менее, не зарегистрированные URL-адреса могут прослушиваться сервером. И почему зарегистрированные URL-адреса могут обходить правила брандмауэра? Почему вообще существует такая система?
AFAIK, net http показывает / редактирует конфигурацию для http.sys, части драйвера режима ядра IIS, которая вместе с серверами активации Windows (WAS) также может использоваться приложениями, не относящимися к IIS. Им просто нужно зарегистрировать свой URL-адрес, чтобы http.sys / WAS мог направлять запросы правильному клиенту и избегать конфликтов.
Если вы решите реализовать низкоуровневое прослушивание порта самостоятельно, вы не используете http.sys и не должны регистрировать URL-адрес в netsh, но вам все равно нужно быть осторожным, чтобы не возникло никаких конфликтов с другими программами.
Сеть httpListener
класс также использует http.sys
Что касается правил брандмауэра, я не вижу, чтобы зарегистрированные URL-адреса не нуждались в правиле брандмауэра. Ваш пример http://*:80/
покрывается World Wide Web Services
правило filewall.