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.