Detalles inesperados del Firewall de Windows predeterminado. Y experimentos para reconfigurar

A veces resulta que durante la implementación del próximo proyecto, descubro accidentalmente algunas circunstancias que, al parecer, nadie se esconde, incluso puedes encontrar documentación que explique la esencia ... Pero muchos, incluyéndome a mí, estamos cautivos de los delirios, por lo que no buscan esa documentación, confiando en una imagen completamente errónea del mundo. Ya tengo toda una serie de artículos planeados, en los que simplemente informo que todo resulta no ser lo que muchos (incluyéndome a mí) pensaban. Tenía un artículo sobre DMA , había un artículo sobre el rendimiento del bus PCI Express . El artículo sobre ROM de configuración para FPGA Altera puede referirse al mismo ciclo .



Hoy me gustaría contarles algunas palabras sobre el Firewall de Windows o, como se le llama en el sistema operativo rusificado, el firewall. En general, esto es algo muy bueno, pero en particular ... Resulta que por defecto funciona en un modo bastante interesante. Como dice el refrán: "Y los chicos no saben". Entonces, comenzamos a descubrir qué es qué.









Introducción



Primero, explicaré la esencia del problema que estaba resolviendo. Tuve que comprobar cómo funciona correctamente la siguiente placa con nuestro servicio Todo el hardware. Pero no el que revisé en uno de los artículos anteriores , sino más sofisticado, con la FPGA de Xilinx.



Qué es el servicio Todo el hardware. Este es el sitio que visita el usuario, inicia sesión y recibe una lista de varios tableros ubicados físicamente en el servidor. ¿Por qué está haciendo esto? Trabajar con el tablero sin comprarlo. Por ejemplo, vea si le funciona o simplemente practique el uso de un controlador específico. Los tableros son proporcionados por los fabricantes y el servicio brinda una sesión de tiempo limitado con ellos. El usuario selecciona una placa de la lista y obtiene tres cosas: dirección IP, número de puerto y video de la cámara que está mirando este diseño. De hecho, todavía puede reenviar puertos a través de SSH allí, pero no soy un experto en ellos. Por mi parte, exactamente la dirección, el puerto y el video.



Además, el usuario en el entorno de desarrollo, que está en su máquina local, debe seleccionar un depurador remoto (para la mayoría de los entornos este es el buen GDB antiguo, para Keil es más perverso, pero si está interesado, puede hacer un artículo separado sobre esto, esto no se aplica al firewall). La IP y el puerto emitidos se ingresan allí, después de lo cual puede iniciar una sesión de depuración remota, enfocándose en lo que está sucediendo con la placa por la imagen de la cámara y por los puertos reenviados a través de SSH.



Por lo tanto, cualquiera puede sentir el trabajo con varias placas de desarrollo sin comprarlas. Al mismo tiempo, como en el caso de Redd, el entorno de desarrollo y los códigos fuente se encuentran en la máquina local. Solo el código binario va al servidor. Pero después de la expiración de la sesión, la automatización borra la ROM, por lo que el siguiente usuario no podrá leer el código.



Entonces, volvamos al tema del artículo. ¿Cuál es el lado del firewall aquí? Es simple. Tuve que trabajar con una FPGA Xilinx. Y su entorno de desarrollo es oficialmente WebTalk. No quería que informara de mis acciones "donde debería estar", por lo que el entorno estaba en una máquina no conectada a la red. Incluso si realmente quisiera, sus manos son cortas. ¡No hay canal físico y eso es todo! Pero el concepto del servicio Todo el hardware es que debe haber una red. Para probar, el automóvil tenía que estar conectado temporalmente al cable (de hecho, la falta de una red es más un hábito, todavía no hay nada interesante en ese automóvil). ¿Qué hacer? ¿Pisar la garganta de tu paranoia? ¡Bueno yo no! Decidí limitar el entorno de desarrollo a la lista de direcciones permitidas para que solo pueda funcionar con localhost y el servidor Todo el hardware. No se que pasará despuésy ahora el servidor Todo el hardware tiene la misma dirección IP. Es solo que se emiten nuevos puertos de una sesión a otra. Entonces, el objetivo es claro, vayamos a la implementación.



¿Qué cortafuegos debo llevar?



En Windows XP y Windows 7, usé Outpost Firewall. Este es un desarrollo nacional. Muy confiable y confortable. Incluso me compré una licencia de por vida para tres coches agotados. Una vez, este firewall me ayudó a identificar un troyano que ningún antivirus ha visto. Cuando pude tomar el archivo con el cuerpo del virus, lo alimenté con varios antivirus incluidos en el LiveCD. Ninguno notó nada sospechoso. Y mi firewall estaba en un modo paranoico, desde donde me enteré de la actividad sospechosa del programa.



Todo estaba bien hasta que el fabricante de este firewall cerró en extrañas circunstancias. Después de eso, me puse muy triste. Estaba tan triste que mi computadora portátil principal todavía tiene un 7 con Outpost, ya que no busqué un reemplazo. ¡Pero el IDE de Xilinx quiere los diez primeros! ¡Perfectamente! Entonces, es hora de aprender a trabajar con el firewall integrado en este sistema operativo.



Todos sabemos que cuando un programa intenta acceder a la red, este cortafuegos estándar nos pregunta si permitimos que funcione con la red o no. Podemos prohibir inmediatamente, o podemos desmarcar la casilla de permiso después, hay muchas guías sobre esto en la red. Estas casillas de verificación son:







Todos saben eso. Pero, ¿cuál es el valor de este conocimiento? Omitiré mis pensamientos que me dominaban al leer la masa del mismo tipo de artículos "cómo prohibir que una aplicación se conecte", que no dicen cómo no prohibirla, sino solo restringirla. Prefiero mostrar mis conclusiones usando un ejemplo hecho especialmente para esto. Escribamos dos aplicaciones de consola más simples.



Servidor



La primera aplicación pretenderá ser un servidor. Toma paquetes UDP que contienen cadenas y los muestra en la pantalla. Para que hablemos de lo mismo, aquí está su código fuente 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;
}


Lanzamos este programa, pasamos el número de puerto (digamos, 1234) como argumento y, como era de esperar, recibimos una solicitud del firewall:







Déjelo actividad de red ... Déjelo esperar un rato y escribiremos la parte del cliente como otro EXE.



Cliente



Deje que nuestro cliente envíe las líneas de palos giratorios al servidor. Aquí está su 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);
	}

}


Empezamos especificando la dirección del servidor y el puerto que tenía el servidor (yo lo tengo 192.168.1.95 y 1234), tras lo cual empieza a correr en la ventana del servidor uno ligeramente diferente al que yo quería, pero todavía un palo:







Pero lo que me preocupa no es que el símbolo "\ R" no devuelve el carro al principio de la línea, pero el hecho de que el cliente es un proceso separado ... ¡Lanzado desde un archivo completamente separado! .. Y el firewall no me pidió permiso para la actividad de la red. En cambio, lo resolvió él mismo, sin siquiera informarme que el programa iría a alguna parte. ¿Cómo es eso?



Un poco de teoría sobre los modos de funcionamiento del firewall



Aquí llegamos a la esencia del artículo.

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


En realidad, aquí está la configuración de firewall correspondiente:







Se permite todo lo que no esté prohibido. Se puede denegar explícitamente una actividad a una aplicación. A esto se dedican una gran cantidad de artículos en Internet ... Pero el troyano se subirá imperceptiblemente a nuestro coche, ni siquiera adivinaremos qué es exactamente lo que debe introducirse en aplicaciones prohibidas. Nuevamente, esto no resuelve mi problema presentado en la introducción del artículo. Necesito dejar el acceso a esas direcciones que permití y negar todas las demás.



Para hacer esto, necesita cambiar el firewall al modo "prohibido todo lo que no está permitido" para las conexiones salientes. Siempre estoy confundido sobre cómo ingresar al elemento de menú correspondiente ... Sí, lo encontré ...







Y allí primero seleccionamos la pestaña correspondiente al perfil activo (en mi imagen era “Perfil general”, y luego cambiamos la lista de selección “Conexiones salientes” de “Permitir (predeterminado)” a “Bloquear”.







Eso es, ¿podemos dormir bien? , no. Si fuera así de simple, estoy seguro de que Microsoft elegiría inmediatamente el modo "Bloquear" para todos. Es una lástima, pero todo recién comienza.



Un poco sobre masoquismo aplicado



Entonces. Digamos que activó el modo de bloqueo para los mensajes salientes ... Todo murió de inmediato, incluidos los navegadores. En general, nadie se molesta en ningún momento en devolver la elección a la posición anterior y volver a la versión original. Pero veamos qué nos da el nuevo régimen en general. Obtenemos una lista de reglas. Y para estas reglas, puede establecer una condición de permiso incondicional o puede establecer una lista de puertos abiertos y una lista de direcciones abiertas para la aplicación. Las direcciones se pueden configurar como un grupo. Aquí está la ventana de configuración del puerto:







Aquí está la ventana de configuración de la dirección:











Además, nadie se molesta en abrir el puerto para ningún programa, lo que limita la lista de direcciones válidas para él. Es decir, no decimos "Programar tal o cual para permitir el acceso a puertos tal o cual", sino "Todos los programas que trabajan a través del puerto tal o cual, permiten trabajar, limitando las direcciones al siguiente grupo".



Todo es genial excepto por una cosa. Si el sistema genera la lista de reglas para las conexiones entrantes, entonces, para las conexiones salientes, debe agregar todo usted mismo. Como dije, mi navegador murió, tuve que agregarlo yo mismo a las bandejas de salida permitidas. No describiré cómo se configuran las direcciones, este no es el artículo. Los artículos sobre el establecimiento de reglas (con el propósito de bloquear, sin embargo) cuestan un centavo la docena. En general, generalmente encontré una regla adecuada para la entrada, copié el nombre del archivo desde allí y luego creé una regla para la salida, apuntando al mismo archivo. Bueno, y permitió que este programa estuviera activo.



Cuando tuve un problema para conectarme a una VPN en la oficina, investigué una lista de reglas listas para usar y encontré esto (sabía de antemano que nuestra conexión VPN usa L2TP):







La regla fue creada para nosotros, pero no activada. Entré en sus propiedades, lo activé, después de lo cual apareció una bola verde con una marca de verificación a la izquierda de la lista, y la conexión VPN a la oficina funcionó.



Pero de una forma u otra, pero en general, trabajar con un cortafuegos así huele a masoquismo. Es necesario tener una voluntad de hierro para no gritar: "Y esto está todo cansado" y no volver al viejo modo de trabajo. Casi he alcanzado este estado (afortunadamente, los experimentos con Xilinx para todo el hardware ya se han completado), pero uno de mis conocidos me sugirió una hermosa solución.



Complemento sobre el firewall estándar



Resulta que hay un programa de control de firewall de Windows oficialmente gratuito.







No hace nada por sí mismo, solo administra el firewall integrado en Windows, proporcionando interfaces muy fáciles de usar. Ahora no tiene que pasar por un montón de menús para personalizar algo. Todos los ajustes se recopilan de forma cómoda y compacta en varias pestañas. No describiré todas las funciones de este programa. El propósito del artículo no es describirlo, sino simplemente marcar su existencia. Además, todos pueden encontrar artículos especializados, conociendo el nombre de Windows Firewall Control.



Y ahora, al iniciar la parte del cliente del ejemplo anterior, finalmente recibí un mensaje:







Puedo otorgarle acceso, después de lo cual se creará una regla automáticamente, puedo denegar el acceso, puedo bloquear la aplicación una vez.



Por el bien del interés, encontré una regla creada automáticamente en la lista de firewall estándar y limité la lista de direcciones disponibles para ella:







en general, con esta aplicación, la vida se ha vuelto mucho más fácil incluso cuando se usa el Firewall estándar de Windows. Mucho mejor que esta máquina con Windows 10 se mantuviera en línea, no tan indefensa como antes.



Conclusión



El Firewall de Windows estándar funciona por defecto en un modo tal que cualquier programa puede comenzar a enviar datos, sobre los cuales el usuario ni siquiera será informado. Nadie lo esconde, pero no todo el mundo lo sabe. Por supuesto, puede instalar un firewall de terceros, pero es suficiente con cambiar el Firewall estándar de Windows al modo "prohibido todo lo que no está permitido". Desafortunadamente, resulta un infierno respaldar el rendimiento de la red con medios regulares. Pero un programa de control de firewall de Windows oficialmente gratuito de terceros elimina este inconveniente.



Si utilizará un paquete del firewall normal y este programa, o obtendrá un firewall de terceros, la pregunta está abierta. Pero el hecho de que usar el firewall estándar en el modo predeterminado da algo de miedo, en mi opinión, está fuera de toda duda.



All Articles