Каковы определения addrtype в iptables?


11

Я стремлюсь использовать addrtypeв сочетании с, -srcкак правило, в одной из моих цепочек фильтров, например, чтобы сбросить несколько богоподобных ips:

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

Страница руководства говорит следующее

addrtype
Этот модуль сопоставляет пакеты в зависимости от их типа адреса. Типы адресов используются в сетевом стеке ядра и классифицируют адреса по различным группам. Точное определение этой группы зависит от конкретного протокола третьего уровня.

Возможны следующие типы адресов:

  • UNSPEC неуказанный адрес (т. Е. 0.0.0.0)
  • UNICAST адрес одноадресной рассылки
  • МЕСТНЫЙ местный адрес
  • ВЕЩАНИЕ широковещательный адрес
  • ANYCAST anycast пакет
  • MULTICAST адрес многоадресной рассылки
  • Черная дыра адрес черной дыры
  • Недоступный адрес недоступен
  • ЗАПРЕЩАЕТСЯ запрещенный адрес
  • THROW FIXME
  • NAT FIXME
  • XRESOLVE

Неясно, каковы точные определения, и говорит, что это зависит от конкретного протокола уровня 3. Вот что я думаю:

  • UNICAST (! BROADCAST,! MULTICAST,! ANYCAST)
  • МЕСТНЫЙ ( 127.0.0.0/8)
  • ВЕЩАНИЕ ( *.*.*.255)
  • ANYCAST ( *.*.*.*)
  • МУЛЬТИКАСТ ( 224.0.0.0/4)

Кто-нибудь имеет четкое представление о том, что это значит и как это реализовано с помощью iptables (например, как он узнает, где, черт возьми, находится BLACKHOLE)?


2
LOCALэто, безусловно, нет 127.0.0.0/8. Я выяснил трудный путь :( ... очевидно, что локальный адрес относится к любому адресу, назначенному интерфейсу.
0xC0000022L

1
@ 0xC0000022L Согласно RFC990, 127.0.0.0/8 будет зарезервирован специально для шлейфа, однако LOCAL не ограничиваются только этим диапазоном.
Qwerty01

Ответы:


3

Я думаю, что от вас зависит, чтобы ядро ​​знало, какой тип адреса черной дыры.

Из файла xt_addrtype.h в исходном коде iptables вы можете увидеть:

/* 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,                                             
};

И в rtnetlink.h, вы увидите то же определение:

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

Вы можете iptablesиспользовать то же определение типа адреса с сетевым стеком ядра tcp.

Тогда из 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.

Поэтому, когда вы определяете маршрут к сети ipкомандой и помечаете его как маршрут черной дыры, ядро ​​теперь делает этот сетевой адрес типом черной дыры:

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

1
Вы показываете системные заголовочные файлы и говорите, что это зависит от администратора?
Павел Шимерда

Я сказал blackholeтип адреса, а не весь тип адреса. Я показываю, что iptables addrtypeрасширение использует то же определение addrtype, что и ядро. И определение ядра типа адреса можно увидеть в man ip.
cuonglm

Спасибо, что отвечает только на чёрную дыру. Я попытался перечислить ips из команды ip, ip route list type localно все типы выдают пустую строку, кроме одноадресной, которая дает 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. Можете ли вы предоставить больше информации о том, как их интерпретировать? Благодарю.
переполнение вопроса

1
@cuonglm В чем преимущество использования ip route add blackholeбрандмауэра по сравнению с блокировкой этой конкретной подсети? Есть ли разница между функционалом и производительностью или иным способом достижения той же цели?
Братчли

1
@Bratchley: это зависит от вашей системы, но нулевой маршрут часто лучше, потому что ваша таблица маршрутов часто мала, а правила iptables часто содержат огромное количество правил. Обработка с помощью правил может привести к значительному снижению производительности.
cuonglm
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.