ก่อนอื่นฉันจะไม่แนะนำ iptables เพื่อแก้ปัญหาทั้งหมดนี้โดยปกติแล้วโหนดทางออกในอุดมคติจะโหลดทราฟฟิกแบบ balace แม้ว่า VPN tunnels เพียงไม่กี่ตัวที่จะคอยจับตาดู ISP และแพ็กเก็ตปลายทางที่แท้จริงและ / หรือใช้พร็อกซีแคช ไปยังเนื้อหาสแตติกที่ได้รับความนิยมอย่างน้อย ... ในขณะที่มองไปที่ตัวเลือกเหล่านี้นี่คือการช่วยเหลือวงดนตรีสำหรับปัญหาการร้องเรียนการละเมิด;
แหล่งข้อมูลที่ใช้
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
เพื่อให้,
เวทมนต์ preformed กับตัวแปรด้วยcammas เช่น;
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
ชนิดของตลกธุรกิจใช้โดยบางบอทสำหรับการหาเซิร์ฟเวอร์โหว่นี่คือห่วงโซ่ตัวอย่างที่คุณอาจมี prefice ข้างต้นทั้งสองต่อการกรองพูดคุยในรูปแบบดังกล่าว
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
อย่างไรก็ตามเชนข้างต้นจะมีข้อ จำกัด อย่างมากเนื่องจากแพ็คเก็ตที่ตรงกันใด ๆ จะมีการแบนไอพี (อาจเปลี่ยน-j out_temp_ban
เป็น-j DROP
หรือ-j REJECT
สำหรับการทดสอบ) เป็นเวลาหลายวินาทีอย่างไรก็ตามถูกเลือกในกฎของเชนนั้น ชุดของกฎนี้อาจทำให้เกิดข้อผิดพลาดในระยะยาวเมื่อแอปที่เขียนโค้ดไม่ดีบนไคลเอ็นต์สิ้นสุดการเชื่อมต่อใหม่ผ่าน Tor Cercut ใหม่
~~~~~
ซอฟแวร์ที่ต้องพิจารณาสำหรับปริมาณการใช้งานที่เพิ่มขึ้นตรวจสอบfirejail
สำหรับ Linux แหล่งที่มาอยู่บน Github และ Source forge และสามารถพบ man man ได้ที่โฮมเพจเก่าโดเมนย่อย wordpress และ DigitalOcean มีแนวทางสำหรับ Nginx ด้วย PHP และ Firejail ที่ ด้วยการดัดแปลงเพียงเล็กน้อยจะช่วยให้คุณมีกำลังใจมากขึ้นว่าเครือข่ายควรจะถูก จำกัด ปริมาณ มีเครื่องมืออื่น ๆ เช่นKVM
กันที่สามารถใช้เพื่อให้บริการ spiciffic ภายในขอบเขตการดำเนินงานเพื่อให้ร้านค้าจัดเรียงเพื่อค้นหาสิ่งที่ดีที่สุดสำหรับระบบของคุณ
อีกตัวเลือกหนึ่งคือการทำงานfail2ban
ในลักษณะที่เมื่อผู้ดูแลระบบบ้าจัดการการเชื่อมต่อ http หรือ ssl ไปยัง IP ของคุณว่ามีการเพิ่มกฎให้ลดลง-m state --state NEW
การเชื่อมต่อกับผู้ที่ร้องขอหน้าประกาศการออกของคุณ ถ้ารวมกับขีด จำกัด เวลายกเลิกการแบนอาจทำให้เซิร์ฟเวอร์ระยะไกลหยุดพักในขณะที่ผู้ดูแลระบบ sys mutters เกี่ยวกับบันทึกปัญหา ;-) อย่างไรก็ตามนั่นอยู่นอกเหนือขอบเขตของคำตอบปัจจุบันนี้และขึ้นอยู่กับซอฟต์แวร์ที่คุณใช้ให้บริการ หน้าประกาศออก; บอกใบ้ทั้ง nginx และ apache จะให้บริการ vhost หรือบล็อกเซิร์ฟเวอร์แรกในการกำหนดค่าของคุณหากมีการร้องขอ URL ตอนนี้ หากใช้อย่างอื่นนอกเหนือจาก apache หรือ nginx คุณต้องปรึกษา man man แต่สำหรับฉันมันเป็นเรื่องง่ายเหมือนการตั้งค่า vhost แรกเพื่อเข้าสู่ไฟล์อื่นและมี fail2ban เพิ่ม IP ใด ๆ จากบันทึกนั้นไปยังรายการชั่วคราว ; วิธีนี้ยังใช้งานได้ดีสำหรับการแบนบอทบนเซิร์ฟเวอร์สาธารณะเพราะโดยปกติจะใช้ที่อยู่ IP และไม่ได้ให้ผลลัพธ์คำขอโดเมนในเซิร์ฟเวอร์ที่ให้บริการกับดักบอท
ฉันยันดาบที่ใช้นโยบาย จำกัด การออก Tor (ดูเหมือนว่าคุณจัดการได้แล้ว) จากนั้นผลักดันทราฟฟิกผ่านช่องทาง VPN, คะแนนเครดิตพิเศษสำหรับการปรับสมดุลโหลดระหว่างอุโมงค์หลายช่อง เพราะสิ่งนี้จะทำให้การรับส่งข้อมูลของเครือข่ายของ Tor ลดลงและทำให้สายตาของ ISP ของคุณขุ่นมัวกับข้อเท็จจริงที่ว่าคุณกำลังใช้โหนดจบการทำงาน ... เว้นแต่พวกเขาต้องการยอมรับการดมกลิ่นและแยกการรับส่งข้อมูล VPN ของคุณ เนื่องจากกฎการรันที่ temp-ban หรืออนุญาตให้รีโมตโฮสต์ทำการห้ามตัวเองอาจนำไปสู่การละเมิดความเป็นส่วนตัวไปยังเครื่องลูกข่ายของโหนดซึ่งการผลักดันทราฟฟิกออกไปยัง VPN (หรือน้อย) จะช่วยรักษาความเป็นส่วนตัวของลูกค้า ISP จากการถูกไล่ล่าที่มีการร้องขอสำหรับบันทึกการเข้าชมเครือข่ายของคุณโดย capible รัฐบาลใด ๆ 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 ของคุณ แต่การเชื่อมต่อที่สร้างขึ้นและที่เกี่ยวข้องจะยังคงได้รับอนุญาตเช่นพวกเขายังคงสามารถเรียกดูหน้าอื่น ๆ ของคุณได้ .