Zunächst einmal würde ich keine Iptables vorschlagen, um all dies zu lösen. Wirklich, ein idealer Exit-Tor-Knoten würde den Balace-Verkehr durch ein paar VPN-Tunnel laden, um die Augen des ISP von den Paketen und dem wahren Ziel fernzuhalten und / oder den Caching-Proxy zu verwenden, um ausgehende Wiederholungsanforderungen zu erhalten auf beliebte statische Inhalte auf ein Minimum beschränken ... während Sie sich mit diesen Optionen befassen, finden Sie hier ein Pflaster für die Probleme mit Missbrauchsbeschwerden.
Verwendete Informationsquellen
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/
Kombinieren Sie die beiden Quelllinks zu Regeln, die verwendet werden können, um Bots zu vereiteln, die versuchen, Ihren Tor-Exit-Knoten für das Port-Scannen zu verwenden. Beachten Sie, dass Hacker, die Ihren Exit-Knoten verwenden, möglicherweise sehr unzufrieden sind, da diese Regeln zu einer Wartezeit von nmap führen.
#!/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
Führen Sie oben mit aus bash
, um Magie für Variablen mit ,
Cammas durchzuführen.
user@host~# bash iptables_limit_tor.sh
Hier ist noch einmal diese Liste von Variablen
_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"
Hinweis : Sie können auch neue abgehende Verbindungen filtern möchten -m state NEW ! --syn
Arten von lustigen Buisness von einigen Bots für die Suche nach verwertbaren Server hier ein Beispiel Kette verwendet , dass Sie prefice die beiden oben genannten für die weitere Filterung solcher malformed Geschwätz haben könnte
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
Die obige Kette wäre jedoch sehr restriktiv, da für jedes übereinstimmende Paket die IP für die in den Regeln dieser Kette ausgewählten Sekunden gesperrt wird (möglicherweise -j out_temp_ban
zu -j DROP
oder -j REJECT
zum Testen geändert wird ). Dieses Regelwerk kann auch zu positiven Fehlern führen, wenn schlecht codierte Apps auf der Client-Seite über einen neuen Tor-Cercut erneut eine Verbindung herstellen.
~~~~~
Software, die für den weiteren Datenverkehr in Betracht gezogen werden muss Schauen Sie sich firejail
Linux an, die Quelle befindet sich auf Github und Source Forge, und die Manpages finden Sie auf der alten Homepage, einer WordPress-Subdomain, und DigitalOcean hat eine Anleitung für Nginx mit PHP und Firejail Mit einer kleinen Änderung können Sie weitaus mehr Anregungen erhalten, wo das Netzwerk zurückgedrosselt werden soll. Es gibt auch andere Tools KVM
, mit denen Sie spiciffic Services innerhalb der betrieblichen Grenzen halten können. Suchen Sie also in der Nähe nach dem für Ihr System am besten geeigneten.
Eine weitere Option wäre, so zu arbeiten fail2ban
, dass, wenn ein verrückter Systemadministrator eine http- oder ssl-Verbindung zu Ihrer IP-Adresse versucht, eine Regel zum Löschen hinzugefügt wird-m state --state NEW
Verbindungen zu denen, die Ihre Exit-Benachrichtigungsseite anfordern. In Kombination mit vernünftigen Zeitbeschränkungen kann der Remote-Server eine Pause einlegen, während der Systemadministrator über die Protokollverschmutzung murmelt ;-) Dies geht jedoch über den Rahmen dieser aktuellen Antwort hinaus und hängt davon ab, welche Software Sie für die Bereitstellung verwenden Kündigungsseiten verlassen; Hinweis: Sowohl Nginx als auch Apache dienen als erster vhost- oder Serverblock in Ihren Konfigurationen, wenn jetzt eine URL angefordert wurde. Wenn Sie etwas anderes als Apache oder Nginx verwenden, sollten Sie die Manpages konsultieren. Für mich war es jedoch so einfach, den ersten vhost so einzustellen, dass er sich in einer anderen Datei anmeldet und fail2ban IPs aus diesem Protokoll zu einer temporären Verbotsliste hinzufügt ;; Dies eignet sich auch hervorragend zum Sperren von Bots auf öffentlichen Servern, da diese normalerweise eine IP-Adresse verwenden und keine Domänenanforderung bereitgestellt wird. Dies führt dazu, dass der Server die Bot-Trap bereitstellt.
Ich würde Twords lehnen, die eine eingeschränkte Tor-Exit-Richtlinie ausführen (anscheinend haben Sie das erledigt) und dann den Datenverkehr durch VPN-Tunnel leiten, zusätzliche Kreditpunkte für den Lastausgleich zwischen Multipule-Tunneln. Weil dies den Tor-Netzwerkverkehr weniger stören und die Augen Ihres ISP auf die Tatsache trüben würde, dass Sie einen Exit-Knoten betreiben ... es sei denn, er möchte zugeben, dass er Ihren VPN-Verkehr schnüffelt und knackt. Dies liegt daran, dass das Ausführen von Regeln, die das temporäre Sperren oder das Selbstverbieten von Remote-Hosts ermöglichen, zu einer Verletzung der Privatsphäre der Clients Ihres Knotens führen kann, da das Weiterleiten des Datenverkehrs an ein VPN (oder wenige) die Privatsphäre Ihres Clients verbessern und Ihre Privatsphäre schützen würde ISP wird nicht von einer Regierung, die in der Lage ist, ausgeführt zu werden, mit Anfragen nach Ihren Netzwerkverkehrsprotokollen verfolgt whois www.some.domain
.
~~~~
Bearbeitungen / Updates
~~~~
Ich machte einen Ausflug in meine ausführlichen Notizen und rief die Konfigurationen für öffentliche Server auf, die ich benutze
Hier ist die fail2ban jail.local
stansa
[apache-ipscan]
enabled = true
port = http,https
filter = apache-ipscan
logpath = /var/log/apache*/*error_ip*
action = iptables-repeater[name=ipscan]
maxretry = 1
Und hier ist der Filter - apache-ipscan.conf
Datei
[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
Und hier ist die Aktion iptables-repeater.conf
Datei
# 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
Hinweis: Der obige Filter wurde bearbeitet, um OUTPUT
die Start / Stopp-Aktionen zu blockieren. Sie möchten jedoch weiterhin die -p TCP -m state --state NEW
Konfigurationen zu jeder Zeile hinzufügen , damit nur neue ausgehende Verbindungen von der protokollierten IP-Adresse ausgeschlossen werden.
Zuletzt wird eine Apache vHost-Konfiguration eingerichtet, die diejenigen, die keine Domäne anfordern, an ein bestimmtes Zugriffs- und Fehlerprotokoll weiterleitet und den zulässigen oder den verweigerten Zugriff so festlegt, dass immer Fehler auftreten. Nicht einmal der Loopback sollte in der Lage sein, die Seite ohne Fehler aufzurufen . Last but not least wird die Fehlerseite für Apache auf die Standard-Exit-Benachrichtigung von Tor gesetzt, damit diese anstelle von 503
oder bereitgestellt wird404
langweilige Nachrichten. Wenn Sie die Statuszeilen zu iptables-Aktionen für fail2ban hinzugefügt haben, können Sie einfach auf dieselbe Protokolldatei verweisen, die von Ihrer Beendigungsbenachrichtigung verwendet wird. Das Ergebnis wäre, dass Ihr Server keine neuen Verbindungen zur IP des Servers herstellen kann, die Ihre IP-Adresse überprüft haben, aber weiterhin hergestellte und verwandte Verbindungen zulässig sind, dh sie könnten weiterhin Ihre anderen Seiten durchsuchen, aber Sie könnten ihre nicht durchsuchen .