Esta web utiliza cookies, puedes ver nuestra política de cookies, aquí Si continuas navegando estás aceptándola

Gestión de reglas iptables con Ansible


Instalamos las librerías de python necesarias:

emerge -av dev-python/python-iptables
apt install python-iptables

Creamos los directorios necesarios para Ansible:

mkdir /etc/ansible/
chown -R root:kr0m /etc/ansible/
chmod 775 /etc/ansible/

Creamos un grupo de servidores llamado test:

vi /etc/ansible/hosts
[test]
SERVER1

Escribimos el playbook:

vi iptables.yml
- hosts: test
  tasks:
  - name: Firewall rule - flush previous INPUT ACLs
    iptables:
      flush: true
      chain: INPUT
  - name: Firewall rule - flush previous OUTPUT ACLs
    iptables:
      flush: true
      chain: OUTPUT
  - name: Firewall rule - allow all INPUT loopback traffic
    iptables:
      action: append
      chain: INPUT
      in_interface: lo
      jump: ACCEPT
  - name: Firewall rule - allow all OUTPUT loopback traffic
    iptables:
      action: append
      chain: OUTPUT
      out_interface: lo
      jump: ACCEPT
  - name: Firewall rule - allow INPUT ssh traffic
    iptables:
      action: append
      chain: INPUT
      protocol: tcp
      destination_port: 22
      jump: ACCEPT
  - name: Firewall rule - allow OUTPUT ssh traffic
    iptables:
      action: append
      chain: OUTPUT
      protocol: tcp
      source_port: 22
      jump: ACCEPT
  - name: Firewall rule - allow INPUT http traffic
    iptables:
      action: append
      chain: INPUT
      protocol: tcp
      destination_port: 80
      jump: ACCEPT
  - name: Firewall rule - allow OUTPUT http traffic
    iptables:
      action: append
      chain: OUTPUT
      protocol: tcp
      source_port: 80
      jump: ACCEPT
  - name: Firewall rule - deny all INPUT traffic
    iptables:
      action: append
      chain: INPUT
      jump: DROP
  - name: Firewall rule - deny all OUTPUT traffic
    iptables:
      action: append
      chain: OUTPUT
      jump: DROP

Comprobamos que ha aplicado la config correctamente:

root@test:~# iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
4    DROP       all  --  0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp spt:22
2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp spt:80
3               all  --  0.0.0.0/0            0.0.0.0/0           

NOTA: No he sido capaz de aplicar un DROP por defecto, la única manera con la que he podio hacerlo es dejando el DROP como última ACL tanto en INPUT como OUTPUT.

Algo muy común es tener unas reglas genéricas y otras mas específicas, para poder reutilizar playbooks haremos uso de los includes:

- name: Load generic fw rules
  import_playbook: genericFw.yml

- hosts: all
  tasks:
  - name: Firewall rule - allow INPUT custom host
    iptables:
      action: insert
      chain: INPUT
      rule_num: 1
      source: 1.1.1.1
      jump: ACCEPT
  - name: Firewall rule - allow OUTPUT custom host
    iptables:
      action: insert
      chain: OUTPUT
      rule_num: 1
      destination: 1.1.1.1
      jump: ACCEPT

Autor: Kr0m -- 06/08/2018 22:08:42