*filter # By default, drop incoming packets: :INPUT DROP [0:0] :FORWARD DROP [0:0] # By default, accept outgoing packets: :OUTPUT ACCEPT [0:0] # Accept packets for localhost: -A INPUT -i lo -j ACCEPT # Accept any packet for an open connection: -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # The SSH port is always open: {% set ssh_port = hostvars[inventory_hostname].ansible_port %} # Open TCP ports: {% set tcp_ports = firewall_ports_tcp + firewall_ports4_tcp + [ssh_port] %} {% set tcp_ports = tcp_ports | unique %} {% for port in tcp_ports %} {% set num = port.port if port.port is defined else port %} {% set src = '-s ' + port.source if port.source is defined else '' %} -A INPUT -p tcp {{ src }} --dport {{ num }} -m conntrack --ctstate NEW -j ACCEPT {% endfor %} # Open UDP ports: {% set udp_ports = firewall_ports_udp + firewall_ports4_udp %} {% set udp_ports = udp_ports | unique %} {% for port in udp_ports %} {% set num = port.port if port.port is defined else port %} {% set src = '-s ' + port.source if port.source is defined else '' %} -A INPUT -p udp {{ src }} --dport {{ num }} -j ACCEPT {% endfor %} # Any additional IPv4 rules: {{ firewall_rules4 | join('\n') }} # ICMP; allow only pings and rate-limit them: -A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit-upto 5/s --hashlimit-mode srcip --hashlimit-srcmask 32 --hashlimit-name icmp-echo-drop -j ACCEPT # Log denies (this must be at the bottom of the file): -A INPUT -m limit --limit 3/min -j LOG --log-prefix "iptables denied: " --log-level 4 COMMIT