Detalhes inesperados do Firewall do Windows padrão. E experimentos para reconfigurar

Às vezes acontece que durante a implementação do próximo projeto, acidentalmente descubro algumas circunstâncias que, ao que parece, ninguém está escondendo, você pode até encontrar documentação que explica a essência ... Mas muitos, inclusive eu, são mantidos em cativeiro por delírios, por isso não procuram por essa documentação, contando com uma imagem completamente errada do mundo. Já tenho toda uma série de artigos planejados, nos quais simplesmente relato que tudo acaba não sendo o que muitos (inclusive eu) pensavam. Eu tinha um artigo sobre DMA , havia um artigo sobre o desempenho do barramento PCI Express . O artigo sobre configuração de ROMs para Altera FPGAs pode ser referido ao mesmo ciclo .



Hoje eu gostaria de falar algumas palavras sobre o trabalho do Firewall do Windows, ou, como é chamado no Russified OS, o firewall. Em geral, isso é uma coisa muito boa, mas em particular ... Acontece que, por padrão, funciona de um modo bastante interessante. Como diz o ditado: "E os meninos não sabem." Então, começamos a descobrir o que é.









Introdução



Primeiro, vou explicar a essência do problema que estava resolvendo. Tive que verificar como a próxima placa funciona corretamente com nosso serviço Todo o Hardware. Mas não o que verifiquei em um dos artigos anteriores , mas mais sofisticado, com o FPGA Xilinx.



O que é o serviço Todo o Hardware. Este é o site que o usuário visita, faz o login e recebe uma lista de vários painéis localizados fisicamente no servidor. Por que ele esta fazendo isso? Trabalhar com a prancha sem comprar. Por exemplo, veja se funciona para ele, ou apenas pratique usando um controlador específico. As placas são fornecidas pelos fabricantes e o serviço oferece uma sessão de tempo limitado com eles. O usuário seleciona uma placa da lista e obtém três coisas: endereço IP, número da porta e vídeo da câmera que está olhando para este layout. Na verdade, você ainda pode encaminhar portas por SSH lá, mas não sou um especialista nelas. Da minha parte - exatamente o endereço, porta e vídeo.



Além disso, o usuário no ambiente de desenvolvimento, que está em sua máquina local, deve selecionar um depurador remoto (para a maioria dos ambientes este é o bom e velho GDB, para Keil é mais perverso, mas se você estiver interessado - você pode fazer um artigo separado sobre isso, isso não se aplica ao firewall). O IP e a porta emitidos são direcionados para lá, após o qual você pode iniciar uma sessão de depuração remota, focando no que está acontecendo com a placa pela imagem da câmera e pelas portas encaminhadas por SSH.



Assim, qualquer pessoa pode sentir o trabalho com várias placas de desenvolvimento sem comprá-las. Ao mesmo tempo, como no caso do Redd, o ambiente de desenvolvimento e os códigos-fonte estão localizados na máquina local. Apenas o código binário vai para o servidor. Porém, após o término da sessão, a automação apaga a ROM, para que o próximo usuário não consiga ler o código.



Então, de volta ao tópico do artigo. Qual é o lado do firewall aqui? É simples. Tive que trabalhar com um FPGA Xilinx. E seu ambiente de desenvolvimento é oficialmente WebTalk. Eu não queria que ela relatasse minhas ações "onde deveria estar", então o ambiente estava em uma máquina sem rede. Mesmo se ela realmente quisesse - suas mãos são curtas. Não existe canal físico e é isso! Mas o conceito do serviço Todo o Hardware é que deve haver uma rede. Para verificar, o carro teve que estar temporariamente conectado ao fio (na verdade, a falta de rede é mais provável um hábito, ainda não há nada de interessante naquele carro). O que fazer? Pisou na garganta da sua paranóia? Bem Eu não! Decidi limitar o ambiente de desenvolvimento à lista de endereços permitidos para que ele só funcione com localhost e o servidor All Hardware. Eu não sei o que vai acontecer a seguire agora o servidor de todo o hardware tem o mesmo endereço IP. É que novas portas são emitidas de sessão para sessão. Então, o objetivo é claro, vamos começar a implementação.



Qual firewall devo usar?



No Windows XP e no Windows 7, usei o Outpost Firewall. Este é um desenvolvimento doméstico. Muito confiável e confortável. Até comprei uma licença vitalícia para três carros fora de estoque. Uma vez, esse firewall me ajudou a identificar um Trojan que nenhum antivírus viu. Quando consegui pegar o arquivo com o corpo do vírus, alimentei-o com vários antivírus fornecidos no LiveCD. Nenhum notou nada suspeito. E meu firewall estava em um modo paranóico, de onde eu aprendi sobre a atividade suspeita do programa.



Tudo estava bem até que o fabricante deste firewall foi encerrado em circunstâncias estranhas. Depois disso, fiquei muito triste. Fiquei muito triste porque meu laptop principal ainda tem um 7 com Outpost, já que não procurei um substituto. Mas o IDE Xilinx quer os dez primeiros! Perfeitamente! Então, é hora de aprender como trabalhar com o firewall embutido neste SO!



Todos nós sabemos que quando um programa tenta acessar a rede, este firewall padrão nos pergunta se permitimos que ele funcione com a rede ou não. Podemos proibir imediatamente, ou podemos desmarcar a caixa de permissão depois, há muitos guias sobre isso na rede. Essas caixas de seleção são:







Todo mundo sabe disso. Mas qual é o valor desse conhecimento? Omitirei os pensamentos que me dominaram ao ler a massa do mesmo tipo de artigos “como proibir um aplicativo de ficar online”, que não dizem como não proibir, mas apenas restringi-lo. Prefiro mostrar minhas conclusões em um feito especialmente para este exemplo. Vamos escrever dois aplicativos de console mais simples.



Servidor



O primeiro aplicativo fingirá ser um servidor. Ele pega pacotes UDP contendo strings e os exibe na tela. Para que possamos falar sobre a mesma coisa, aqui está seu código-fonte C ++:

#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>

// Need to link with Ws2_32.lib
#pragma comment (lib, "Ws2_32.lib")

#define DEFAULT_BUFLEN 16

int main(int argc, char** argv)
{
	if (argc != 2)
	{
		printf("usage: ServerTest.exe port");
		return -1;
	}

	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);

    // The socket address to be passed to bind
    sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = INADDR_ANY;
	addr.sin_port = htons((u_short)strtoul (argv[1],0,0));

	SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0/*IPPROTO_UDP*/);

	bind(sock, (struct sockaddr*) &addr, sizeof(addr));

	while (true)
	{
		struct sockaddr from;
		int len = sizeof(from); 
		char buf[DEFAULT_BUFLEN];
		memset(buf, 0, DEFAULT_BUFLEN);
		recvfrom(sock, buf, DEFAULT_BUFLEN-1, 0, &from, &len);
		printf(buf);
	}

	return 0;
}


Lançamos este programa, passando o número da porta (digamos, 1234) como um argumento e previsivelmente recebemos uma solicitação do firewall:







Deixe-o atividade de rede ... Deixe-o esperar um pouco e escreveremos a parte do cliente como outro EXE.



Cliente



Deixe nosso cliente enviar as linhas giratórias para o servidor. Aqui está seu texto:

#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#include "Windows.h"

// Need to link with Ws2_32.lib
#pragma comment (lib, "Ws2_32.lib")
#define DEFAULT_BUFLEN 16

int main(int argc, char** argv)
{
	if (argc != 3)
	{
		printf("usage: ClientTest.exe address port");
		return -1;
	}

	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);

	struct sockaddr_in server, client = { AF_INET,INADDR_ANY,INADDR_ANY };
	memset(&server, 0, sizeof(server));
	server.sin_family = AF_INET;
	server.sin_port = htons((u_short)strtoul (argv[2],0,0));
	InetPton(AF_INET, argv[1], &server.sin_addr.s_addr);

	SOCKET sock = socket(PF_INET, SOCK_DGRAM, 0);
	bind(sock, (sockaddr*)& client, sizeof(client));

	for (int i=0;;i++)
	{
		static const char* sticks[] = { "\\\r","|\r","/\r","-\r" };
		sendto(sock, sticks[i%4], strlen(sticks[i%4])+1, 0, (sockaddr*)& server, sizeof(server));
		Sleep(250);
	}

}


Começamos especificando o endereço do servidor e a porta que o servidor tinha (eu tenho 192.168.1.95 e 1234), após o que um um pouco diferente começa a rodar na janela do servidor do que eu queria, mas ainda um stick:







Mas o que me preocupa não é que o símbolo "\ R" não retorna o carro para o início da linha, mas sim o fato do cliente ser um processo separado ... Lançado de um arquivo totalmente separado! .. E o firewall não me pediu permissão para atividade de rede. Em vez disso, ele mesmo resolveu, sem nem mesmo me informar que o programa iria para algum lugar. Como assim?



Um pouco de teoria sobre os modos de operação do firewall



Aqui chegamos à essência do artigo.

, Windows- , . , , - ( ), , , !


Na verdade, aqui está a configuração de firewall correspondente:







Tudo o que não é proibido é permitido. Um aplicativo pode ter a atividade explicitamente negada. É a isso que um grande número de artigos na Internet se dedica ... Mas o Trojan subirá em nosso carro imperceptivelmente, nem mesmo imaginaremos que ele deveria ser inserido em aplicativos proibidos. Novamente, isso não resolve meu problema apresentado na introdução do artigo. Preciso deixar o acesso aos endereços que permiti e negar todos os outros.



Para fazer isso, você precisa mudar o firewall para o modo "proibido tudo o que não é permitido" para conexões de saída. Estou sempre confuso sobre como entrar no item de menu correspondente ... Sim, eu achei ...







E lá primeiro selecionamos a guia correspondente ao perfil ativo (na minha imagem era “Perfil geral”, e depois mudamos a lista de seleção “Conexões de saída” de “Permitir (padrão)” para “Bloquear”.







É isso, podemos dormir bem? , não. Se fosse assim tão simples, tenho certeza de que a Microsoft escolheria imediatamente o modo "Bloquear" para todos. É uma pena, mas tudo está apenas começando.



Um pouco sobre masoquismo aplicado



Então. Digamos que você tenha ativado o modo de bloqueio para saída ... Tudo morreu de uma vez, incluindo os navegadores. Em geral, ninguém se preocupa em nenhum momento em retornar a escolha à posição anterior e reverter para a versão original. Mas vamos ver o que o novo regime nos dá em geral. Recebemos uma lista de regras. E para essas regras, você pode definir uma condição de permissão incondicional ou pode definir uma lista de portas abertas e uma lista de endereços abertos para o aplicativo. Os endereços podem ser definidos como um grupo. Aqui está a janela de configurações de porta:







Aqui está a janela de configurações de endereço:











Além disso, ninguém se preocupa em abrir a porta para nenhum programa, limitando a lista de endereços válidos para ele. Ou seja, não dizemos "Programa tal e tal para permitir acesso às portas tal e tal", mas "Todos os programas que funcionam através da porta tal e tal, permitem funcionar, limitando os endereços ao próximo grupo."



Tudo está ótimo, exceto por uma coisa. Se a lista de regras para conexões de entrada é gerada pelo sistema, então para conexões de saída você precisa adicionar tudo sozinho. Como eu disse, meu navegador morreu - eu mesmo tive que adicioná-lo às caixas de saída permitidas. Não vou descrever como os endereços são configurados, este não é o artigo. Artigos sobre como definir regras (para fins de bloqueio, no entanto) custam um centavo a dúzia. Em geral, eu geralmente encontrei uma regra adequada para entrada, copiei o nome do arquivo de lá, e então - criei uma regra para saída, especificando o mesmo arquivo. Bem, e permitiu que este programa estivesse ativo.



Quando tive um problema para me conectar a uma VPN no escritório, pesquisei uma lista de regras prontas e encontrei isto (eu sabia de antemão que nossa conexão VPN era feita usando o protocolo L2TP):







A regra foi criada para nós, mas não ativada. Entrei em suas propriedades, ativei-o, depois disso uma bola verde com uma marca de seleção apareceu à esquerda da lista e a conexão VPN para o escritório funcionou.



Mas de uma forma ou de outra, mas em geral, trabalhar com esse tipo de firewall cheira a masoquismo. É preciso ter uma vontade de ferro para não gritar: "E isso é cansaço" e não voltar ao antigo modo de trabalho. Quase cheguei a esse estado (felizmente, os experimentos com o Xilinx for All Hardware já foram concluídos), mas um de meus conhecidos sugeriu uma bela solução para mim.



Add-on sobre o firewall padrão



Acontece que existe um programa de controle de firewall do Windows oficialmente gratuito.







Ele não faz nada por si só, apenas gerencia o firewall embutido no Windows, fornecendo interfaces muito amigáveis. Agora você não precisa percorrer vários menus para personalizar algo. Todas as configurações são coletadas de forma conveniente e compacta em várias guias. Não vou descrever todas as funções deste programa. O objetivo do artigo não é descrevê-lo, mas simplesmente marcar sua existência. Além disso, todos podem encontrar artigos especializados, sabendo o nome do Windows Firewall Control.



E agora, ao iniciar a parte do cliente a partir do exemplo acima, finalmente recebi uma mensagem:







posso conceder acesso a ele, após o que uma regra será criada automaticamente, posso negar o acesso, posso bloquear o aplicativo uma vez.



Por questão de interesse, encontrei uma regra criada automaticamente na lista de firewall padrão e limitei a lista de endereços disponíveis para ela:







Em geral, a vida com este aplicativo tornou-se muito mais fácil, mesmo quando se usa o Firewall do Windows padrão. Muito melhor que esta máquina com Windows 10 permanecesse online, não tão indefesa como estava antes.



Conclusão



O Firewall do Windows padrão funciona por padrão de tal modo que qualquer programa pode começar a enviar dados, sobre os quais o usuário nem será informado. Ninguém o esconde, mas nem todos sabem disso. Você pode, é claro, instalar um firewall de terceiros, mas é suficiente mudar o Firewall do Windows padrão para o modo "proibido tudo o que não é permitido". Infelizmente, é um inferno oferecer suporte ao desempenho da rede com meios regulares. Mas o Controle de Firewall do Windows de terceiros, oficialmente freeware, remove esse inconveniente.



Se você usará um pacote do firewall normal e este programa, ou obterá um firewall de terceiros, a questão está aberta. Mas o fato de usar o firewall padrão no modo padrão é um pouco assustador, na minha opinião, está fora de dúvida.



All Articles