Skip to content

Commit f840785

Browse files
author
Fabian Schneider
committed
update internal filter structure to improve performance with high number of domain with individual rules
1 parent ec031dc commit f840785

File tree

4 files changed

+82
-12
lines changed

4 files changed

+82
-12
lines changed

anti_ddos_worker.cpp

+15-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,14 @@ class AntiDDoSWorker{
6565
int score = 0;
6666

6767
for(int i = 0; i < Config::FiltersPostRequest().Count(); i++){
68-
score += Config::FiltersPostRequest().Get(i).GetScore(r, true);
68+
score += Config::FiltersPostRequest().Get(i).GetScore(r);
69+
}
70+
71+
for(int i = 0; i < Config::DomainFiltersPostRequest(r->hostname).Count(); i++){
72+
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
73+
"detect filters for domain from postrequest (%s)", r->hostname);
74+
75+
score += Config::DomainFiltersPostRequest(r->hostname).Get(i).GetScore(r);
6976
}
7077

7178
if(score > 0){
@@ -118,6 +125,13 @@ class AntiDDoSWorker{
118125
score += Config::FiltersPreRequest().Get(i).GetScore(r);
119126
}
120127

128+
for(int i = 0; i < Config::DomainFiltersPreRequest(r->hostname).Count(); i++){
129+
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
130+
"detect filters for domain %s", r->hostname);
131+
132+
score += Config::DomainFiltersPreRequest(r->hostname).Get(i).GetScore(r);
133+
}
134+
121135
if(score > 0){
122136
ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, r->server,
123137
"add score for %s (%i)", r->connection->client_ip, score);

char_list.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ class CharList{
1616
return count;
1717
}
1818

19+
char* Get(int id){
20+
if(id-- == 0)
21+
return content;
22+
return nextEntry->Get(id);
23+
}
24+
1925
void Add(char* c){
2026
count++;
2127
// if currently no entry

config.cpp

+59-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
// std::map
2+
#include <map>
3+
4+
// string
5+
#include <string>
6+
17
// std::ifstream
28
#include <fstream>
39

@@ -204,12 +210,36 @@ class Config{
204210
}catch(const std::exception& e){}
205211

206212
if(newFilter.GetContent() != NULL){
207-
filtersPostContent.Add(newFilter);
213+
// PostContent
214+
if(newFilter.GetDomains().Count() != 0)
215+
{
216+
for(int i = 0; i < newFilter.GetDomains().Count(); i++){
217+
domainFiltersPostContent[newFilter.GetDomains().Get(i)].Add(newFilter);
218+
}
219+
}
220+
else
221+
filtersPostContent.Add(newFilter);
208222
}
209223
else if(newFilter.GetStatusCode() != 0){
210-
filtersPostRequest.Add(newFilter);
224+
// PostProcessing
225+
if(newFilter.GetDomains().Count() != 0)
226+
{
227+
for(int i = 0; i < newFilter.GetDomains().Count(); i++){
228+
domainFiltersPostRequest[newFilter.GetDomains().Get(i)].Add(newFilter);
229+
}
230+
}
231+
else
232+
filtersPostRequest.Add(newFilter);
211233
} else {
212-
filtersPreRequest.Add(newFilter);
234+
// PreProcessing
235+
if(newFilter.GetDomains().Count() != 0)
236+
{
237+
for(int i = 0; i < newFilter.GetDomains().Count(); i++){
238+
domainFiltersPreRequest[newFilter.GetDomains().Get(i)].Add(newFilter);
239+
}
240+
}
241+
else
242+
filtersPreRequest.Add(newFilter);
213243
}
214244

215245
}
@@ -229,6 +259,21 @@ class Config{
229259
return filtersPostContent;
230260
}
231261

262+
static FilterList DomainFiltersPreRequest(const char* domain){
263+
std::string str = domain;
264+
return domainFiltersPreRequest[domain];
265+
}
266+
267+
static FilterList DomainFiltersPostRequest(const char* domain){
268+
std::string str = domain;
269+
return domainFiltersPostRequest[domain];
270+
}
271+
272+
static FilterList DomainFiltersPostContent(const char* domain){
273+
std::string str = domain;
274+
return domainFiltersPostContent[domain];
275+
}
276+
232277
static int TickDown(){
233278
return tickDown;
234279
}
@@ -285,9 +330,15 @@ class Config{
285330
static int maxHits;
286331
static int tickDown;
287332
static int blockTime;
333+
288334
static FilterList filtersPreRequest;
289335
static FilterList filtersPostRequest;
290336
static FilterList filtersPostContent;
337+
338+
static std::map<std::string, FilterList> domainFiltersPreRequest;
339+
static std::map<std::string, FilterList> domainFiltersPostRequest;
340+
static std::map<std::string, FilterList> domainFiltersPostContent;
341+
291342
static Filter* defaults;
292343
static CharList whitelist;
293344

@@ -308,6 +359,11 @@ Filter* Config::defaults;
308359
FilterList Config::filtersPreRequest;
309360
FilterList Config::filtersPostRequest;
310361
FilterList Config::filtersPostContent;
362+
363+
std::map<std::string, FilterList> Config::domainFiltersPreRequest;
364+
std::map<std::string, FilterList> Config::domainFiltersPostRequest;
365+
std::map<std::string, FilterList> Config::domainFiltersPostContent;
366+
311367
CharList Config::whitelist;
312368

313369
char* Config::blockCommandFormat;

filter.cpp

+2-8
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ class Filter{
113113
return std::regex_search(ua, botPattern);
114114
}
115115

116-
int GetScore(request_rec *r, bool postRequest = false){
116+
int GetScore(request_rec *r){
117117
if(!ApplyForAssets()){
118118
if(UrlIsAsset(r->unparsed_uri)){
119119
// std::cerr << "skipped asset request on " << r->unparsed_uri << "\n";
@@ -153,13 +153,7 @@ class Filter{
153153
free(m);
154154
}
155155

156-
if(GetDomains().Count() != 0){
157-
if(!GetDomains().Contains(r->hostname)){
158-
// std::cerr << "skipped filter with 'wrong' domain " << r->hostname << " domain would be " << GetDomain() << "\n";
159-
return 0;
160-
}
161-
162-
}
156+
// removed domain check, as only filters are passed with matching domains
163157

164158
if(GetRequest() != NULL){
165159
if(!CompareValues(r->unparsed_uri, GetRequest(), IsUseRegex())){

0 commit comments

Comments
 (0)