Advertisement
cesarzeta

nftrules

Apr 8th, 2017
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 6.08 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. #Limpiamos reglas existentes.
  4.  
  5. nft flush ruleset
  6.  
  7. #Creamos las tablas que vamos a utilizar con el nombre filter.
  8. # En todo momento voy a filtrar la entrada y salida de los
  9. #puertos de mi equipo y no los del equipo o servidor remoto.
  10. #No creo la tabla para NAT porque no lo voy a usar en este equipo.
  11.  
  12. nft add table ip filter
  13. nft add table ip6 filter
  14.  
  15.  
  16. #Creamos la cadena que va a filtrar los paquetes antes de ingresarlos al
  17. #proceso con la política de bloqueo,  luego abrimos.
  18. nft add chain ip filter input { type filter hook input priority 0\; policy drop\; }
  19.  
  20. #Creamos las reglas para bloquear sitios comprobados como peligrosos o atacantes.
  21.  
  22. #Variable que contiene las Ips de atacantes.
  23. Prohibidos="184.168.113.82,207.171.166.22,72.21.210.29,72.21.206.80,54.245.112.177,\
  24.             37.230.114.78,37.187.86.215,80.87.131.12,144.76.0.242,144.76.1.130,\
  25.             76.164.226.146,184.154.139.166,239.255.255.250,200.123.197.170,\
  26.             54.231.0.128,23.235.44.193,207.244.65.143,72.10.36.226,162.125.18.133,52.201.32.182,157.249.32.164"
  27.            
  28. #Agregamos las reglas que van a bloquear los sitios atacantes creando un
  29. #array con las direcciones prohibidas y mediante un bucle for.
  30.  
  31. IFS=',' read -ra ADDR <<< "$Prohibidos"
  32. for i in "${ADDR[@]}"; do
  33.     nft add rule ip filter input ip saddr $i counter drop
  34. done
  35.  
  36. #Prohibo que se haga ping a mi equipo para evitar el icmp flood y similares.
  37. nft add rule ip filter input ip protocol icmp  counter drop
  38. nft add rule ip filter input ct state invalid counter drop
  39.  
  40. #Reglas que inspeccionan las cabeceras de los paquetes TCP para evitar los ataques DoS/DDoS más comunes.
  41. #Probado con hping3 y funciona.
  42. nft add rule ip filter input tcp flags "& (fin|syn) == fin|syn" counter drop
  43. nft add rule ip filter input tcp flags "& (syn|rst) == syn|rst" counter drop
  44. nft add rule ip filter input tcp flags "& (fin|syn|rst|psh|ack|urg) < fin" counter drop
  45. nft add rule ip filter input tcp flags "& (fin|syn|rst|psh|ack|urg) == fin|psh|urg" counter drop
  46.  
  47. #Habilitación y protección de localhost
  48. nft add rule ip filter input iifname lo  counter accept
  49. nft add rule ip filter input iifname != lo ip daddr 127.0.0.1/8  counter drop
  50.  
  51. #Abrimos los puertos para conexiones establecidas por nosotros o relativas a estas.
  52. #No habilité el puerto SSH (22)
  53.  
  54. tcp_dport_input_accept="20,21,25,80,110,143,443,465,993,995,1024-65535"
  55. udp_dport_input_accept="53,80,1024-65535"
  56.  
  57. IFS=',' read -ra PORT <<< "$tcp_dport_input_accept"
  58. for i in "${PORT[@]}"; do
  59.     nft add rule ip filter input tcp dport $i ct state established,related counter accept
  60. done
  61.  
  62. IFS=',' read -ra PORT <<< "$udp_dport_input_accept"
  63. for i in "${PORT[@]}"; do
  64.     nft add rule ip filter input udp dport $i ct state established,related counter accept
  65. done
  66.  
  67. #Si bien la política de input es counter drop bloqueamos puertos conocidos usados por atacantes.
  68.  
  69. ports_input_drop="1,2-1024,1723,3306,5432,31337-31340"
  70.  
  71. IFS=',' read -ra PORT <<< "$ports_input_drop"
  72. for i in "${PORT[@]}"; do
  73.     nft add rule ip filter input tcp dport $i counter drop
  74.     nft add rule ip filter input udp dport $i counter drop
  75. done
  76.  
  77. #Cerramos el acceso a la ip local por la red cableada (enp2s0) y por wifi (wlp0s18f2u5 ).
  78. #La ip 255.255.255.255 no es aceptada por la sintaxis en concatenación por tanto necesita una regla propia.
  79. nft add rule ip filter input iifname enp2s0 ip saddr {10.0.0.0/24,172.16.0.0/24,\
  80.     192.168.0.0/24,224.0.0.0/22}  counter drop
  81. nft add rule ip filter input iifname enp2s0 ip daddr 127.0.0.0/22 counter drop
  82. nft add rule ip filter input iifname enp2s0 ip daddr 255.255.255.255  counter drop
  83. nft add rule ip filter input iifname enp2s0 ip frag-off != 0  counter drop
  84.  
  85. nft add rule ip filter input iifname wlp0s18f2u5 ip saddr {10.0.0.0/24,172.16.0.0/24,\
  86.     192.168.0.0/24,224.0.0.0/22}  counter drop
  87. nft add rule ip filter input iifname wlp0s18f2u5 ip daddr 127.0.0.0/22 counter drop
  88. nft add rule ip filter input iifname wlp0s18f2u5 ip daddr 255.255.255.255  counter drop
  89. nft add rule ip filter input iifname wlp0s18f2u5 ip frag-off != 0  counter drop
  90.  
  91.  
  92. #Cerramos cualquier tráfico que no hubiera sido captado por reglas anteriores.
  93. nft add rule ip filter input counter counter drop
  94.  
  95. #Creamos la cadena para output.
  96. nft add chain ip filter output { type filter hook output priority 0\; policy drop\; }
  97.  
  98. #Estas reglas sobre IPs para bloquear son creadas porque tengo el ct state related habilitado.
  99. IFS=',' read -ra ADDR <<< "$Prohibidos"
  100. for i in "${ADDR[@]}"; do
  101.     nft add rule ip filter output ip daddr $i counter drop
  102. done
  103.  
  104. #Le damos salida a lo y a las conexiones establecidas por nosotros y relacionadas.
  105. nft add rule ip filter output oifname lo counter accept
  106. nft add rule ip filter output ct state established,related counter accept
  107.  
  108. #Damos salida a nuestro sistema a la red con el ct state new
  109. ports_tcp_output_new="20,21,25,80,110,143,443,465,993,995,1024-65535"
  110. ports_udp_output_new="53,80,1024-65535"
  111.  
  112. IFS=',' read -ra PORT <<< "$ports_tcp_output_new"
  113. for i in "${PORT[@]}"; do
  114.     nft add rule ip filter output tcp sport $i ct state new counter accept
  115. done
  116.  
  117. IFS=',' read -ra PORT <<< "$ports_udp_output_new"
  118. for i in "${PORT[@]}"; do
  119.     nft add rule ip filter output udp sport $i ct state new counter accept
  120. done
  121.  
  122.  
  123. #Creamos la cadena que se va a encargar de los forward y las reglas que lo prohiben.
  124. #Mi equipo no requiere esa función.
  125.  
  126. nft add chain ip filter noforward { type filter hook forward priority 0\; policy drop\; }
  127. nft add rule ip filter noforward counter drop
  128.  
  129. #Por las dudas alguien meta mano a mi router creamos las cadenas para IPv6 y sus reglas para bloquear todo el tráfico.
  130.  
  131. nft add chain ip6 filter input { type filter hook input priority 0\; policy drop\; }
  132. nft add rule ip6 filter input counter drop
  133.  
  134. nft add chain ip6 filter output { type filter hook output priority 0\; policy drop\; }
  135. nft add rule ip6 filter output counter drop
  136.  
  137. nft add chain ip6 filter noforward { type filter hook forward priority 0\; policy drop\; }
  138. nft add rule ip6 filter noforward counter drop
  139.  
  140. #Finalmente salvamos nuestras reglas y salimos.
  141.  
  142. /etc/init.d/nftables save
  143.  
  144. exit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement