mirror of
https://github.com/bol-van/zapret.git
synced 2024-12-02 14:40:52 +03:00
tpws: hostdot
This commit is contained in:
parent
0697347673
commit
5c8f4c2d66
@ -34,3 +34,7 @@ nfqws : ipv6 support in nfqws
|
|||||||
v6
|
v6
|
||||||
|
|
||||||
ipset : added "get_antizapret.sh"
|
ipset : added "get_antizapret.sh"
|
||||||
|
|
||||||
|
v7
|
||||||
|
|
||||||
|
tpws : added ability to insert "." after Host: name
|
||||||
|
16
readme.txt
16
readme.txt
@ -1,4 +1,4 @@
|
|||||||
zapret v.6
|
zapret v.7
|
||||||
|
|
||||||
Для чего это надо
|
Для чего это надо
|
||||||
-----------------
|
-----------------
|
||||||
@ -17,7 +17,8 @@
|
|||||||
Например, запрос вида "GET / HTTP/1.1\r\nHost: kinozal.tv......"
|
Например, запрос вида "GET / HTTP/1.1\r\nHost: kinozal.tv......"
|
||||||
мы посылаем 2 частями : сначала идет "GET ", затем "/ HTTP/1.1\r\nHost: kinozal.tv.....".
|
мы посылаем 2 частями : сначала идет "GET ", затем "/ HTTP/1.1\r\nHost: kinozal.tv.....".
|
||||||
Другие DPI спотыкаются, когда заголовок "Host:" пишется в другом регистре : например, "host:".
|
Другие DPI спотыкаются, когда заголовок "Host:" пишется в другом регистре : например, "host:".
|
||||||
Кое-где работает добавление дополнительного пробела после метода : "GET /" => "GET /".
|
Кое-где работает добавление дополнительного пробела после метода : "GET /" => "GET /"
|
||||||
|
или добавление точки в конце имени хоста : "Host: kinozal.tv."
|
||||||
|
|
||||||
Как это реализовать на практике в системе linux
|
Как это реализовать на практике в системе linux
|
||||||
-----------------------------------------------
|
-----------------------------------------------
|
||||||
@ -95,10 +96,11 @@ nfqws
|
|||||||
|
|
||||||
Эта программа - модификатор пакетов и обработчик очереди NFQUEUE.
|
Эта программа - модификатор пакетов и обработчик очереди NFQUEUE.
|
||||||
Она берет следующие параметры :
|
Она берет следующие параметры :
|
||||||
|
--daemon ; демонизировать прогу
|
||||||
--qnum=200 ; номер очереди
|
--qnum=200 ; номер очереди
|
||||||
--wsize=4 ; менять tcp window size на указанный размер
|
--wsize=4 ; менять tcp window size на указанный размер
|
||||||
--hostcase ; менять регистр заголовка "Host:"
|
--hostcase ; менять регистр заголовка "Host:"
|
||||||
--daemon ; демонизировать прогу
|
Параметры манипуляции могут сочетаться в любых комбинациях.
|
||||||
|
|
||||||
tpws
|
tpws
|
||||||
-----
|
-----
|
||||||
@ -106,11 +108,13 @@ tpws
|
|||||||
tpws - это transparent proxy.
|
tpws - это transparent proxy.
|
||||||
--bind-addr ; на каком адресе слушать. может быть ipv4 или ipv6 адрес. если не указано, то слушает на всех адресах ipv4 и ipv6
|
--bind-addr ; на каком адресе слушать. может быть ipv4 или ipv6 адрес. если не указано, то слушает на всех адресах ipv4 и ipv6
|
||||||
--port=<port> ; на каком порту слушать
|
--port=<port> ; на каком порту слушать
|
||||||
--split-http-req=method|host ; способ разделения http запросов на сегменты : около метода (GET,POST) или около заголовка Host
|
|
||||||
--hostcase ; замена "Host:" => "host:"
|
|
||||||
--methodspace ; добавить пробел после метода : "GET /" => "GET /"
|
|
||||||
--daemon ; демонизировать прогу
|
--daemon ; демонизировать прогу
|
||||||
--user=<username> ; менять uid процесса
|
--user=<username> ; менять uid процесса
|
||||||
|
--split-http-req=method|host ; способ разделения http запросов на сегменты : около метода (GET,POST) или около заголовка Host
|
||||||
|
--hostcase ; замена "Host:" => "host:"
|
||||||
|
--hostdot ; добавление точки после имени хоста : "Host: kinozal.tv."
|
||||||
|
--methodspace ; добавить пробел после метода : "GET /" => "GET /"
|
||||||
|
Параметры манипуляции могут сочетаться в любых комбинациях.
|
||||||
|
|
||||||
Провайдеры
|
Провайдеры
|
||||||
----------
|
----------
|
||||||
|
68
tpws/tpws.c
68
tpws/tpws.c
@ -33,7 +33,7 @@ struct params_s
|
|||||||
gid_t gid;
|
gid_t gid;
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
bool daemon;
|
bool daemon;
|
||||||
bool hostcase,methodcase,methodspace;
|
bool hostcase,hostdot,methodspace;
|
||||||
enum splithttpreq split_http_req;
|
enum splithttpreq split_http_req;
|
||||||
int maxconn;
|
int maxconn;
|
||||||
};
|
};
|
||||||
@ -106,8 +106,8 @@ bool handle_epollin(tproxy_conn_t *conn,int *data_transferred){
|
|||||||
{
|
{
|
||||||
if (bOutgoing)
|
if (bOutgoing)
|
||||||
{
|
{
|
||||||
char buf[RD_BLOCK_SIZE+1],*p;
|
char buf[RD_BLOCK_SIZE+2],*p,*phost=NULL;
|
||||||
ssize_t l,split_pos=0,pos;
|
ssize_t l,split_pos=0,method_split_pos=0,host_split_pos=0,pos;
|
||||||
const char **split_array,**split_item,**item;
|
const char **split_array,**split_item,**item;
|
||||||
|
|
||||||
rd = recv(fd_in,buf,RD_BLOCK_SIZE,MSG_DONTWAIT);
|
rd = recv(fd_in,buf,RD_BLOCK_SIZE,MSG_DONTWAIT);
|
||||||
@ -128,18 +128,47 @@ bool handle_epollin(tproxy_conn_t *conn,int *data_transferred){
|
|||||||
memmove(p+1,p,bs-pos);
|
memmove(p+1,p,bs-pos);
|
||||||
*p = ' '; // insert extra space
|
*p = ' '; // insert extra space
|
||||||
bs++; // block will grow by 1 byte
|
bs++; // block will grow by 1 byte
|
||||||
split_pos = pos; // remember split positing and use it if required
|
method_split_pos = pos; // remember split position and use it if required
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (params.hostdot)
|
||||||
|
{
|
||||||
|
if (phost=find_bin(buf,bs,"\r\nHost: ",8))
|
||||||
|
{
|
||||||
|
host_split_pos = phost-buf+7;
|
||||||
|
p = phost+8;
|
||||||
|
while(p<(buf+bs) && *p!='\r' && *p!='\n') p++;
|
||||||
|
if (p<(buf+bs))
|
||||||
|
{
|
||||||
|
pos = p-buf;
|
||||||
|
printf("Adding dot to host name at pos %d\n",pos);
|
||||||
|
memmove(p+1,p,bs-pos);
|
||||||
|
*p = '.'; // insert dot
|
||||||
|
bs++; // block will grow by 1 byte
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
switch (params.split_http_req)
|
switch (params.split_http_req)
|
||||||
{
|
{
|
||||||
case split_method:
|
case split_method:
|
||||||
// do we have already split position ? if so use it without another search
|
// do we have already split position ? if so use it without another search
|
||||||
split_array = split_pos ? NULL : http_split_methods;
|
if (method_split_pos)
|
||||||
|
{
|
||||||
|
split_array = NULL;
|
||||||
|
split_pos = method_split_pos;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
split_array = http_split_methods;
|
||||||
break;
|
break;
|
||||||
case split_host:
|
case split_host:
|
||||||
|
if (host_split_pos)
|
||||||
|
{
|
||||||
|
split_array = NULL;
|
||||||
|
split_pos = host_split_pos;
|
||||||
|
}
|
||||||
|
else
|
||||||
split_array = http_split_host;
|
split_array = http_split_host;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -148,6 +177,7 @@ bool handle_epollin(tproxy_conn_t *conn,int *data_transferred){
|
|||||||
}
|
}
|
||||||
if (split_array)
|
if (split_array)
|
||||||
{
|
{
|
||||||
|
// we havent found split post yet. need to search.
|
||||||
for(split_item=split_array;*split_item;split_item++)
|
for(split_item=split_array;*split_item;split_item++)
|
||||||
{
|
{
|
||||||
l = strlen(*split_item);
|
l = strlen(*split_item);
|
||||||
@ -162,27 +192,15 @@ bool handle_epollin(tproxy_conn_t *conn,int *data_transferred){
|
|||||||
}
|
}
|
||||||
if (params.hostcase)
|
if (params.hostcase)
|
||||||
{
|
{
|
||||||
if (p=find_bin(buf,bs,"\r\nHost: ",8))
|
if (phost || (phost=find_bin(buf,bs,"\r\nHost: ",8)))
|
||||||
{
|
{
|
||||||
printf("Changing 'Host:' => 'host:' at pos %d\n",p-buf);
|
printf("Changing 'Host:' => 'host:' at pos %d\n",phost-buf);
|
||||||
p[2]='h';
|
phost[2]='h';
|
||||||
}
|
|
||||||
}
|
|
||||||
if (params.methodcase)
|
|
||||||
{
|
|
||||||
for(split_item=http_split_methods;*split_item;split_item++)
|
|
||||||
{
|
|
||||||
l = strlen(*split_item);
|
|
||||||
if (p=find_bin(buf,bs,*split_item,l))
|
|
||||||
{
|
|
||||||
printf("Changing '%s' case\n",*split_item);
|
|
||||||
*p += 'a'-'A';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (split_pos)
|
if (split_pos)
|
||||||
{
|
{
|
||||||
|
printf("Splitting at pos %d\n",split_pos);
|
||||||
wr=send_with_flush(fd_out,buf,split_pos,0);
|
wr=send_with_flush(fd_out,buf,split_pos,0);
|
||||||
if (wr>=0)
|
if (wr>=0)
|
||||||
wr=send(fd_out,buf+split_pos,bs-split_pos,0);
|
wr=send(fd_out,buf+split_pos,bs-split_pos,0);
|
||||||
@ -366,7 +384,7 @@ int8_t block_sigpipe(){
|
|||||||
|
|
||||||
void exithelp()
|
void exithelp()
|
||||||
{
|
{
|
||||||
printf(" --bind-addr=<ipv4_addr>|<ipv6_addr>\n --port=<port>\n --maxconn=<max_connections>\n --split-http-req=method|host\n --hostcase\t\t; change Host: => host:\n --methodcase\t\t; change GET => gET, POST=>pOST, ...\n --methodspace\t\t; add extra space after method\n --daemon\t\t; daemonize\n --user=<username>\t; drop root privs\n");
|
printf(" --bind-addr=<ipv4_addr>|<ipv6_addr>\n --port=<port>\n --maxconn=<max_connections>\n --split-http-req=method|host\n --hostcase\t\t; change Host: => host:\n --hostdot\t\t; add \".\" after Host: name\n --methodspace\t\t; add extra space after method\n --daemon\t\t; daemonize\n --user=<username>\t; drop root privs\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -387,7 +405,7 @@ void parse_params(int argc, char *argv[])
|
|||||||
{"user",required_argument,0,0},// optidx=5
|
{"user",required_argument,0,0},// optidx=5
|
||||||
{"maxconn",required_argument,0,0},// optidx=6
|
{"maxconn",required_argument,0,0},// optidx=6
|
||||||
{"hostcase",no_argument,0,0},// optidx=7
|
{"hostcase",no_argument,0,0},// optidx=7
|
||||||
{"methodcase",no_argument,0,0},// optidx=8
|
{"hostdot",no_argument,0,0},// optidx=8
|
||||||
{"split-http-req",required_argument,0,0},// optidx=9
|
{"split-http-req",required_argument,0,0},// optidx=9
|
||||||
{"methodspace",no_argument,0,0},// optidx=10
|
{"methodspace",no_argument,0,0},// optidx=10
|
||||||
{NULL,0,NULL,0}
|
{NULL,0,NULL,0}
|
||||||
@ -440,8 +458,8 @@ void parse_params(int argc, char *argv[])
|
|||||||
case 7: /* hostcase */
|
case 7: /* hostcase */
|
||||||
params.hostcase = true;
|
params.hostcase = true;
|
||||||
break;
|
break;
|
||||||
case 8: /* methodcase */
|
case 8: /* hostdot */
|
||||||
params.methodcase = true;
|
params.hostdot = true;
|
||||||
break;
|
break;
|
||||||
case 9: /* split-http-req */
|
case 9: /* split-http-req */
|
||||||
if (!strcmp(optarg,"method"))
|
if (!strcmp(optarg,"method"))
|
||||||
|
Loading…
Reference in New Issue
Block a user