¿Cuáles son las definiciones de addrtype en iptables?

11

Tengo muchas ganas de usarlo addrtypeen combinación con -srcuna de mis cadenas de filtros como para dejar caer algunos bogon ips:

-A INPUT -p tcp --dport 80 -m addrtype --src-type UNICAST ! -s 127.0.0.0/8 -j WEB

La página del manual dice lo siguiente

addrtype
Este módulo hace coincidir los paquetes según su tipo de dirección. Los tipos de dirección se utilizan dentro de la pila de red del núcleo y clasifican las direcciones en varios grupos. La definición exacta de ese grupo depende del protocolo específico de la capa tres.

Son posibles los siguientes tipos de dirección:

  • UNSPEC una dirección no especificada (es decir, 0.0.0.0)
  • UNICAST una dirección unicast
  • LOCAL una dirección local
  • TRANSMISIÓN de una dirección de difusión
  • ANYCAST un paquete de difusión ilimitada
  • MULTICAST una dirección de multidifusión
  • BLACKHOLE una dirección de agujero negro
  • Inaccesible una dirección inalcanzable
  • PROHIBIR una dirección prohibida
  • LANZAR FIXME
  • NAT FIXME
  • XRESOLVER

No está claro cuáles son las definiciones exactas y dice que depende del protocolo específico de la capa 3. Esto es lo que creo:

  • UNICAST (! BROADCAST,! MULTICAST,! ANYCAST)
  • LOCAL ( 127.0.0.0/8)
  • TRANSMISIÓN ( *.*.*.255)
  • CUALQUIER COSTA ( *.*.*.*)
  • MULTICAST ( 224.0.0.0/4)

¿Alguien tiene una idea clara de lo que eso significa y cómo lo implementa iptables (por ejemplo, cómo sabe dónde demonios está BLACKHOLE)?

Desbordamiento de preguntas
fuente
2
LOCALciertamente no lo es 127.0.0.0/8. Descubrí de la manera difícil :( ... aparentemente una dirección local se refiere a cualquier dirección asignada a una interfaz.
0xC0000022L
1
@ 0xC0000022L Según RFC990, 127.0.0.0/8 está reservado específicamente para loopback, sin embargo, LOCAL no se limita solo a ese rango.
Qwerty01

Respuestas:

3

Creo que depende de usted hacer que el núcleo sepa cuál es el tipo de dirección de agujero negro.

Desde el archivo xt_addrtype.h en el código fuente de iptables, puede ver:

/* rtn_type enum values from rtnetlink.h, but shifted */                        
enum {                                                                          
    XT_ADDRTYPE_UNSPEC = 1 << 0,                                                
    XT_ADDRTYPE_UNICAST = 1 << 1,   /* 1 << RTN_UNICAST */                      
    XT_ADDRTYPE_LOCAL  = 1 << 2,    /* 1 << RTN_LOCAL, etc */                   
    XT_ADDRTYPE_BROADCAST = 1 << 3,                                             
    XT_ADDRTYPE_ANYCAST = 1 << 4,                                               
    XT_ADDRTYPE_MULTICAST = 1 << 5,                                             
    XT_ADDRTYPE_BLACKHOLE = 1 << 6,                                             
    XT_ADDRTYPE_UNREACHABLE = 1 << 7,                                           
    XT_ADDRTYPE_PROHIBIT = 1 << 8,                                              
    XT_ADDRTYPE_THROW = 1 << 9,                                                 
    XT_ADDRTYPE_NAT = 1 << 10,                                                  
    XT_ADDRTYPE_XRESOLVE = 1 << 11,                                             
};

Y en rtnetlink.h, verás la misma definición:

enum {                                                                          
    RTN_UNSPEC,                                                                 
    RTN_UNICAST,        /* Gateway or direct route  */                          
    RTN_LOCAL,      /* Accept locally       */                                  
    RTN_BROADCAST,      /* Accept locally as broadcast,                         
                   send as broadcast */                                         
    RTN_ANYCAST,        /* Accept locally as broadcast,                         
                   but send as unicast */                                       
    RTN_MULTICAST,      /* Multicast route      */                              
    RTN_BLACKHOLE,      /* Drop             */                                  
    RTN_UNREACHABLE,    /* Destination is unreachable   */                      
    RTN_PROHIBIT,       /* Administratively prohibited  */                      
    RTN_THROW,      /* Not in this table        */                              
    RTN_NAT,        /* Translate this address   */                              
    RTN_XRESOLVE,       /* Use external resolver    */                          
    __RTN_MAX                                                                   
};

Puede ver iptablesusar la misma definición de tipo de dirección con la pila de red kernel tcp.

Luego de man ip:

Route types:

      unicast - the route entry describes real paths to the destinations covered by the route prefix.

      unreachable  - these destinations are unreachable.  Packets are discarded and the ICMP message host unreachable is generated.
               The local senders get an EHOSTUNREACH error.

      blackhole - these destinations are unreachable.  Packets are discarded silently.  The local senders get an EINVAL error.

      prohibit - these destinations are unreachable.  Packets are discarded and the  ICMP  message  communication  administratively
               prohibited is generated.  The local senders get an EACCES error.

      local - the destinations are assigned to this host.  The packets are looped back and delivered locally.

      broadcast - the destinations are broadcast addresses.  The packets are sent as link broadcasts.

      throw  - a special control route used together with policy rules. If such a route is selected, lookup in this table is termi‐
               nated pretending that no route was found.  Without policy routing it is equivalent to the absence of the route in the routing
               table.   The  packets  are  dropped  and the ICMP message net unreachable is generated.  The local senders get an ENETUNREACH
               error.

      nat - a special NAT route.  Destinations covered by the prefix are considered to  be  dummy  (or  external)  addresses  which
               require  translation  to  real  (or  internal)  ones  before forwarding.  The addresses to translate to are selected with the
               attribute Warning: Route NAT is no longer supported in Linux 2.6.

               via.

      anycast - not implemented the destinations are anycast addresses assigned to this host.  They are mainly equivalent to  local
               with one difference: such addresses are invalid when used as the source address of any packet.

      multicast - a special type used for multicast routing.  It is not present in normal routing tables.

Entonces, cuando define una ruta a una red por ipcomando y la marca como una ruta de agujero negro, el núcleo ahora hace que este tipo de agujero de dirección de red:

ip route add blackhole X.X.X.X/24
Cuonglm
fuente
1
¿Muestra archivos de encabezado del sistema y dice que depende del administrador?
Pavel Šimerda
Dije el blackholetipo de dirección, no todo tipo de dirección. iptables addrtypeMuestro que la extensión usa la misma definición addrtype con el núcleo. Y la definición del núcleo del tipo de dirección se puede ver en man ip.
Cuonglm
Gracias, eso solo responde a la parte sobre el agujero negro. Intenté enumerar los ips desde el comando ip, ip route list type localpero todos los tipos producen una cadena vacía, excepto la unidifusión que da default via 192.168.1.1 dev eth0 proto static metric 1024 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.2. ¿Puedes proporcionar más información sobre cómo interpretarlos? Gracias.
Desbordamiento de preguntas
1
@cuonglm ¿cuál es la ventaja de usar ip route add blackholefrente al uso del firewall para bloquear esa subred en particular? ¿Existe una diferencia funcional / de rendimiento o una forma diferente de lograr el mismo fin?
Bratchley
1
@Bratchley: depende de su sistema, pero la ruta nula es a menudo mejor, porque su tabla de rutas a menudo es pequeña, mientras que las reglas de iptables a menudo contienen una gran cantidad de reglas. El procesamiento a través de las reglas puede conducir a un gran impacto en el rendimiento.
Cuonglm