C # - сокет для входа в брандмауэр - PullRequest
1 голос
/ 14 ноября 2011

Я написал приложение для автоматического подключения к нашим брандмауэрам. Все они работают с одним и тем же интерфейсом. Мы связываемся с IP-адресом, и они выдают сообщение LOGIN или LOGOUT и запрашивают имя пользователя или пароль.

Я использовал этот код:

    public static void ConnectToFirewall(string strUsername, string strPassword, string strFirewallIp)
    {
        IPAddress[] ipaIpAddressCollection = Dns.GetHostAddresses(strFirewallIp);
        IPEndPoint ipeIpEndPoint = new IPEndPoint(ipaIpAddressCollection[0], intPort);
        Socket sckSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        sckSocket.Connect(ipeIpEndPoint);
        string strData = strUsername + "\r\n"+ strPassword + "\r\n";
        byte[] bytData = new byte[1024];
        bytData = Encoding.ASCII.GetBytes(strData);
        sckSocket.Send(bytData);
        byte[] bytDataReceived = new byte[1024];
        int intData = sckSocket.Receive(bytDataReceived);
        sckSocket.Close();
    }

Если я не вошел в систему, при подключении к нему я получаю сообщение: ВХОД, имя пользователя: / Пароль :. Если я вошел в систему, я получаю ВЫХОД, имя пользователя: / Пароль.

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

    TcpClient tcpConnection = new TcpClient(myip,myport);

но это дает тот же результат. Это работает для определенных IP-адресов брандмауэра. терпит неудачу для других. Все они находятся в одном домене.

Кто-нибудь знает, как я мог бы пройти через это или какие шаги я мог предпринять для устранения неполадок этого или что может быть причиной того, что какой-то сервер не принимает этот метод, несмотря на то, что он действительно принимает, если я telnet к нему?

Любая помощь или предложения приветствуются.

Большое спасибо заранее.

1 Ответ

1 голос
/ 14 ноября 2011

Когда вы звоните sckSocket.Send(bytData), как сокет узнает, что отправил только часть bytData, которая была инициализирована с именем пользователя и паролем? У меня такое чувство, что Send() будет отправлять все 1024 байта, большинство из которых будет 0x00 байтов. Я не ожидал бы, что маршрутизатор справится с этим изящно.

Я видел системы, которые принимали пароль только после . Был сгенерирован и отправлен запрос пароля. Попробуйте отправить имя пользователя и пароль с двумя отдельными запросами. Если ваша среда позволяет установить опцию сокета TCP_NODELAY для отключения алгоритма Нейгла , это может помочь ускорить отправку строки имени пользователя. (Я не стал бы беспокоиться об этом, если бы вы также не разбили на части, отправив имя пользователя из пароля.)

...