---
- name: Настройка nftables с белым списком портов и VIP адресами
  hosts: hip
  become: yes
  gather_facts: yes
  
  vars:
    # VIP адреса (полный доступ)
    vip_addresses:
      - "192.168.1.100"
      - "10.10.10.50"
      - "172.16.0.10"
    
    # Белый список TCP портов
    white_list_tcp_ports:
      - 35130      # SSH
      - 80      # HTTP
      - 443     # HTTPS
      - 5432    # PostgreSQL
      - 8080    # Jenkins/Proxy
      - 8443    # Alternative HTTPS
    
    # Белый список UDP портов
    white_list_udp_ports:
      - 53      # DNS
      - 123     # NTP
      - 1194    # OpenVPN
    
    # Дополнительные настройки
    enable_ip_forwarding: true
    nftables_log_prefix_input: "[nftables-input] Dropped: "
    nftables_log_prefix_forward: "[nftables-forward] Blocked non-whitelist port: "
  
  tasks:
    - name: Установка nftables
      apt:
        name: nftables
        state: present
        update_cache: yes
    
    - name: Создание директории для шаблонов (если не существует)
      file:
        path: /etc/nftables
        state: directory
        mode: '0755'
    
    - name: Копирование конфигурации nftables из шаблона
      template:
        src: templates/nft/nftables.conf.j2
        dest: /etc/nftables.conf
        mode: '0644'
        backup: yes
      notify: restart nftables
    
    - name: Включение IP forwarding (если нужно)
      sysctl:
        name: "{{ item }}"
        value: '1'
        sysctl_set: yes
        state: present
        reload: yes
      loop:
        - net.ipv4.ip_forward
        - net.ipv6.conf.all.forwarding
      when: enable_ip_forwarding
    
    - name: Убеждаемся что nftables запущен и включен
      systemd:
        name: nftables
        state: started
        enabled: yes
    
    - name: Проверка синтаксиса конфигурации
      command: nft -c -f /etc/nftables.conf
      register: nft_check
      changed_when: false
    
    - name: Вывод результата проверки
      debug:
        msg: "✅ Конфигурация nftables валидна"
      when: nft_check.rc == 0
    
    - name: Применение правил (если не были применены при старте)
      command: nft -f /etc/nftables.conf
      when: nft_check.rc == 0
      notify: restart nftables
  
  handlers:
    - name: restart nftables
      systemd:
        name: nftables
        state: restarted
    
    - name: validate nftables
      command: nft -c -f /etc/nftables.conf
      listen: "restart nftables"
