En primer lugar, no sugeriría iptables para resolver todo esto, realmente un nodo Tor de salida ideal cargaría el tráfico de balace a través de algunos túneles VPN para mantener los ojos del ISP fuera de los paquetes y el verdadero destino y / o utilizar el proxy de almacenamiento en caché para mantener las solicitudes de repetición salientes al contenido estático popular al mínimo ... mientras mira esas opciones, aquí hay una curita para los problemas de quejas de abuso;
Fuentes de información utilizadas
http://www.ossramblings.com/using_iptables_rate_limiting_to_prevent_portscans
http://blog.nintechnet.com/how-to-block-w00tw00t-at-isc-sans-dfind-and-other-web-vulnerability-scanners/
Combinando los dos enlaces de origen en reglas que pueden usarse para frustrar a los bots que intentan usar su nodo de salida Tor para escanear puertos. Tenga en cuenta que esto puede hacer que los piratas informáticos que usan su nodo de salida sean muy descontentos, ya que estas reglas provocan que nmap se cuelgue.
#!/bin/bash
## Network interface used by Tor exit daemon
_tor_iface="eth1"
## Ports that Tor exit daemon binds to, maybe comma or space sepperated.
_tor_ports="9050,9051"
## Time to ban connections out in secconds, default equates to 10 minutes, same as default Tor cercut.
_ban_time="600"
## How long to monitor conections in seconds, default equates to 10 minutes.
_outgoing_tcp_update_seconds="600"
## How many new connections can be placed to a server in aloted update time limits. May nead to increes this depending on exit node usage and remote servers usages.
_outgoing_tcp_hitcount="8"
## How long to monitor connections for in minuets, default is 15 minutes but could be lessoned.
_outgoing_tcp_burst_minute="15"
## Hom many connections to accept untill un-matched
_outgoing_tcp_burst_limit="1000"
iptables -N out_temp_ban -m comment --comment "Make custom chain for tracking ban time limits" || exit 1
iptables -A out_temp_ban -m recent --set --name temp_tcp_ban -p TCP -j DROP -m comment --comment "Ban any TCP packet coming to this chain" || exit 1
iptables -N out_vuln_scan -m comment --comment "Make custom chain for mitigating port scans originating from ${_tor_iface}" || exit 1
for _tor_port in ${_tor_ports//,/ }; do
iptables -A out_vuln_scan -p TCP -o ${_tor_iface} --sport ${_tor_port} -m recent --name temp_tcp_ban --update --seconds ${_ban_time} -j DROP -m comment --comment "Update ban time if IP address is found in temp_tcp_ban list" || exit 1
iptables -A out_vuln_scan -p TCP -o ${_tor_iface} --sport ${_tor_port} -m state --state NEW -m recent --set -m comment --comment "Monitor number of new conncetions to ${_server_iface}" || exit 1
iptables -A out_vuln_scan -p TCP -o ${_tor_iface} --sport ${_tor_port} -m state --state NEW -m recent --update --seconds 30 --hitcout 10 -j out_temp_ban -m comment --comment "Ban address when to many new connections are attempted on ${_tor_iface}" || exit 1
done
iptables -A out_vuln_scan -j RETURN -m comment --comment "Return un-matched packets for further processing" || exit 1
## Add rules to accept/allow outbound packets
iptables -N tor_out -m comment --comment "Make custom chain for allowing Tor exit node services" || exit 1
for _tor_port in ${_tor_ports//,/ }; do
iptables -A tor_out -p TCP -o ${_tor_iface} --sport ${_tor_port} -m state --state NEW -m recent --set --name limit_${_tor_port} -m comment --comment "Track out-going tcp connections from port ${_tor_port}" || exit 1
iptables -A tor_out -p TCP -o ${_tor_iface} --sport ${_tor_port} -m state --state NEW -m recent --update --seconds ${_outgoing_tcp_update_seconds:-60} --hitcount ${_outgoing_tcp_hitcount:-8} --rttl --name limit_${_tor_port} -j LOG --log-prefix "TCP flooding port ${_tor_port}" -m comment --comment "Log atempts to flood port ${_tor_port} from your server" || exit 1
iptables -A tor_out -p TCP -o ${_tor_iface} --sport ${_tor_port} -m state --state NEW -m recent --update --seconds ${_outgoing_tcp_update_seconds:-60} --hitcount ${_outgoing_tcp_hitcount:-8} --rttl --name limit_${_tor_port} -j DROP -m comment --comment "Drop attempts to flood port ${_tor_port} from your server" || exit 1
iptables -A tor_out -p TCP -o ${_tor_iface} --sport ${_tor_port} -m limit --limit ${_outgoing_tcp_burst_minute:-15}/minute --limit-burst ${_outgoing_tcp_burst_limit:-1000} -j ACCEPT -m comment --comment "Accept with conditions new connections from port ${_tor_port} from your server" || exit 1
done
iptables -A tor_out -j RETURN -m comment ---comment "Reurn un-matched packets for further filtering or default polices to take effect." || exit 1
## Activate jumps from default output chain to new custom filtering chains
iptables -A OUTPUT -p TCP -o ${_tor_iface} -j out_vuln_scan -m comment --comment "Jump outbound packets through vulnerability scaning mitigation" || exit 1
iptables -A OUTPUT -p TCP -o ${_tor_iface} -j tor_out -m comment --comment "Jump outbound packets through conditional acceptance" || exit 1
Ejecutar arriba con bash
para tener magias preformadas en variables con ,
cammas, es decir;
user@host~# bash iptables_limit_tor.sh
Aquí está esa lista de variables nuevamente
_tor_iface="eth1"
_tor_ports="9050,9051"
_ban_time="600"
_outgoing_tcp_update_seconds="600"
_outgoing_tcp_hitcount="8"
_outgoing_tcp_burst_minute="15"
_outgoing_tcp_burst_limit="1000"
Tenga en cuenta que también es posible que desee filtrar nuevas conexiones salientes para -m state NEW ! --syn
tipos de negocios divertidos utilizados por algunos bots para encontrar servidores explotables. Aquí hay una cadena de ejemplo que podría haber preferido los dos anteriores para filtrar aún más la charla con formato incorrecto
iptables -N out_bad_packets -m comment --comment "Make new chain for filtering malformed packets" || exit 1
iptables -A out_bad_packets -p TCP --fragment -j out_temp_ban -m comment --comment "Drop all fragmented packets" || exit 1
iptables -A out_bad_packets -p TCP -m state --state INVALID -j out_temp_ban -m comment --comment "Drop all invalid packets" || exit 1
iptables -A out_bad_packets -p TCP ! --syn -m state --state NEW -j out_temp_ban -m comment --comment "Drop new non-syn packets" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags ALL NONE -j out_temp_ban -m comment --comment "Drop NULL scan" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags ALL ALL -j out_temp_ban -m comment --comment "Drop XMAS scan"|| exit 1
iptables -A out_bad_packets -p TCP --tcp-flags ALL FIN,URG,PSH -j out_temp_ban -m comment --comment "Drop stealth scan 1" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags ALL SYN,RST,ACK,FIN,URG -j out_temp_ban -m comment --comment "Drop pscan 1"|| exit 1
iptables -A out_bad_packets -p TCP --tcp-flags SYN,FIN SYN,FIN -j out_temp_ban -m comment --comment "Drop pscan 2" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags FIN,RST FIN,RST -j out_temp_ban -m comment --comment "Drop pscan 3" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags SYN,RST SYN,RST -j out_temp_ban -m comment --comment "Drop SYN-RST scan" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags ACK,URG URG -j out_temp_ban -m comment --comment "Drop URG scans" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags ALL SYN,FIN -j out_temp_ban -m comment --comment "Drop SYNFIN scan" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags ALL URG,PSH,FIN -j out_temp_ban -m comment --comment "Drop nmap Xmas scan" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags ALL FIN -j out_temp_ban -m comment --comment "Drop FIN scan" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags ALL URG,PSH,SYN,FIN -j out_temp_ban -m comment --comment "Drop nmap-id scan" || exit 1
iptables -A out_bad_packets -p TCP --tcp-flags RST RST -o ${_tor_iface} --sport ${_tor_port} -m limit --limit 2/second --limit-burst 3 -j out_temp_ban -m comment --comment "Mitigate Smurf attacks from excesive RST packets"
iptables -A out_bad_packets -p TCP --tcp-flags RST RST -o ${_tor_iface} --sport ${_tor_port} -m limit --limit 2/second --limit-burst 2 -j RETURN -m comment --comment "Ban Smurf attacks using excesive RST packets"
iptables -A out_bad_packets -j RETURN -m comment --comment "Return un-matched packets for further processing." || exit 1
Sin embargo, la cadena anterior sería muy restrictiva como cualquier paquete emparejado tendrá la IP prohibidas (tal vez cambiar -j out_temp_ban
a -j DROP
o -j REJECT
para la prueba) para sin embargo muchos segundos elegidos en las reglas de esa cadena. Este conjunto de reglas también podría causar fallas positivas cuando las aplicaciones mal codificadas en el extremo del cliente se vuelven a conectar a través de un nuevo corte de Tor.
~~~~~
Software a tener en cuenta para seguir modelando el tráfico Consulte firejail
Linux, la fuente está en Github y Source forge y las páginas de manual se pueden encontrar en la página de inicio anterior, un subdominio de WordPress, y DigitalOcean tiene una guía para Nginx con PHP y Firejail que con una pequeña modificación podría darle mucho más incitación en cuanto a dónde debería reducirse la red. Existen otras herramientas como las que KVM
también se pueden usar para mantener los servicios específicos dentro de los límites operacionales, así que compre la mejor opción para su sistema.
Sin embargo, otra opción sería ejecutar fail2ban
de tal manera que cuando un administrador de sistemas loco realiza una conexión http o ssl a su IP, se agrega una regla para descartar-m state --state NEW
conexiones a quienes solicitan su página de aviso de salida. Esto, si se combina con límites de tiempo no prohibidos, podría permitir al servidor remoto un descanso mientras su administrador del sistema murmura sobre la contaminación del registro ;-) Sin embargo, eso está más allá del alcance de esta respuesta actual y depende del software que esté utilizando para servir salir de las páginas de aviso; Sugerencia nginx y apache servirán el primer bloque vhost o servidor en sus configuraciones si ahora se solicitó la URL. Si usa otra cosa que no sea apache o nginx, querrá consultar las páginas de manual, pero para mí fue tan simple como configurar el primer vhost para iniciar sesión en un archivo diferente y tener fail2ban agregar cualquier IP de ese registro a una lista de prohibición temporal ; esto también funciona muy bien para prohibir los bots en servidores públicos porque generalmente usan una dirección IP y no proporcionan una solicitud de dominio, lo que hace que el servidor sirva la trampa de bot,
Apuesto a que twords ejecuta una política de salida de Tor restringida (parece que ya lo has manejado) y luego empuja el tráfico a través de túneles VPN, puntos de crédito adicionales para el equilibrio de carga entre túneles múltiples. Porque esto causaría menos interrupciones en el tráfico de la red Tor y mantendría los ojos de su ISP nublados al hecho de que está ejecutando un nodo de salida ... a menos que deseen admitir que olfatea y descifra su tráfico VPN. Esto se debe a que las reglas de ejecución que prohíben temporalmente o permiten que el host remoto se prohíba a sí mismo podrían provocar una violación de la privacidad de los clientes de su nodo, ya que empujar el tráfico a una VPN (o pocas) ayudaría a la privacidad de su cliente y mantendría su ISP debe ser perseguido con solicitudes de registros de tráfico de su red por parte de cualquier gobierno que pueda ejecutar whois www.some.domain
.
~~~~
Ediciones / Actualizaciones
~~~~
Hice un viaje a mis notas extensas y saqué las configuraciones para servidores públicos que uso
Aquí está el jail.local
stansa fail2ban
[apache-ipscan]
enabled = true
port = http,https
filter = apache-ipscan
logpath = /var/log/apache*/*error_ip*
action = iptables-repeater[name=ipscan]
maxretry = 1
Y aquí está el apache-ipscan.conf
archivo de filtro
[DEFAULT]
_apache_error_msg = \[[^]]*\] \[\S*:error\] \[pid \d+\] \[client <HOST>(:\d{1,5})?\]
[Definition]
failregex = \[client <HOST>\] client denied by server .*(?i)/.*
#^<HOST>.*GET*.*(?!)/.*
# ^%(_apache_error_msg)s (AH0\d+: )?client denied by server configuration: (uri )?.*$
# ^%(_apache_error_msg)s script '\S+' not found or unable to stat(, referer: \S+)?\s*$
ignoreregex =
# DEV Notes:
# the web server only responds to clients with a valid Host:
# header. anyone who tries using IP only will get shunted into
# the dummy-error.log and get a client-denied message
#
# the second regex catches folks with otherwise valid CGI paths but no good Host: header
#
# Author: Paul Heinlein
Y aquí está el iptables-repeater.conf
archivo de acción .
# Fail2Ban configuration file
#
# Author: Phil Hagen <[email protected]>
# Author: Cyril Jaquier
# Modified by Yaroslav Halchenko for multiport banning and Lukas Camenzind for persistent banning
# Modified by S0AndS0 to combine features of previous Authors and Modders
#
[Definition]
# Option: actionstart
# Notes.: command executed once at the start of Fail2Ban.
# Values: CMD
#
actionstart = iptables -N fail2ban-BADIPS-<name>
iptables -A fail2ban-BADIPS-<name> -j RETURN
iptables -I INPUT -j fail2ban-BADIPS-<name>
## Comment above line and uncomment bello line to use multiport and protocol in addition to named jails
#iptables -I INPUT -p <protocol> -m multiport --dports <port> -j fail2ban-BADIPS-<name>
# set up from the static file
#cat /etc/fail2ban/ip.blocklist.<name> |grep -v ^\s*#|awk '{print $1}' | while read IP; do iptables -I fail2ban-BADIPS-<name> 1 -s $IP -j DROP; done
cat /etc/fail2ban/ip.blocklist.<name> |grep -v ^\s*#|awk '{print $1}' | while read IP; do iptables -I fail2ban-BADIPS-<name> 1 -d $IP -j DROP; done
## Comment above line and uncomment bellow line to check if there are blacklist files to load before attempting to load them
# if [ -f /etc/fail2ban/ip.blacklist.<name> ]; then cat /etc/fail2ban/ip.blacklist.<name> | grep -e <name>$ | cut -d "," -s -f 1 | while read IP; do iptables -I fail2ban-BADIPS-<name> 1 -s $IP -j DROP; done; fi
# Option: actionstop
# Notes.: command executed once at the end of Fail2Ban
# Values: CMD
#
actionstop = iptables -D INPUT -p <protocol> -m multiport --dports <port> -j fail2ban-BADIPS-<name>
iptables -F fail2ban-BADIPS-<name>
iptables -X fail2ban-BADIPS-<name>
# Option: actioncheck
# Notes.: command executed once before each actionban command
# Values: CMD
#
#actioncheck = iptables -n -L INPUT | grep -q fail2ban-BADIPS-<name>
actioncheck = iptables -n -L OUTPUT | grep -q fail2ban-BADIPS-<name>
# Option: actionban
# Notes.: command executed when banning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: <ip> IP address
# <failures> number of failures
# <time> unix timestamp of the ban time
# Values: CMD
#
#actionban = if ! iptables -C fail2ban-BADIPS-<name> -s <ip> -j DROP; then iptables -I fail2ban-BADIPS-<name> 1 -s <ip> -j DROP; fi
actionban = if ! iptables -C fail2ban-BADIPS-<name> -d <ip> -j DROP; then iptables -I fail2ban-BADIPS-<name> 1 -d <ip> -j DROP; fi
# Add offenders to local blacklist, if not already there
if ! grep -Fxq '<ip>,<name>' /etc/fail2ban/ip.blocklist.<name>; then echo "<ip>,<name> # fail2ban/$( date '+%%Y-%%m-%%d %%T' ): auto-add for BadIP offender" >> /etc/fail2ban/ip.blocklist.<name>; fi
# Report offenders to badips.com
# wget -q -O /dev/null www.badips.com/add/<name>/<ip>
# Option: actionunban
# Notes.: command executed when unbanning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: <ip> IP address
# <failures> number of failures
# <time> unix timestamp of the ban time
# Values: CMD
#
#actionunban = iptables -D fail2ban-REPEAT-<name> -s <ip> -j DROP
actionunban = iptables -D fail2ban-REPEAT-<name> -d <ip> -j DROP
# Disabled clearing out entry from ip.blacklist (somehow happens after each stop of fail2ban)
#sed --in-place '/<ip>,<name>/d' /etc/fail2ban/ip.blacklist.<name>
[Init]
# Defaut name of the chain
#
# Defaut name of the chain
name = BADIPS
# Option: port
# Notes.: specifies port to monitor
# Values: [ NUM | STRING ] Default:
#
#port = ssh
# Option: protocol
# Notes.: internally used by config reader for interpolations.
# Values: [ tcp | udp | icmp | all ] Default: tcp
Nota: el filtro anterior se ha editado para bloquear OUTPUT
las acciones de inicio / detención, pero aún así querrá agregar las -p TCP -m state --state NEW
configuraciones a cada línea para que solo se prohiban las nuevas conexiones salientes de la dirección IP registrada.
Lo último es configurar una configuración de Apache vHost que enruta a aquellos que no solicitan un dominio a un acceso específico y un registro de errores y establece el acceso permitido frente al denegado de modo que siempre produzca errores, ni siquiera el bucle invertido debería poder abrir la página sin mostrar errores . Por último, pero no menos importante, está configurando la página de error para Apache con el aviso de salida predeterminado de Tor para que se sirva en lugar de 503
o404
mensajes sosos. O si ha agregado las líneas de estado a las acciones de iptables para fail2ban, podría simplemente apuntar al mismo archivo de registro que utiliza su aviso de salida. El resultado sería que su servidor no podría hacer nuevas conexiones a la dirección IP del servidor que verificó su dirección IP pero que las conexiones establecidas y relacionadas aún estarían permitidas, es decir, aún podrían navegar por sus otras páginas pero no podría navegar a través de ellas. .
El ancho de banda limitado del resto de la red Tor resolverá esos problemas por usted. Además, si está preocupado, ejecute solo relé, no un nodo de salida.
fuente
Tengo una mejor solución: servidor de caché de calamar. Servidor de caché Squid disponible para configurar la definición
acl
y usteddeny
oaccept
cada unoacl
. Es muy interesante que el equipo de calamar defina un conjunto de reglas en su wiki que su pregunta encontró allíiptables,PF
u otros no pueden hacer su trabajo, porque solo trabajan en otras capas.fuente
Zebra route
.