우선,이 모든 것을 해결하기 위해 iptables를 제안하지는 않을 것입니다. 실제로 이상적인 출구 Tor 노드는 몇 개의 VPN 터널을 통해 balace 트래픽을로드하여 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
하면 ,
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
종류의 비즈니스에 대해 새로운 아웃 바운드 연결을 필터링 할 수도 있습니다. 여기에는 잘못된 조작 된 채터를 추가로 필터링하기 위해 위의 두 가지를 미리 수행 할 수있는 예제 체인이 있습니다.
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 cercut을 통해 다시 연결될 때 잘못된 긍정적 인 원인이 될 수 있습니다.
~~~~~
추가 트래픽 처리를 위해 고려해야 할 소프트웨어 firejail
Linux를 확인 하고 소스는 Github 및 Source forge에 있으며 매뉴얼 페이지는 이전 홈 페이지, 워드 프레스 하위 도메인에서 찾을 수 있으며 DigitalOcean에는 PHP 및 Firejail을 사용하는 Nginx에 대한 가이드가 있습니다. 약간만 수정하면 네트워크를 어느 위치로 되돌려 야하는지 훨씬 더 많은 정보를 얻을 수 있습니다. 같은 다른 도구가 있습니다 KVM
있도록 운영 boundries 내 spiciffic 서비스를 유지하는 데 사용 할 수도 가게 arround를 시스템에 가장 적합한 하나를 찾을 수는.
또 다른 옵션은 fail2ban
mad sys-admin이 IP에 http 또는 ssl 연결을 지정할 때 규칙이 삭제되도록 추가하는 방식 으로 실행 하는 것입니다.-m state --state NEW
출구 통지 페이지를 요청하는 사람들에게 연결. 제정 된 금지 금지 시간 제한과 함께 사용하면 원격 서버가 중단되어 sys-admin이 로그 오염에 대해 중얼 거릴 수 있습니다 .-) 그러나 이것은 현재 답변의 범위를 벗어 났으며 서비스에 사용하는 소프트웨어에 따라 다릅니다. 종료 통지 페이지; 힌트 이제 URL이 요청 된 경우 nginx와 apache 모두 구성에서 첫 번째 호스트 또는 서버 블록을 제공합니다. 아파치 또는 nginx 이외의 다른 것을 사용하는 경우 man 페이지를 참조하고 싶지만 첫 번째 호스트를 다른 파일에 로그하도록 설정하고 fail2ban이 해당 로그의 IP를 임시 금지 목록에 추가하는 것만 큼 간단합니다. ; 이는 일반적으로 IP 주소를 사용하고 서버가 봇 트랩을 제공하는 도메인 요청 결과를 제공하지 않기 때문에 퍼블릭 서버에서 봇을 금지하는 데 효과적입니다.
제한된 Tor 종료 정책을 실행 한 다음 (두 번째로 처리 한 것처럼 보이는) VPN 터널을 통해 트래픽을 푸시하고 멀티 풀 터널 간로드 밸런싱을위한 추가 크레딧 포인트를 제공합니다. 이는 Tor 네트워크 트래픽을 방해하지 않고 VPN 트래픽을 스니핑하고 크랙하기를 원하지 않는 한 종료 노드를 실행하고 있다는 사실에 ISP의 눈을 흐리게 유지합니다. 이는 임시 호스트를 금지하거나 원격 호스트의 자체 금지를 허용하는 규칙을 실행하면 트래픽을 VPN (또는 소수)으로 푸시하면 클라이언트의 개인 정보를 보호하고 사용자의 개인 정보를 보호 할 수있는 노드의 클라이언트에 대한 개인 정보 보호 위반이 발생할 수 있기 때문입니다. ISP 는 실행 가능한 정부에 의해 네트워크 트래픽 로그 요청 으로 인해 방해받지 않습니다 whois www.some.domain
.
~~~~
편집 / 업데이트
~~~~
내 extencive 메모를 살펴보고 내가 사용하는 공용 서버의 구성을 가져 왔습니다.
여기 fail2ban jail.local
스탠자가 있습니다.
[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 구성을 설정하여 도메인을 요청하지 않는 사람들을 특정 액세스 및 오류 로그로 라우팅하고 허용 대 거부 액세스를 설정하여 항상 오류가 발생합니다. 루프백조차도 오류가 발생하지 않고 페이지를 가져올 수 없습니다 . 마지막으로 아파치 오류 페이지를 Tor의 기본 종료 알림으로 설정하여 503
또는 대신에 제공되도록하십시오.404
블랜드 메시지. 또는 fail2ban에 대한 iptables 조치에 상태 행을 추가 한 경우 종료 알림에 사용되는 동일한 로그 파일을 쉽게 가리킬 수 있습니다. 결과적으로 서버가 IP 주소를 확인했지만 설정된 연결 및 관련 연결이 여전히 허용되는 서버의 IP에 새 연결을 만들 수는 없습니다. 즉, 여전히 다른 페이지를 찾아 볼 수는 있지만 다른 사이트를 찾아 볼 수는 없습니다. .