La necesidad de marca de configuración de socket de Linux

  

La ubicación del punto de conexión de Linux Netfilter causará algunos problemas extraños, como el paquete enviado por la máquina no puede usar el enrutamiento de políticas basado en marcas, porque la marca generalmente se lleva a cabo en Netfilter El enrutamiento de Linux está antes del punto de conexión de SALIDA, por lo que esta es una secuencia de problemas de inversión, ¿cómo resolverlo? Marque solo antes de la ruta, y sabemos que para los paquetes ingresados ​​externamente, la marca está en PREROUTING Por lo tanto, para los paquetes ingresados ​​externamente, el enrutamiento de políticas es bueno. Para los paquetes enviados por esta máquina, la ruta solo puede ser antes la capa de conexión. ¿Por qué no se puede hacer en la capa de transporte? Debido a que la capa de transporte es más complicada, la segunda es Muchos protocolos van directamente a la capa IP, como OSPF. Tercero, muchos protocolos de la capa de transporte también necesitan una búsqueda de ruta. Por ejemplo, cuando TCP se conecta, necesita encontrar la ruta para determinar la dirección IP de origen (si no hay enlace).

Afortunadamente, los sockets de Linux admiten una opción como SO_MARK, que se puede usar fácilmente:

mark = 100;

setsockopt (client_socket, SOL_SOCKET, SO_MARK, &mark, sizeof (mark));

1. Impacto en TRACK

Aunque la tabla sin formato es la primera tabla que pasa el paquete, el uso de SO_MARK puede seguir funcionando en toda la tabla sin formato. Haga una marca antes, de modo que el paquete emitido por un socket específico sea todo NOTRACK:

iptables -t raw -A SALIDA -m mark - marca 100 -j NOTRACK

Si este no es el caso, necesitará:

iptables -t raw -A OUTPUT [-s xxxx] [-d yyyy] [-p tcp | Udp [--sport X] [--dport Y] ... -j MARK - set-mark 100

... [muchas reglas similares arriba]

iptables -t raw -A SALIDA -m marca --mark 100 -j NOTRACK

Como debe hacer la tabla raw en PREROUTING. Estamos orgullosos de que OUTPUT es el socket, es el mundo de la aplicación y PREROUTING es el núcleo y el mundo del controlador. Este último es demasiado complicado e inconveniente para hacer más, y el primero es el alcance que podemos controlar.

2. Impacto en el enrutamiento de políticas

El mayor beneficiario de SO_MARK es el enrutamiento de políticas, si somos la siguiente ruta:

ip rule add fwmark 100 table abc

ip route add 1.2.3.4/32 a través de 192.168.0.254 table abc

ip route del 1.2.3.4/32 table Main

Sin configurar SO_MARK, todo el tráfico que acceda a 1.2.3.4 se descartará porque no hay una ruta, ya que la ruta debe buscarse antes de ingresar a PREROUTING, pero no está marcada en este momento. Y, por lo tanto, no coincidirá con la ruta en la tabla de políticas abc, y la ruta correspondiente en la tabla principal se ha eliminado ... pero si agregamos en la aplicación:

marca = 100;

setsockopt (client_socket, SOL_SOCKET, SO_MARK, &mark, sizeof (mark));

El acceso puede ser normal, porque la marca ya está ahí cuando se busca una ruta.

Copyright © Conocimiento de Windows All Rights Reserved