Po pierwsze, nie sugeruję, aby iptables rozwiązało to wszystko, naprawdę idealne wyjście węzeł Tora ładowałby ruch równoważący przez kilka tuneli VPN, aby oderwać wzrok od pakietów i prawdziwego miejsca docelowego i / lub użyć buforującego serwera proxy, aby utrzymać wychodzące powtarzające się żądania do popularnych treści statycznych do minimum ... patrząc na te opcje, oto pomoc zespołu w przypadku problemów związanych z reklamacją;
Wykorzystane źródła informacji
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/
Łączenie dwóch linków źródłowych w reguły, które mogą być użyte do udaremnienia botów próbujących użyć twojego węzła wyjściowego Tora do skanowania portów. Uwaga: może to spowodować, że hakerzy używający twojego węzła wyjściowego będą bardzo niezadowoleni, ponieważ reguły te powodują zawieszanie się 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
Uruchom powyżej, bash
aby mieć magię uformowaną na zmiennych z ,
cammas, tj.
user@host~# bash iptables_limit_tor.sh
Oto znowu lista zmiennych
_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"
Uwaga może również chcieć filtrować nowe połączenia wychodzące do -m state NEW ! --syn
rodzaju śmieszne buisness wykorzystywana przez niektóre boty do znajdowania serwerów do eksploatacji oto przykład łańcuch, który można mieć prefice powyższych dwóch do dalszego filtrowania takiego zniekształconego gadać
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
Jednak powyższy łańcuch byłby bardzo restrykcyjny, ponieważ każdy dopasowany pakiet będzie miał zablokowany adres IP (być może zmiana -j out_temp_ban
na -j DROP
lub w -j REJECT
celu testowania) na dowolną liczbę sekund wybraną w regułach tego łańcucha. Ten zestaw reguł może również powodować fałszywe alarmy, gdy źle zakodowane aplikacje po stronie klienta ponownie połączą się przez nowy odcinek Tora.
~~~~~
Oprogramowanie, które należy wziąć pod uwagę w celu dalszego kształtowania ruchu Sprawdź firejail
w Linuxie, źródło znajduje się na Github i Source forge, a strony podręcznika man można znaleźć na starej stronie głównej, subdomenie wordpress, a DigitalOcean ma przewodnik dla Nginx z PHP i Firejail, które z niewielką modyfikacją może znacznie podniecić cię do tego, gdzie sieć powinna zostać zdławiona z powrotem. Istnieją również inne narzędzia, takie jak te, KVM
które mogą być używane do utrzymywania szczególnych usług w granicach operacyjnych, więc rób zakupy, aby znaleźć takie, które najlepiej pasuje do twojego systemu.
Jeszcze inną opcją byłoby uruchomienie fail2ban
w taki sposób, że gdy szalony administrator systemu podejmie połączenie http lub ssl z twoim adresem IP, dodawana jest reguła do usunięcia-m state --state NEW
połączenia z osobami żądającymi strony powiadomienia o wyjściu. To w połączeniu z rozsądnymi ograniczeniami czasowymi un-ban może pozwolić zdalnemu serwerowi na przerwę, podczas gdy ich sys-admin mruczy o zanieczyszczeniu logów ;-) Jest to jednak poza zakresem obecnej odpowiedzi i zależy od oprogramowania, którego używasz do obsługi strony z powiadomieniem o wyjściu; wskazówka, że zarówno nginx, jak i apache będą obsługiwały pierwszy blok vhosta lub serwera w twoich konfiguracjach, jeśli teraz zażądano adresu URL. Jeśli używasz czegoś innego niż apache lub nginx, powinieneś zajrzeć na strony podręcznika, ale dla mnie było to tak proste, jak ustawienie pierwszego vhosta na logowanie się do innego pliku i zlecenie fail2ban dodania adresów IP z tego dziennika do listy tymczasowych banów ; działa to również świetnie do blokowania botów na serwerach publicznych, ponieważ zwykle używają adresu IP i brak podania żądania domeny powoduje, że serwer obsługuje pułapkę na bot,
Opierałbym się na twistach z ograniczoną polityką wyjścia z Tora (wygląda na to, że już sobie z tym poradziłeś), a następnie przepychałem ruch przez tunele VPN, dodatkowe punkty kredytowe za równoważenie obciążenia między tunelami wieloskładnikowymi. Ponieważ spowodowałoby to mniej zakłóceń w ruchu sieciowym Tor i utrzymywało oczy w oczach twojego dostawcy usług internetowych na fakt, że prowadzisz węzeł wyjściowy ... chyba, że oni chcą przyznać się do wąchania i krakowania twojego ruchu VPN. Wynika to z faktu, że uruchamianie reguł, które tymczasowo blokują lub zezwalają zdalnemu hostowi na samozbanowanie, mogą prowadzić do naruszenia prywatności klientów twojego węzła, ponieważ wypychanie ruchu do VPN (lub kilku) poprawiłoby prywatność twojego klienta i utrzymało Dostawcy usług internetowych przed prześladowaniem żądań dzienników ruchu sieciowego przez dowolny rząd zdolny do działania whois www.some.domain
.
~~~~
Edycje / Aktualizacje
~~~~
Wziąłem podróż do moich obszernych notatek i wyciągnąłem konfiguracje dla serwerów publicznych, których używam
Oto 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
A oto apache-ipscan.conf
plik filtru
[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
A oto iptables-repeater.conf
plik akcji
# 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
Uwaga: powyższy filtr został zmodyfikowany w celu blokowania OUTPUT
akcji start / stop, ale nadal będziesz chciał dodać -p TCP -m state --state NEW
konfiguracje do każdej linii, aby zablokować tylko nowe połączenia wychodzące z zarejestrowanego adresu IP.
Ostatnim jest konfiguracja Apache vHost, która kieruje osoby nie żądające domeny do określonego dziennika dostępu i błędów oraz ustawianie dozwolonego lub odmowy dostępu tak, aby zawsze występował błąd, nawet pętla zwrotna nie powinna być w stanie podciągnąć strony bez wyskakiwania błędów . Ostatnim, ale nie mniej ważnym jest ustawienie strony błędu dla Apache'a na domyślne powiadomienie o wyjściu z Tora, tak aby było wyświetlane zamiast 503
lub404
nijakie wiadomości. Lub jeśli dodałeś linie stanu do akcji iptables dla fail2ban, możesz łatwo wskazać ten sam plik dziennika, który jest używany w powiadomieniu o wyjściu. W rezultacie Twój serwer nie byłby w stanie nawiązywać nowych połączeń z adresem IP serwera, który sprawdziłby Twój adres IP, ale nawiązane i powiązane połączenia byłyby nadal dozwolone, tzn. Nadal mogłyby przeglądać twoje inne strony, ale nie możesz przeglądać ich .
Ograniczona przepustowość reszty sieci Tor rozwiąże te problemy za Ciebie. Jeśli się martwisz, uruchom tylko przekaźnik, a nie węzeł wyjściowy.
źródło
Mam lepsze rozwiązanie: serwer pamięci podręcznej kałamarnicy. Squid serwer cache dostępny do konfigurowania definiowania
acl
ideny
czyaccept
każdaacl
. To bardzo ciekawe, że squid zespół tworzący zestaw reguł w swojej wiki, że kwestia znaleziono tamiptables,PF
ani inni nie mogą wykonywać swoją pracę, bo tylko pracować w innym warstwach.źródło
Zebra route
.