По-перше, я б не пропонував iptables вирішити все це, справді ідеальний вихід Tor-вузла завантажував би баланс трафіку, хоча кілька тунелів VPN, щоб не відводити очі провайдера від пакетів та справжнього пункту призначення та / або використовувати кешування-проксі, щоб утримати вихідні повторні запити. до мінімізації популярного статичного вмісту ... при розгляді цих варіантів ось смуга допомоги для проблем зі скаргами на зловживання;
Джерела використовуваної інформації
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/
Поєднання двох посилань на джерела в правила, які можуть бути використані для відлякування ботів, намагаючись використовувати свій вузол виходу Tor для сканування портів. Зауважте, це може змусити хакерів, що використовують ваш вузол виходу, дуже незадоволеними, оскільки ці правила спричиняють час очікування 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
Запустіть вище, bash
щоб магія була попередньо сформована на змінних з ,
камами, тобто;
user@host~# bash iptables_limit_tor.sh
Ось цей список змінних ще раз
_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"
Зауважте, що ви також можете відфільтрувати нові вихідні з'єднання для -m state NEW ! --syn
різновидів смішної комерції, які використовуються деякими ботами для пошуку експлуатованих серверів. Ось приклад ланцюжка, що ви могли б зробити попередньо вказані вище для подальшої фільтрації таких неправильних балачок
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
Однак вищезазначений ланцюг був би дуже обмежуючим, оскільки будь-який зібраний пакет заборонятиме IP (можливо, змінюється -j out_temp_ban
на -j DROP
або -j REJECT
для тестування) протягом скільки-небудь секунд, вибраних у правилах цієї ланцюга. Цей набір правил може також спричинити помилкові позитиви, коли погано кодовані програми на кінцевому підключенні клієнта повторно підключаються через нову серкоту Tor.
~~~~~
Програмне забезпечення для подальшого формування трафіку. Ознайомтеся з firejail
Linux, джерело знаходиться на Github та Source forge, а сторінки man можна знайти на старій домашній сторінці, піддомен Wordpress, а DigitalOcean має посібник для Nginx з PHP та Firejail, що з невеликою модифікацією може дати вам набагато більше стимулів щодо того, де мережу слід відмовити назад. Існують і інші інструменти, такі як, які KVM
також можна використовувати для збереження сервісних послуг у межах оперативних кордонів, щоб знайти магазин, який найкраще підходить для вашої системи.
Ще одним варіантом буде запускати fail2ban
таким чином, що коли скажений sys-admin відвідує http або ssl-з'єднання з вашим IP-адресою, додається правило для скасування-m state --state NEW
з'єднання з тими, хто вимагає вашої сторінки повідомлення про вихід. Це в поєднанні з розумними обмеженнями часу на заборону може дозволити віддаленому серверу перерву в той час, як їхній sys-admin замислюється про реєстрацію журналу ;-) Однак це виходить за рамки цього поточного відповіді і залежить від того, яке програмне забезпечення ви використовуєте для обслуговування сторінки повідомлення про вихід; підказка і nginx, і apache будуть обслуговувати перший vhost або серверний блок у ваших конфігураціях, якщо тепер запитували URL. Якщо ви використовуєте щось інше, ніж apache або nginx, ви захочете ознайомитись із сторінками man, але для мене це було так само просто, як встановити перший vhost для входу в інший файл і не вдалося22 додати будь-які IP-адреси з цього журналу до списку заборон temp. ; це також чудово підходить для заборони ботів на загальнодоступних серверах, оскільки вони зазвичай використовують IP-адресу та не надають запит домену призводить до того, що сервер обслуговує ловушку бота,
Я нахиляю лайки, виконуючи обмежену політику виходу із Tor (виглядає, що ви справились з цим), а потім підштовхуєте трафік через тунелі VPN, додаткові кредитні бали для балансування навантаження між багатопультовими тунелями. Тому що це може спричинити менше перебоїв у мережевому трафіку Tor і збереже очі Вашого провайдера затуманені тим фактом, що Ви використовуєте вузол виходу ... якщо тільки вони не хочуть визнати нюхання та розтріскування вашого трафіку VPN. Це тому, що використання правил, які тимчасово-забороняють або дозволяють віддаленому хосту самозаборонятись, можуть призвести до порушення конфіденційності для клієнтів вашого вузла, коли висування трафіку на VPN (або кілька) допоможе конфіденційності вашого клієнта і збереже ваш Інтернет-провайдер не переслідується запитами ваших журналів мережевого трафіку будь-яким органом управління, який може працювати whois www.some.domain
.
~~~~
Редагування / оновлення
~~~~
Я здійснив подорож до своїх розширених записок і підтягнув конфігурації для публічних серверів, якими я користуюся
Ось 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
А ось apache-ipscan.conf
файл фільтру
[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
А ось iptables-repeater.conf
файл дії
# 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
Зауважте, що вищевказаний фільтр був відредагований, щоб заблокувати OUTPUT
дії старту / зупинки, але ви все одно хочете додати -p TCP -m state --state NEW
конфігурації до кожного рядка, щоб тільки нові вихідні з'єднання були заборонені з зареєстрованої IP-адреси.
Останнє - це налаштування конфігурації Apache vHost, яка виконує маршрутизацію тих, хто не запитує домен, до специфічного журналу доступу та помилок та встановлення дозволеного vs забороненого доступу таким чином, що він завжди помиляється, навіть не може бути зворотним циклом, щоб мати змогу витягнути сторінку без появи помилок . І останнє, але не менш важливе значення - це встановлення сторінки помилок для Apache у повідомленні про вихід за замовчуванням від Tor, щоб воно подалося замість 503
або404
м'які повідомлення. Або якщо ви додали рядки стану до дій iptables для fail2ban, ви можете просто вказати на той самий файл журналу, який використовується вашим повідомленням про вихід. Результатом буде те, що ваш сервер не зможе встановити нові з'єднання з IP-адресою сервера, який перевіряє вашу IP-адресу, але встановлені та пов’язані з ними з'єднання все одно будуть дозволені, тобто вони все ще можуть переглядати ваші інші сторінки, але ви не можете переглядати тієри .