ansible role for deploying firewalld rules
This commit is contained in:
commit
feff22b617
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
__pycache__
|
20
LICENSE
Normal file
20
LICENSE
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2024 Shane Wadleigh
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
67
README.md
Normal file
67
README.md
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
# ansible-role-firewalld
|
||||||
|
|
||||||
|
This role allows adding and removing most types of firewalld rules from the default zone
|
||||||
|
|
||||||
|
- https://firewalld.org/
|
||||||
|
|
||||||
|
|
||||||
|
## Task Configuration
|
||||||
|
|
||||||
|
```
|
||||||
|
- name: Test adding and removeing services etc
|
||||||
|
hosts: test
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- role: firewalld
|
||||||
|
firewalld_ipset_add:
|
||||||
|
- name: peers
|
||||||
|
ips:
|
||||||
|
- 207.188.6.74
|
||||||
|
- 207.188.6.12
|
||||||
|
- 207.188.6.49
|
||||||
|
|
||||||
|
firewalld_add:
|
||||||
|
- name: public
|
||||||
|
masquerade: false
|
||||||
|
forward: true
|
||||||
|
services:
|
||||||
|
- http
|
||||||
|
- https
|
||||||
|
- ssh
|
||||||
|
ports:
|
||||||
|
- 53/tcp
|
||||||
|
- 53/udp
|
||||||
|
- 67/udp
|
||||||
|
- 547/udp
|
||||||
|
forwards:
|
||||||
|
- port: 443
|
||||||
|
proto: udp
|
||||||
|
to: 51820
|
||||||
|
- name: ftl
|
||||||
|
interfaces:
|
||||||
|
- lo
|
||||||
|
ports:
|
||||||
|
- 4711/tcp
|
||||||
|
|
||||||
|
firewalld_remove:
|
||||||
|
- name: public
|
||||||
|
masquerade: true
|
||||||
|
services:
|
||||||
|
- http
|
||||||
|
- https
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Deployment and Removal
|
||||||
|
|
||||||
|
Deploy
|
||||||
|
|
||||||
|
```
|
||||||
|
ansible-playbook -i hosts site.yml --tags=firewalld --limit=somehost
|
||||||
|
```
|
||||||
|
|
||||||
|
Remove
|
||||||
|
|
||||||
|
```
|
||||||
|
ansible-playbook -i hosts site.yml --tags=firewalld --extra-vars "firewall_action=remove" --limit=somehost
|
||||||
|
```
|
6
defaults/main.yml
Normal file
6
defaults/main.yml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
firewalld_packages:
|
||||||
|
- firewalld
|
||||||
|
|
||||||
|
firewalld_service_name: firewalld
|
||||||
|
firewalld_default_zone: public
|
12
handlers/main.yml
Normal file
12
handlers/main.yml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
- name: Start/Enable firewalld
|
||||||
|
listen: start-firewalld
|
||||||
|
ansible.builtin.systemd:
|
||||||
|
name: "{{ firewalld_service_name }}"
|
||||||
|
state: restarted
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
- name: Reload firewalld
|
||||||
|
listen: reload-firewalld
|
||||||
|
ansible.builtin.command: "firewall-cmd --reload"
|
35
meta/main.yml
Normal file
35
meta/main.yml
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
dependencies: []
|
||||||
|
|
||||||
|
galaxy_info:
|
||||||
|
role_name: firewalld
|
||||||
|
author: srw
|
||||||
|
description: Ansible role for configuring firewalld rules
|
||||||
|
company: "Midwestern Mac, LLC"
|
||||||
|
license: "license (BSD, MIT)"
|
||||||
|
min_ansible_version: "2.10"
|
||||||
|
platforms:
|
||||||
|
- name: Fedora
|
||||||
|
versions:
|
||||||
|
- all
|
||||||
|
- name: Debian
|
||||||
|
versions:
|
||||||
|
- buster
|
||||||
|
- bullseye
|
||||||
|
- bookworm
|
||||||
|
- name: Ubuntu
|
||||||
|
versions:
|
||||||
|
- bionic
|
||||||
|
- focal
|
||||||
|
- jammy
|
||||||
|
- name: Alpine
|
||||||
|
version:
|
||||||
|
- all
|
||||||
|
- name: ArchLinux
|
||||||
|
versions:
|
||||||
|
- all
|
||||||
|
galaxy_tags:
|
||||||
|
- server
|
||||||
|
- system
|
||||||
|
- firewall
|
||||||
|
- security
|
23
tasks/ipsets.yml
Normal file
23
tasks/ipsets.yml
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
- name: Manage ipsets
|
||||||
|
tags: firewalld
|
||||||
|
block:
|
||||||
|
|
||||||
|
- name: new ipset
|
||||||
|
ansible.builtin.shell: firewall-cmd -q --permanent --new-ipset="{{ item.name }}" --type=hash:ip || echo "ipset already exists"
|
||||||
|
changed_when: true
|
||||||
|
ignore_errors: true
|
||||||
|
loop: "{{ firewall_rules }}"
|
||||||
|
when:
|
||||||
|
- firewall_action == "add"
|
||||||
|
- firewall_rules is defined and firewall_rules | length > 0
|
||||||
|
|
||||||
|
- name: "{{ firewall_action }} ip"
|
||||||
|
ansible.builtin.command: firewall-cmd --permanent --ipset={{ item.name }}{% for ip in item.ips %} --{{ firewall_action }}-entry={{ ip }}{% endfor %}
|
||||||
|
changed_when: true
|
||||||
|
loop: "{{ firewall_rules }}"
|
||||||
|
when:
|
||||||
|
- firewall_rules is defined
|
||||||
|
- item.ips is defined and item.ips | length > 0
|
||||||
|
|
||||||
|
notify: reload-firewalld
|
53
tasks/main.yml
Normal file
53
tasks/main.yml
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
---
|
||||||
|
- name: Setup and configure firewalld service
|
||||||
|
tags: firewalld
|
||||||
|
block:
|
||||||
|
|
||||||
|
- name: Install firewalld packages
|
||||||
|
ansible.builtin.package:
|
||||||
|
name: "{{ item }}"
|
||||||
|
state: present
|
||||||
|
with_items: "{{ firewalld_packages }}"
|
||||||
|
when:
|
||||||
|
- firewalld_packages | length > 0
|
||||||
|
- firewalld_add is defined and firewalld_add | length > 0
|
||||||
|
- firewalld_ipset_add is defined and firewalld_ipset_add | length > 0
|
||||||
|
notify: start-firewalld
|
||||||
|
|
||||||
|
# Add and Remove ipsets
|
||||||
|
|
||||||
|
- name: Removing ipsets
|
||||||
|
ansible.builtin.include_tasks: ipsets.yml
|
||||||
|
vars:
|
||||||
|
firewall_action: "remove"
|
||||||
|
firewall_rules: "{{ firewalld_ipset_remove }}"
|
||||||
|
when:
|
||||||
|
- firewalld_ipset_remove is defined and firewalld_ipset_remove | length > 0
|
||||||
|
|
||||||
|
- name: Adding ipsets
|
||||||
|
ansible.builtin.include_tasks: ipsets.yml
|
||||||
|
vars:
|
||||||
|
firewall_action: "add"
|
||||||
|
firewall_rules: "{{ firewalld_ipset_add }}"
|
||||||
|
when:
|
||||||
|
- firewalld_ipset_add is defined and firewalld_ipset_add | length > 0
|
||||||
|
- firewalld_add is defined and firewalld_add | length > 0
|
||||||
|
|
||||||
|
# Add and Remove Rules
|
||||||
|
|
||||||
|
- name: Removing interfaces, services, ports, rules
|
||||||
|
ansible.builtin.include_tasks: rules.yml
|
||||||
|
vars:
|
||||||
|
firewall_action: "remove"
|
||||||
|
firewall_rules: "{{ firewalld_remove }}"
|
||||||
|
when:
|
||||||
|
- firewalld_remove is defined and firewalld_remove | length > 0
|
||||||
|
|
||||||
|
|
||||||
|
- name: Adding zones, interfaces, services, ports, rules
|
||||||
|
ansible.builtin.include_tasks: rules.yml
|
||||||
|
vars:
|
||||||
|
firewall_action: "add"
|
||||||
|
firewall_rules: "{{ firewalld_add }}"
|
||||||
|
when:
|
||||||
|
- firewalld_add is defined and firewalld_add | length > 0
|
82
tasks/rules.yml
Normal file
82
tasks/rules.yml
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
---
|
||||||
|
- name: Create Zones, then apply interfaces and rules
|
||||||
|
tags: firewalld
|
||||||
|
block:
|
||||||
|
|
||||||
|
- name: New zones
|
||||||
|
ansible.builtin.shell: firewall-cmd -q --permanent --new-zone="{{ item.name }}" || echo "zone already exists"
|
||||||
|
changed_when: true
|
||||||
|
ignore_errors: true
|
||||||
|
loop: "{{ firewall_rules }}"
|
||||||
|
when:
|
||||||
|
- firewall_action == "add"
|
||||||
|
- firewall_rules is defined and firewall_rules | length > 0
|
||||||
|
|
||||||
|
- name: "{{ firewall_action }} interfaces"
|
||||||
|
ansible.builtin.command: firewall-cmd --permanent --zone={{ item.name }}{% for interface in item.interfaces %} --{{ firewall_action }}-interface={{ interface }}{% endfor %}
|
||||||
|
changed_when: true
|
||||||
|
loop: "{{ firewall_rules }}"
|
||||||
|
when:
|
||||||
|
- firewall_rules is defined
|
||||||
|
- item.interfaces is defined and item.interfaces | length > 0
|
||||||
|
|
||||||
|
- name: "{{ firewall_action }} services"
|
||||||
|
ansible.builtin.command: firewall-cmd --permanent --zone={{ item.name }}{% for service in item.services %} --{{ firewall_action }}-service={{ service }}{% endfor %}
|
||||||
|
changed_when: true
|
||||||
|
loop: "{{ firewall_rules }}"
|
||||||
|
when:
|
||||||
|
- firewall_rules is defined
|
||||||
|
- item.services is defined and item.services | length > 0
|
||||||
|
|
||||||
|
- name: "{{ firewall_action }} ports"
|
||||||
|
ansible.builtin.command: firewall-cmd --permanent --zone={{ item.name }}{% for port in item.ports %} --{{ firewall_action }}-port={{ port }}{% endfor %}
|
||||||
|
changed_when: true
|
||||||
|
loop: "{{ firewall_rules }}"
|
||||||
|
when:
|
||||||
|
- firewall_rules is defined
|
||||||
|
- item.ports is defined and item.ports | length > 0
|
||||||
|
|
||||||
|
- name: "{{ firewall_action }} rich rules"
|
||||||
|
ansible.builtin.command: firewall-cmd --permanent --zone={{ item.name }}{% for rule in item.rules %} --{{ firewall_action }}-rich-rule='{{ rule }}'{% endfor %}
|
||||||
|
changed_when: true
|
||||||
|
loop: "{{ firewall_rules }}"
|
||||||
|
when:
|
||||||
|
- firewall_rules is defined
|
||||||
|
- item.rules is defined and item.rules | length > 0
|
||||||
|
|
||||||
|
- name: "{{ firewall_action }} sources"
|
||||||
|
ansible.builtin.command: firewall-cmd --permanent --zone={{ item.name }}{% for source in item.sources %} --{{ firewall_action }}-source={{ source }}{% endfor %}
|
||||||
|
changed_when: true
|
||||||
|
loop: "{{ firewall_rules }}"
|
||||||
|
when:
|
||||||
|
- firewall_rules is defined
|
||||||
|
- item.sources is defined and item.sources | length > 0
|
||||||
|
|
||||||
|
- name: "{{ firewall_action }} forwards"
|
||||||
|
ansible.builtin.command: firewall-cmd --permanent --zone={{ item.name }}{% for forward in item.forwards %} --{{ firewall_action }}-forward-port=port={{ forward.port }}:proto={{ forward.proto | d('tcp')}}:toport={{ forward.to }}:toaddr={{ forward.toaddr | d('') }}{% endfor %}
|
||||||
|
changed_when: true
|
||||||
|
loop: "{{ firewall_rules }}"
|
||||||
|
when:
|
||||||
|
- firewall_rules is defined
|
||||||
|
- item.forwards is defined and item.forwards | length > 0
|
||||||
|
|
||||||
|
- name: Set forwarding
|
||||||
|
ansible.builtin.command: firewall-cmd --permanent {% if item.forward %}--add-forward{% else %}--remove-forward{% endif %}
|
||||||
|
changed_when: true
|
||||||
|
loop: "{{ firewall_rules }}"
|
||||||
|
when:
|
||||||
|
- firewall_rules is defined and firewall_rules | length > 0
|
||||||
|
- item.forward is defined
|
||||||
|
|
||||||
|
- name: Set masquerading
|
||||||
|
ansible.builtin.firewalld:
|
||||||
|
zone: "{{ item.name }}"
|
||||||
|
masquerade: "{{ item.masquerade | d('false') }}"
|
||||||
|
permanent: true
|
||||||
|
state: enabled
|
||||||
|
loop: "{{ firewall_rules }}"
|
||||||
|
when:
|
||||||
|
- firewall_rules is defined and firewall_rules | length > 0
|
||||||
|
- item.masquerade is defined
|
||||||
|
|
||||||
|
notify: reload-firewalld
|
Loading…
Reference in New Issue
Block a user