Prima di tutto non suggerirei iptables per risolvere tutto questo, davvero un nodo Tor di uscita ideale avrebbe caricato il traffico di bilanciamento attraverso alcuni tunnel VPN per tenere gli occhi dell'ISP lontani dai pacchetti e dalla destinazione reale e / o utilizzare il proxy di cache per mantenere le richieste ripetute in uscita al popolare contenuto statico al minimo ... mentre si esaminano queste opzioni, ecco un cerotto per i problemi di denuncia degli abusi;
Fonti di informazioni utilizzate
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 i due collegamenti di origine in regole che possono essere utilizzate per frustrare i robot che cercano di utilizzare il nodo di uscita Tor per la scansione delle porte. Nota che ciò potrebbe rendere gli hacker che usano il tuo nodo di uscita molto poco felici poiché queste regole causano il blocco di nmap.
#!/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
Esegui sopra con bash
magie preformate su variabili con ,
camme, ad esempio;
user@host~# bash iptables_limit_tor.sh
Ecco di nuovo l'elenco di variabili
_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"
Nota che potresti anche voler filtrare le nuove connessioni in uscita per i -m state NEW ! --syn
tipi di affari divertenti usati da alcuni bot per trovare server sfruttabili, ecco una catena di esempio che potresti avere il prefisso i due sopra per filtrare ulteriormente tali chiacchiere malformate
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
Tuttavia, la catena di cui sopra sarebbe molto restrittiva in quanto a qualsiasi pacchetto abbinato verrà vietato l'IP (magari cambiando -j out_temp_ban
in -j DROP
o -j REJECT
per il test) per comunque molti secondi scelti nelle regole di quella catena. Questo set di regole potrebbe anche causare falsi positivi quando le app mal codificate all'estremità del client si riconnettono su un nuovo cercatore Tor.
~~~~~
Software da considerare per ulteriore smistamento del traffico Dai un'occhiata firejail
a Linux, la fonte è su Github e Source forge e le pagine man si trovano sulla vecchia home page, un sottodominio wordpress e DigitalOcean ha una guida per Nginx con PHP e Firejail che con una piccola modifica potrebbe darti molto più incitamento su dove limitare la rete. Ci sono altri strumenti come KVM
troppo che possono essere utilizzati per mantenere i servizi spiciffic entro boundries operativi in modo negozio arround per trovare quello che funziona meglio per il vostro sistema.
Un'altra opzione sarebbe quella di funzionare fail2ban
in modo tale che quando un amministratore di sistema pazzo attua una connessione http o ssl al tuo IP che una regola viene aggiunta per eliminare-m state --state NEW
connessioni a coloro che richiedono la pagina di avviso di uscita. Questo, se combinato con sane limitazioni di un-ban, potrebbe consentire al server remoto di rompersi mentre il loro amministratore di sistema mormora l'inquinamento dei log ;-) Tuttavia, questo va oltre lo scopo di questa risposta corrente e dipende dal software che stai usando per servire pagine di avviso di uscita; suggerimento sia nginx che apache serviranno il primo vhost o blocco server nelle configurazioni se ora è stato richiesto l'URL. Se usi qualcos'altro diverso da apache o nginx ti consigliamo di consultare le pagine man ma per me è stato semplice come impostare il primo vhost per accedere a un altro file e avere fail2ban aggiungere eventuali IP da quel registro a un elenco di ban temporaneo ; questo funziona egregiamente anche per vietare i bot su server pubblici perché di solito usano un indirizzo IP e non forniscono risultati di richiesta di dominio nel server che serve il bot trap,
Appoggerei twords che eseguono una politica di uscita Tor limitata (sembra che tu l'abbia gestita) e quindi spingendo il traffico attraverso i tunnel VPN, punti di credito extra per il bilanciamento del carico tra tunnel multipli. Perché ciò causerebbe meno disturbi al traffico di rete Tor e manterrebbe gli occhi del tuo ISP annebbiati dal fatto che stai eseguendo un nodo di uscita ... a meno che non desiderino ammettere di annusare e decifrare il tuo traffico VPN. Questo perché l'esecuzione di regole che vietano il temp o autorizzano l'hosting autonomo dell'host remoto potrebbe portare a una violazione della privacy dei client del tuo nodo, in quanto il trasferimento del traffico a una VPN (o pochi) aiuterebbe la privacy del tuo cliente e manterrà il tuo client L'ISP viene perseguitato da richieste per i registri del traffico di rete da parte di qualsiasi governo in grado di funzionare whois www.some.domain
.
~~~~
Modifiche / Aggiornamenti
~~~~
Ho fatto un viaggio nelle mie note estese e ho tirato su le configurazioni per i server pubblici che utilizzo
Ecco la stansa jail.local
fail2ban
[apache-ipscan]
enabled = true
port = http,https
filter = apache-ipscan
logpath = /var/log/apache*/*error_ip*
action = iptables-repeater[name=ipscan]
maxretry = 1
Ed ecco il apache-ipscan.conf
file del 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
Ed ecco il iptables-repeater.conf
file di azione
# Fail2Ban configuration file
#
# Author: Phil Hagen <phil@identityvector.com>
# 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: il filtro sopra è stato modificato per bloccare OUTPUT
le azioni di avvio / arresto, ma ti consigliamo comunque di aggiungere le -p TCP -m state --state NEW
configurazioni a ciascuna linea per escludere solo le nuove connessioni in uscita dall'indirizzo IP registrato.
L'ultimo è l'impostazione di una configurazione vHost di Apache che instrada coloro che non richiedono un dominio a un accesso specifico e un registro degli errori e l'impostazione dell'accesso consentito o negato in modo tale che sia sempre un errore, nemmeno il loopback dovrebbe essere in grado di aprire la pagina senza errori di pop-up . Ultimo ma non meno importante, sta impostando la pagina di errore per Apache sull'avviso di uscita predefinito da Tor in modo che venga pubblicato anziché 503
o404
messaggi insipidi. Oppure, se hai aggiunto le linee di stato alle azioni iptables per fail2ban, puoi semplicemente puntare allo stesso file di registro utilizzato dall'avviso di uscita. Il risultato sarebbe che il tuo server non sarebbe in grado di stabilire nuove connessioni verso l'IP del server che ha controllato il tuo indirizzo IP ma che le connessioni stabilite e correlate sarebbero comunque consentite, ovvero che potrebbero comunque navigare tra le tue altre pagine ma non puoi navigare tra i thiers .