Quais são as definições de addrtype no iptables?


11

Estou interessado em usar addrtypeem combinação com, -srccomo regra, em uma das minhas cadeias de filtros, assim, para soltar alguns ips de bogon:

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

A página do manual diz o seguinte

addrtype
Este módulo corresponde a pacotes com base em seu tipo de endereço. Os tipos de endereço são usados ​​na pilha de rede do kernel e categorizam os endereços em vários grupos. A definição exata desse grupo depende do protocolo específico da camada três.

Os seguintes tipos de endereço são possíveis:

  • UNSPEC um endereço não especificado (ou seja, 0.0.0.0)
  • UNICAST um endereço unicast
  • LOCAL um endereço local
  • TRANSMISSÃO um endereço de transmissão
  • ANYCAST um pacote anycast
  • MULTICAST um endereço multicast
  • BLACKHOLE um endereço de buraco negro
  • Inacessível um endereço inacessível
  • PROIBIR um endereço proibido
  • THROW FIXME
  • NAT FIXME
  • XRESOLVE

Não está claro quais são as definições exatas e diz que depende do protocolo específico da camada 3. Isto é o que eu penso:

  • UNICAST (! BROADCAST,! MULTICAST,! ANYCAST)
  • LOCAL ( 127.0.0.0/8)
  • TRANSMISSÃO ( *.*.*.255)
  • ANYCAST ( *.*.*.*)
  • MULTICAST ( 224.0.0.0/4)

Alguém tem uma idéia clara do que isso significa e como é implementado pelo iptables (por exemplo, como ele sabe onde diabos está o BLACKHOLE)?


2
LOCALcertamente não é 127.0.0.0/8. Eu descobri da maneira mais difícil :( ... aparentemente um endereço local refere-se a qualquer endereço atribuído a uma interface.
0xC0000022L

1
@ 0xC0000022L De acordo com a RFC990, 127.0.0.0/8 é reservada especificamente para loopback, no entanto, LOCAL não se limita apenas a esse intervalo.
Qwerty01

Respostas:


3

Eu acho que depende de você fazer o kernel saber qual é o tipo de endereço do buraco negro.

De xt_addrtype.h arquivo no iptables código-fonte, você pode 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,                                             
};

E em rtnetlink.h, você verá a mesma definição:

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                                                                   
};

Você pode ver iptablesusar a mesma definição de tipo de endereço com a pilha de rede do kernel tcp.

Depois 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.

Portanto, quando você define uma rota para uma rede por ipcomando e a marca como rota de buraco negro, o kernel agora faz esse tipo de buraco de endereço de rede:

ip route add blackhole X.X.X.X/24

1
Você está mostrando os arquivos de cabeçalho do sistema e dizendo que depende do administrador?
Pavel Šimerda

Eu disse o blackholetipo de endereço, nem todo tipo de endereço. Eu mostro que a iptables addrtypeextensão usa a mesma definição addrtype com o kernel. E a definição do kernel do tipo de endereço pode ser vista em man ip.
cuonglm

Obrigado, isso apenas responde a parte no buraco negro. Eu tentei listar os ips do comando ip dessa forma, ip route list type localmas todos os tipos produzem uma string vazia, exceto o unicast que fornece 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. Você pode fornecer mais informações sobre como interpretá-las? Obrigado.
Pergunta Overflow

1
@cuonglm Qual é a vantagem de usar ip route add blackholeversus usar o firewall para bloquear essa sub-rede específica? Existe uma diferença funcional / de desempenho ou uma maneira diferente de atingir o mesmo fim?
Bratchley 6/10

1
@Bratchley: depende do seu sistema, mas a rota nula geralmente é melhor, porque sua tabela de rotas geralmente é pequena, enquanto as regras do iptables geralmente contêm muitas regras. O processamento das regras pode levar a um enorme impacto no desempenho.
cuonglm
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.