firewall

Ansible Роль: Брандмауэр

CI

Установите и настройте брандмауэр (на основе nftables) на Linux.

Требования

Нет.

Переменные роли

Доступные переменные перечислены ниже с их значениями по умолчанию (см. defaults\main.yaml)

Включение NAT и пересылки трафика

  • firewall_forward_enabled: Включить или отключить поддержку пересылки трафика на данном хосте. [по умолчанию: false].
  • firewall_nat_enabled: Включить или отключить поддержку NAT на данном хосте. [по умолчанию: false].

Определение портов по умолчанию

  • in_tcp_port: Разрешен входящий TCP-трафик на этих портах. [по умолчанию: { ssh }].
  • in_udp_port: Разрешен входящий UDP-трафик на этих портах. [по умолчанию: { snmp }].
  • out_tcp_port: Разрешен выходящий TCP-трафик на этих портах. [по умолчанию: { http, https, ssh }].
  • out_udp_port: Разрешен выходящий UDP-трафик на этих портах. [по умолчанию: { domain, bootps , ntp }].

Словари правил

Для каждой цепочки в таблице IP (входящие, исходящие, пересылка) и таблице NAT (nat-prerouting и nat-postrouting) правила nft хранятся в словарях, которые могут быть переопределены на уровне группы и хоста.

Переменные и определения наборов и глобальные правила

Набор переменных и наборы определений, используемые различными цепочками правил и глобальными правилами цепочек, которые могут быть вызваны из других цепочек с использованием правила jump global.

Определение Наборы Глобальная цепочка
nft_define_default nft_set_default nft_global_default
nft_define_group nft_set_group nft_global_group_rules
nft_define_host nft_set_host nft_global_host_rules

Правила таблицы IP

Входящая цепочка Исходящая цепочка Цепочка пересылки
nft_input_default_rules nft_output_default_rules nft_forward_default_rules
nft_input_group_rules nft_output_group_rules nft_forward_group_rules
nft_input_host_rules nft_output_host_rules nft_forward_host_rules

Правила таблицы NAT

Цепочка prerouting Цепочка postrouting
nft_nat_default_prerouting_rules nft_nat_default_postrouting_rules
nft_nat_group_prerouting_rules nft_nat_group_postrouting_rules
nft_nat_host_prerouting_rules nft_nat_host_postrouting_rules

Каждый тип словарей правил будет объединен, и правила будут применяться в алфавитном порядке по ключам (поэтому используется префикс от 000 до 999). Итак:

  • nft_*_default_rules: Определяет правила по умолчанию для всех узлов. Вы можете определить их в group_vars/all.
  • nft_*_group_rules: Можно добавлять правила и переопределять те, которые определены в nft_*_default_rules и nft_*_rules. Вы можете определить их в group_vars/group_servers.
  • nft_*_host_rules: Можно добавлять правила и переопределять те, которые определены в nft_*_default_rules, nft_*_group_rules и nft_*_rules. Вы можете определить их в host_vars/specific_host.

Конфигурация nftables по умолчанию

По умолчанию роль будет генерировать следующие конфигурационные файлы:

/etc/nftables.conf

#!/usr/sbin/nft -f
# Управляемый Ansible

# очистка
flush ruleset

include "/etc/nftables.d/defines.nft"

table inet filter {
    chain global {
        # 000 управление состоянием
        ct state established,related accept
        ct state invalid drop
    }
    include "/etc/nftables.d/sets.nft"
    include "/etc/nftables.d/filter-input.nft"
    include "/etc/nftables.d/filter-output.nft"
}

/etc/nftables.d/defines.nft

  # широковещательные и многоадресные
  define badcast_addr = { 255.255.255.255, 224.0.0.1, 224.0.0.251 }

  # широковещательные и многоадресные
  define ip6_badcast_addr = { ff02::16 }

  # входящий_tcp_разрешить
  define in_tcp_accept = { ssh }

  # входящий_udp_разрешить
  define in_udp_accept = { snmp }

  # исходящий_tcp_разрешить
  define out_tcp_accept = { http, https, ssh }

  # исходящий_udp_разрешить
  define out_udp_accept = { domain, bootps , ntp }

/etc/nftables.d/sets.nft

  set blackhole {
        type ipv4_addr;
        elements = $badcast_addr
    }

  set in_tcp_accept {
        type inet_service; flags interval;
        elements = $in_tcp_accept
    }

  set in_udp_accept {
        type inet_service; flags interval;
        elements = $in_udp_accept
    }

  set ip6blackhole {
        type ipv6_addr;
        elements = $ip6_badcast_addr
    }

  set out_tcp_accept {
        type inet_service; flags interval;
        elements = $out_tcp_accept
    }

  set out_udp_accept {
        type inet_service; flags interval;
        elements = $out_udp_accept
    }

/etc/nftables.d/filter-input.nft

chain input {
        # 000 политика
        type filter hook input priority 0; policy drop;
        # 005 глобальная
        jump global
        # 010 отклонение нежелательного
        ip daddr @blackhole counter drop
        # 011 отклонение нежелательного ipv6
        ip6 daddr @ip6blackhole counter drop
        # 015 localhost
        iif lo accept
        # 050 icmp
        meta l4proto {icmp,icmpv6} accept
        # 200 входящий udp разрешен
        udp dport @in_udp_accept ct state new accept
        # 210 входящий tcp разрешен
        tcp dport @in_tcp_accept ct state new accept
}

/etc/nftables.d/filter-output.nft

chain output {
        # 000 политика
        type filter hook output priority 0; policy drop;
        # 005 глобальная
        jump global
        # 015 localhost
        oif lo accept
        # 050 icmp
        ip protocol icmp accept
        ip6 nexthdr icmpv6 counter accept
        # 200 исходящий udp разрешен
        udp dport @out_udp_accept ct state new accept
        # 210 исходящий tcp разрешен
        tcp dport @out_tcp_accept ct state new accept
        # 250 сброс сделать ssh
        tcp sport ssh tcp flags { rst, psh | ack } counter accept
}

И следующий набор правил на хосте (показан при выполнении команды nft list ruleset):

table inet filter {
        set blackhole {
                type ipv4_addr
                elements = { 224.0.0.1, 224.0.0.251,
                             255.255.255.255 }
        }

        set in_tcp_accept {
                type inet_service
                flags interval
                elements = { 22 }
        }

        set in_udp_accept {
                type inet_service
                flags interval
                elements = { 161 }
        }

        set ip6blackhole {
                type ipv6_addr
                elements = { ff02::16 }
        }

        set out_tcp_accept {
                type inet_service
                flags interval
                elements = { 22, 80, 443 }
        }

        set out_udp_accept {
                type inet_service
                flags interval
                elements = { 53, 67, 123 }
        }

        chain global {
                ct state established,related accept
                ct state invalid drop
        }

        chain input {
                type filter hook input priority filter; policy drop;
                jump global
                ip daddr @blackhole counter packets 0 bytes 0 drop
                ip6 daddr @ip6blackhole counter packets 0 bytes 0 drop
                iif "lo" accept
                meta l4proto { icmp, ipv6-icmp } accept
                udp dport @in_udp_accept ct state new accept
                tcp dport @in_tcp_accept ct state new accept
        }

        chain output {
                type filter hook output priority filter; policy drop;
                jump global
                oif "lo" accept
                ip protocol icmp accept
                ip6 nexthdr ipv6-icmp counter packets 0 bytes 0 accept
                udp dport @out_udp_accept ct state new accept
                tcp dport @out_tcp_accept ct state new accept
                tcp sport 22 tcp flags { rst, psh | ack } counter packets 0 bytes 0 accept
        }
}

Зависимости

Нет.

Примеры плейбуков

Применить правила по умолчанию

Установить и настроить брандмауэр на хосте с правилами по умолчанию.

- hosts: serverx
  roles:
    - ricsanfre.firewall

В group_vars/all.yml вы можете переопределить правила по умолчанию для всех ваших хостов:

nft_input_default_rules:
  000 политика:
    - type filter hook input priority 0; policy drop;
  005 глобальная:
    - jump global
  010 отклонение нежелательного:
    - ip daddr @blackhole counter drop
  011 отклонение нежелательного ipv6:
    - ip6 daddr @ip6blackhole counter drop
  015 localhost:
    - iif lo accept
  050 icmp:
    - meta l4proto {icmp,icmpv6} accept
  200 входящий udp разрешен:
    - udp dport @in_udp_accept ct state new accept
  210 входящий tcp разрешен:
    - tcp dport @in_tcp_accept ct state new accept

Изменение правил по умолчанию на уровне группы

Открываем входящий HTTP-трафик для группы webservers:

В group_vars/webservers.yml это можно сделать, изменив in_tcp_port:

in_tcp_port: { ssh, http }

Или добавив новое конкретное правило:

nft_input_group_rule:
  220 входящий веб разрешен:
    - tcp dport http ct state new accept

Изменение правил по умолчанию + групповых правил на уровне хоста

Открываем входящий HTTPS-трафик для хоста secureweb: В host_vars/secureweb.yml вы хотите открыть https и убрать доступ к http:

nft_input_group_rule:
  220 входящий веб разрешен: []
  230 входящий безопасный веб разрешен:
    - tcp dport https ct state new accept

Правила по умолчанию могут быть удалены

Чтобы "удалить" правила, просто присвойте пустой список существующему ключу словаря: Пример: отключить входящий ICMP-трафик.

nft_input_host_rules:
  050 icmp: []

Удалите правила по умолчанию, позволяющие весь исходящий трафик, в конкретном group_vars/group.yml:

nft_output_group_rules:
  000 политика:
    - type filter hook output priority 0;
  005 глобальная:
    -
  015 localhost:
    -
  050 icmp:
    -
  200 исходящий udp разрешен:
    -
  210 исходящий tcp разрешен:
    -
  250 сброс сделать ssh:
    -

000 политика правило по умолчанию переопределяется, чтобы принимать весь трафик, и остальные правила удаляются.

В заключение, правила в nft_X_host_rules будут перезаписывать правила в nft_X_group_rules, а затем правила в nft_X_group_rules будут перезаписывать правила в nft_X_default_rules.

Лицензия

MIT/BSD

Информация об авторе

Рикардо Санчес (ricsanfre)

О проекте

Nftables-based firewall installation and configuration role

Установить
ansible-galaxy install ricsanfre/ansible-role-firewall
Лицензия
mit
Загрузки
3922
Владелец
Telecom engineer.