nftables.conf.tmpl 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. #!/usr/sbin/nft -f
  2. #
  3. # /etc/nftables.conf - FFHO packet filter configuration
  4. #
  5. {%- set node_config = salt['pillar.get']('nodes:' ~ grains['id']) %}
  6. {%- set nf_cc = node_config.get ('nftables', {}) %}
  7. {%- set roles = node_config.get ('roles', []) %}
  8. {%- set services = node_config.get ('services', []) %}
  9. {%- set fw_policy = salt['pillar.get']('firewall:policy', {}) %}
  10. {%- set acls = salt['pillar.get']('firewall:acls') %}
  11. {%- set admin_access = salt['pillar.get']('firewall:admin_access') %}
  12. {%- set ssh = salt['pillar.get']("firewall:ssh") %}
  13. {%- set icinga2_queriers = salt['pillar.get']('monitoring:icinga2:queriers', []) %}
  14. {%- set nms_list = salt['pillar.get']('globals:snmp:nms_list', []) %}
  15. {%- set forward = salt['ffho_netfilter.generate_forward_policy'](fw_policy, roles, nf_cc) %}
  16. flush ruleset
  17. table ip filter {
  18. set ibgp-peers {
  19. type ipv4_addr
  20. elements = {
  21. 10.132.255.1, # cr01.in.ffho.net
  22. 10.132.255.2, # cr02.in.ffho.net
  23. 10.132.255.3, # cr03.in.ffho.net
  24. }
  25. }
  26. chain input {
  27. type filter hook input priority 0; policy drop;
  28. iifname "lo" counter accept
  29. ip protocol icmp counter jump icmp_chain
  30. tcp dport 7 counter drop comment "Ignore echo protocol queries"
  31. ct state invalid counter drop
  32. counter jump admin_access
  33. counter jump monitoring
  34. tcp dport 22 counter jump ssh
  35. {%- if 'router' in roles %}
  36. ip daddr { 224.0.0.5, 224.0.0.6 } meta l4proto ospf accept
  37. tcp dport 179 counter jump bgp
  38. {%- endif %}
  39. ct state related,established counter accept
  40. counter jump services
  41. limit rate 1/second burst 3 packets counter log prefix "nf input: "
  42. limit rate 1/second burst 3 packets counter reject with icmp type admin-prohibited
  43. counter drop
  44. }
  45. chain forward {
  46. type filter hook forward priority 0; policy {{ forward['policy'] }}; # {{ forward['policy_reason'] }}
  47. {%- for rule in forward['rules'].get ('4', []) %}
  48. {{ rule }}
  49. {%- endfor %}
  50. {%- if forward['policy'] == 'drop' %}
  51. limit rate 1/second burst 3 packets counter log prefix "nf forward: "
  52. limit rate 1/second burst 3 packets counter reject with icmp type admin-prohibited
  53. {%- endif %}
  54. }
  55. chain icmp_chain {
  56. icmp type { echo-request, destination-unreachable, time-exceeded } counter accept
  57. }
  58. chain admin_access {
  59. {%- for pfx in admin_access[4].keys()|sort %}
  60. {%- set comment = admin_access[4][pfx] %}
  61. ip saddr {{ pfx }} counter accept comment "{{ comment }}"
  62. {%- endfor %}
  63. }
  64. {%- if 'router' in roles %}
  65. chain bgp {
  66. ip saddr @ibgp-peers counter accept comment "iBGP peers"
  67. # TODO: Add external BGP peers, if any
  68. }
  69. {%- endif %}
  70. chain monitoring {
  71. {%- for ip in icinga2_queriers if not ":" in ip %}
  72. ip saddr {{ ip }} counter accept comment "Icinga2"
  73. {%- endfor %}
  74. {%- for ip in nms_list if not ":" in ip %}
  75. ip saddr {{ ip }} udp dport 161 counter accept comment "NMS"
  76. {%- endfor %}
  77. }
  78. chain ssh {
  79. {%- for pfx in ssh[4].keys()|sort %}
  80. {%- set comment = ssh[4][pfx] %}
  81. ip saddr {{ pfx }} counter accept comment "{{ comment }}"
  82. {%- endfor %}
  83. }
  84. chain services {
  85. {%- for rule in salt['ffho_netfilter.generate_service_rules'](services, acls, 4) %}
  86. {{ rule }}
  87. {%- endfor %}
  88. }
  89. chain log-drop {
  90. limit rate 1/second burst 3 packets counter log prefix "netfilter: "
  91. counter drop
  92. }
  93. chain log-reject {
  94. limit rate 1/second burst 3 packets counter log prefix "netfilter: "
  95. limit rate 1/second burst 3 packets counter reject with icmp type admin-prohibited
  96. counter drop
  97. }
  98. }
  99. table ip6 filter {
  100. set ibgp-peers {
  101. type ipv6_addr
  102. elements = {
  103. 2a03:2260:2342:ffff::1, # cr01.in.ffho.net
  104. 2a03:2260:2342:ffff::2, # cr02.in.ffho.net
  105. 2a03:2260:2342:ffff::3, # cr03.in.ffho.net
  106. }
  107. }
  108. chain input {
  109. type filter hook input priority 0; policy drop;
  110. iifname "lo" counter accept
  111. ip6 nexthdr icmpv6 counter jump icmp_chain
  112. tcp dport 7 counter drop comment "Ignore echo protocol queries"
  113. ct state invalid counter drop comment "Drop packets that do not make sense."
  114. counter jump admin_access
  115. counter jump monitoring
  116. tcp dport 22 counter jump ssh
  117. {%- if 'router' in roles %}
  118. ip6 saddr fe80::/64 ip6 daddr { fe80::/10, ff02::5, ff02::6 } meta l4proto ospf accept
  119. tcp dport 179 counter jump bgp
  120. {%- endif %}
  121. ct state related,established counter accept comment "Allow established connections."
  122. counter jump services
  123. limit rate 1/second burst 3 packets counter log prefix "netfilter: "
  124. limit rate 1/second burst 3 packets counter reject with icmpv6 type admin-prohibited
  125. counter drop
  126. }
  127. chain forward {
  128. type filter hook forward priority 0; policy {{ forward['policy'] }}; # {{ forward['policy_reason'] }}
  129. {%- for rule in forward['rules'].get ('6', []) %}
  130. {{ rule }}
  131. {%- endfor %}
  132. {%- if forward['policy'] == 'drop' %}
  133. limit rate 1/second burst 3 packets counter log prefix "nf forward: "
  134. limit rate 1/second burst 3 packets counter reject with icmp type admin-prohibited
  135. {%- endif %}
  136. }
  137. chain icmp_chain {
  138. icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, parameter-problem, echo-request, echo-reply } counter accept
  139. icmpv6 type { nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, ind-neighbor-solicit, ind-neighbor-advert } ip6 hoplimit 255 counter accept
  140. }
  141. chain admin_access {
  142. {%- for pfx in admin_access[6].keys()|sort %}
  143. {%- set comment = admin_access[6][pfx] %}
  144. ip6 saddr {{ pfx }} counter accept comment "{{ comment }}"
  145. {%- endfor %}
  146. }
  147. {%- if 'router' in roles %}
  148. chain bgp {
  149. ip6 saddr @ibgp-peers counter accept comment "iBGP peers"
  150. # TODO: Add external BGP peers, if any
  151. }
  152. {%- endif %}
  153. chain monitoring {
  154. {%- for ip in icinga2_queriers if ":" in ip %}
  155. ip6 saddr {{ ip }} counter accept comment "Icinga2"
  156. {%- endfor %}
  157. {%- for ip in nms_list if ":" in ip %}
  158. ip6 saddr {{ ip }} udp dport 161 counter accept comment "NMS"
  159. {%- endfor %}
  160. }
  161. chain ssh {
  162. {%- for pfx in ssh[6].keys()|sort %}
  163. {%- set comment = ssh[6][pfx] %}
  164. ip6 saddr {{ pfx }} counter accept comment "{{ comment }}"
  165. {%- endfor %}
  166. }
  167. chain services {
  168. {%- for rule in salt['ffho_netfilter.generate_service_rules'](services, acls, 6) %}
  169. {{ rule }}
  170. {%- endfor %}
  171. }
  172. chain log-drop {
  173. limit rate 1/second burst 3 packets counter log prefix "netfilter: "
  174. counter drop
  175. }
  176. chain log-reject {
  177. limit rate 1/second burst 3 packets counter log prefix "netfilter: "
  178. limit rate 1/second burst 3 packets counter reject with icmpv6 type admin-prohibited
  179. counter drop
  180. }
  181. }