nftables.conf.tmpl 5.2 KB

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