Определите, заблокирован ли IP - PullRequest
1 голос
/ 13 октября 2008

Кто-нибудь знает, можно ли надежно определить (программно C / C ++ ...), установлено ли на ПК с Windows программное обеспечение брандмауэра или IP-фильтрации? Мне нужно определить, блокируется ли определенный IP-адрес сервера в моем клиентском программном обеспечении операционной системой хоста.

Мне не нужно беспокоиться о внешних аппаратных брандмауэрах в этой ситуации, поскольку я полностью контролирую это. Это касается только программных брандмауэров. Я надеялся, что смогу выполнить итерацию сетевого стека Windows или интерфейсов NDIS и определить это

Ответы [ 8 ]

3 голосов
/ 14 октября 2008

После прочтения некоторых ваших комментариев в ответ на другие ответы, я думаю, что это на самом деле может быть ближе к тому, что вы ищете. Он может не перехватывать все типы брандмауэров, но любой крупный поставщик брандмауэров должен быть зарегистрирован в Центре безопасности и, следовательно, обнаружен этим методом. Вы также можете объединить это с некоторыми другими ответами, чтобы получить второй уровень проверки.

Обнаружение запущенных брандмауэров в Windows

Это сообщение эксперта по обмену, поэтому вы не сможете прочитать ветку. На всякий случай я скопировал и вставил соответствующую информацию. Он написан на VBScript, но он должен указывать вам правильное направление в отношении того, какие пространства имен WMI вы можете использовать.

KemalRouge : Я только что решил эту проблему с некоторой помощью коллега. Он указал мне в направлении статьи базы знаний, который указал, что эта информация была сохранена в базе данных WMI

По сути, можно запросить WMI в несколько строк кода, чтобы выяснить, какие брандмауэры / антивирусные программы контролируются Центр безопасности и состояние этого программного обеспечения (т.е. включено или нет).

В любом случае, если вам интересно, вот код VB, который я использовал, чтобы проверить это (вам потребуется ссылка на «Библиотеку Microsoft WMI Scripting V1.2»):

Private Sub DumpFirewallInfo()

Dim oLocator    As WbemScripting.SWbemLocator
Dim oService    As WbemScripting.SWbemServicesEx
Dim oFirewalls  As WbemScripting.SWbemObjectSet
Dim oFirewall   As WbemScripting.SWbemObjectEx
Dim oFwMgr      As Variant


    Set oFwMgr = CreateObject("HNetCfg.FwMgr")

    Debug.Print "Checking the Windows Firewall..."
    Debug.Print "Windows Firewal Enabled: " & oFwMgr.LocalPolicy.CurrentProfile.FirewallEnabled
    Debug.Print ""

    Set oFwMgr = Nothing


    Debug.Print "Checking for other installed firewalls..."

    Set oLocator = New WbemScripting.SWbemLocator
    Set oService = oLocator.ConnectServer(".", "root\SecurityCenter")
    oService.Security_.ImpersonationLevel = 3

    Set oFirewalls = oService.ExecQuery("SELECT * FROM FirewallProduct") ' This could also be "AntivirusProduct"

    For Each oFirewall In oFirewalls
        Debug.Print "Company:       " & vbTab & oFirewall.CompanyName
        Debug.Print "Firewall Name: " & vbTab & oFirewall.DisplayName
        Debug.Print "Enabled:       " & vbTab & Format$(oFirewall.Enabled)
        Debug.Print "Version:       " & vbTab & oFirewall.versionNumber
        Debug.Print ""
    Next oFirewall

    Set oFirewall = Nothing
    Set oFirewalls = Nothing
    Set oService = Nothing
    Set oLocator = Nothing

End Sub
2 голосов
/ 13 октября 2008

Может быть взлом, если вы можете предположить следующее:

  1. Разрешены исходящие HTTP-соединения

  2. Вы можете запустить один из ваших собственных сервисов на другом сервере, прослушивая порт 80

Код вашей службы, чтобы принимать IP [и порт или, возможно, URL]. Он должен вернуть, смог ли он подключиться к IP.

Таким образом, вы можете узнать, работает ли фактический сервер. Если сервер недоступен напрямую, вы можете сделать вывод, что он заблокирован брандмауэром.

Если вы не хотите кодировать / запускать свой собственный сервис, вы можете использовать один из веб-сервисов состояния сети, доступных в Интернете.

1 голос
/ 13 октября 2008

Вы не можете точно сказать, блокируется ли IP, по крайней мере, не зная, какое программное обеспечение брандмауэра вы ищете, и не проверив его специально. Некоторые мысли:

  • Проверьте, включены ли определенные брандмауэры (например, брандмауэр Windows) или блокирует ваш сервер
  • Проверьте файл hosts на наличие записи, блокирующей IP вашего сервера
  • подключитесь через прокси или прокси и посмотрите, могут ли они получить доступ к IP в случае, если ваш клиент не может.
  • Протестируйте сервер, чтобы увидеть, доступен ли он (в конце концов, это то, что вы действительно проверяете, верно? Чтобы узнать, можно ли связаться с сервером?) Возможно, имеет смысл проверять это несколько раз / периодически в случае фактических отключений на стороне вашего сервера.
1 голос
/ 13 октября 2008

Одним из возможных решений является использование того факта, что брандмауэры не имеют тенденцию блокировать доступ к порту 80, но блокируют доступ к другим портам. Таким образом, вы можете попробовать подключиться к порту 80, затем в случае успеха подключиться через обычно заблокированный порт ( см. Здесь список примеров )

1 голос
/ 13 октября 2008

А если этот IP заблокирован на их внешнем брандмауэре? Было бы абсолютно невозможно сказать , почему данный хост недоступен.

0 голосов
/ 14 октября 2008

Я собирался предложить заняться программированием в стиле 'ожидаемого' на netsh ... но обычно, когда есть такое приложение командной строки, за ним стоит библиотека.

Посмотрите на API брандмауэра Windows . Я не могу сказать, что это решит вашу конкретную проблему, но это кажется вероятным.

Пример кода для проверки, разрешен ли определенный порт ... Хороший пример , показывающий необходимые заголовки.

0 голосов
/ 13 октября 2008

Попробуйте вызвать Ping.

0 голосов
/ 13 октября 2008

Вам нужно будет перевести с C #, но в этом посте блога объясняется, как проверить, включен ли брандмауэр Windows: http://www.shafqatahmed.com/2008/01/controlling-win.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...