mirror of
https://github.com/hufrea/byedpi.git
synced 2024-12-22 14:25:44 +00:00
Remove --redirect, fix mem_delete
This commit is contained in:
parent
015095d2ef
commit
191f141a08
4
conev.h
4
conev.h
@ -35,15 +35,12 @@ enum eid {
|
|||||||
EV_IGNORE,
|
EV_IGNORE,
|
||||||
EV_TUNNEL,
|
EV_TUNNEL,
|
||||||
EV_PRE_TUNNEL,
|
EV_PRE_TUNNEL,
|
||||||
EV_REDIRECT,
|
|
||||||
EV_DESYNC
|
EV_DESYNC
|
||||||
};
|
};
|
||||||
|
|
||||||
#define FLAG_S4 1
|
#define FLAG_S4 1
|
||||||
#define FLAG_S5 2
|
#define FLAG_S5 2
|
||||||
#define FLAG_CONN 4
|
#define FLAG_CONN 4
|
||||||
#define FLAG_AUTH 8
|
|
||||||
#define FLAG_ANSWER 16
|
|
||||||
|
|
||||||
#ifndef CONEV_H
|
#ifndef CONEV_H
|
||||||
char *eid_name[] = {
|
char *eid_name[] = {
|
||||||
@ -53,7 +50,6 @@ char *eid_name[] = {
|
|||||||
"EV_IGNORE",
|
"EV_IGNORE",
|
||||||
"EV_TUNNEL",
|
"EV_TUNNEL",
|
||||||
"EV_PRE_TUNNEL",
|
"EV_PRE_TUNNEL",
|
||||||
"EV_REDIRECT",
|
|
||||||
"EV_DESYNC"
|
"EV_DESYNC"
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
6
desync.c
6
desync.c
@ -71,7 +71,7 @@ int setttl(int fd, int ttl, int family) {
|
|||||||
static inline void delay(long ms)
|
static inline void delay(long ms)
|
||||||
{
|
{
|
||||||
struct timespec time = {
|
struct timespec time = {
|
||||||
.tv_nsec = ms * 1000000
|
.tv_nsec = ms * 1e6
|
||||||
};
|
};
|
||||||
nanosleep(&time, 0);
|
nanosleep(&time, 0);
|
||||||
}
|
}
|
||||||
@ -181,9 +181,7 @@ int desync(int sfd, char *buffer, size_t bfsize,
|
|||||||
ssize_t n, struct sockaddr *dst, int dp_c)
|
ssize_t n, struct sockaddr *dst, int dp_c)
|
||||||
{
|
{
|
||||||
struct desync_params dp = params.dp[dp_c];
|
struct desync_params dp = params.dp[dp_c];
|
||||||
if (dp.redirect) {
|
|
||||||
dst = (struct sockaddr *)&dp.ext_proxy;
|
|
||||||
}
|
|
||||||
char *host = 0;
|
char *host = 0;
|
||||||
int len = 0, type = 0;
|
int len = 0, type = 0;
|
||||||
int fa = get_family(dst);
|
int fa = get_family(dst);
|
||||||
|
12
main.c
12
main.c
@ -71,7 +71,6 @@ const char help_text[] = {
|
|||||||
" -K, --desync-known Desync only HTTP and TLS with SNI\n"
|
" -K, --desync-known Desync only HTTP and TLS with SNI\n"
|
||||||
" -A, --auto Try desync params after this option\n"
|
" -A, --auto Try desync params after this option\n"
|
||||||
" -u, --cache-ttl <sec> Lifetime of cached desync params for IP\n"
|
" -u, --cache-ttl <sec> Lifetime of cached desync params for IP\n"
|
||||||
" -q, --redirect <ip:port> Redirect to external SOCKS5 proxy\n"
|
|
||||||
" -s, --split <n[+s]> Split packet at n\n"
|
" -s, --split <n[+s]> Split packet at n\n"
|
||||||
" +s - add SNI offset\n"
|
" +s - add SNI offset\n"
|
||||||
" +h - add HTTP Host offset\n"
|
" +h - add HTTP Host offset\n"
|
||||||
@ -120,7 +119,6 @@ const struct option options[] = {
|
|||||||
{"tlsrec", 1, 0, 'r'},
|
{"tlsrec", 1, 0, 'r'},
|
||||||
{"def-ttl", 1, 0, 'g'},
|
{"def-ttl", 1, 0, 'g'},
|
||||||
{"delay", 1, 0, 'w'}, //
|
{"delay", 1, 0, 'w'}, //
|
||||||
{"redirect", 1, 0, 'q'},
|
|
||||||
{0}
|
{0}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -517,15 +515,7 @@ int main(int argc, char **argv)
|
|||||||
|| params.sfdelay >= 1000 || *end)
|
|| params.sfdelay >= 1000 || *end)
|
||||||
invalid = 1;
|
invalid = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'q':
|
|
||||||
if (get_addr(optarg, (struct sockaddr_ina *)&dp->ext_proxy) < 0)
|
|
||||||
invalid = 1;
|
|
||||||
else
|
|
||||||
dp->redirect = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
4
mpool.c
4
mpool.c
@ -102,9 +102,9 @@ void mem_delete(struct mphdr *hdr, int pos)
|
|||||||
hdr->max = max;
|
hdr->max = max;
|
||||||
hdr->values = new;
|
hdr->values = new;
|
||||||
}
|
}
|
||||||
hdr->max = max;
|
|
||||||
hdr->values = new;
|
|
||||||
}
|
}
|
||||||
|
free(hdr->values[pos]);
|
||||||
|
|
||||||
if (pos < hdr->count) {
|
if (pos < hdr->count) {
|
||||||
void *p = &hdr->values[pos];
|
void *p = &hdr->values[pos];
|
||||||
void *n = &hdr->values[pos + 1];
|
void *n = &hdr->values[pos + 1];
|
||||||
|
2
params.h
2
params.h
@ -25,8 +25,6 @@ struct part {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct desync_params {
|
struct desync_params {
|
||||||
char redirect;
|
|
||||||
struct sockaddr_in6 ext_proxy;
|
|
||||||
int ttl;
|
int ttl;
|
||||||
int parts_n;
|
int parts_n;
|
||||||
struct part *parts;
|
struct part *parts;
|
||||||
|
131
proxy.c
131
proxy.c
@ -507,7 +507,7 @@ static inline int on_request(struct poolhd *pool, struct eval *val,
|
|||||||
if (n) uniperror("ss recv");
|
if (n) uniperror("ss recv");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
int e = 0, s5e = 0, m;
|
int e = 0, s5e = 0;
|
||||||
|
|
||||||
if (*buffer == S_VER5) {
|
if (*buffer == S_VER5) {
|
||||||
if (val->flag != FLAG_S5) {
|
if (val->flag != FLAG_S5) {
|
||||||
@ -533,21 +533,7 @@ static inline int on_request(struct poolhd *pool, struct eval *val,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (!e) {
|
if (!e) {
|
||||||
m = mode_add_get(&dst, -1);
|
e = create_conn(pool, val, &dst, EV_CONNECT);
|
||||||
int next = EV_CONNECT;
|
|
||||||
|
|
||||||
if (m >= 0) {
|
|
||||||
struct desync_params *dp = ¶ms.dp[m];
|
|
||||||
if (dp->redirect) {
|
|
||||||
next = EV_REDIRECT;
|
|
||||||
e = create_conn(pool, val,
|
|
||||||
(struct sockaddr_ina *)&dp->ext_proxy, next);
|
|
||||||
val->pair->in6 = dst.in6;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (next == EV_CONNECT) {
|
|
||||||
e = create_conn(pool, val, &dst, next);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (e) {
|
if (e) {
|
||||||
if (s5e) {
|
if (s5e) {
|
||||||
@ -558,6 +544,7 @@ static inline int on_request(struct poolhd *pool, struct eval *val,
|
|||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
int m = mode_add_get(&dst, -1);
|
||||||
if (m >= 0) {
|
if (m >= 0) {
|
||||||
val->attempt = m;
|
val->attempt = m;
|
||||||
}
|
}
|
||||||
@ -570,7 +557,6 @@ static inline int on_request(struct poolhd *pool, struct eval *val,
|
|||||||
int try_again(struct poolhd *pool, struct eval *val)
|
int try_again(struct poolhd *pool, struct eval *val)
|
||||||
{
|
{
|
||||||
struct eval *client = val->pair;
|
struct eval *client = val->pair;
|
||||||
int e = 0;
|
|
||||||
int m = client->attempt + 1;
|
int m = client->attempt + 1;
|
||||||
|
|
||||||
if (m >= params.dp_count) {
|
if (m >= params.dp_count) {
|
||||||
@ -578,17 +564,8 @@ int try_again(struct poolhd *pool, struct eval *val)
|
|||||||
(struct sockaddr_ina *)&val->in6, 0);
|
(struct sockaddr_ina *)&val->in6, 0);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
struct desync_params *dp = ¶ms.dp[m];
|
if (create_conn(pool, client,
|
||||||
if (dp->redirect) {
|
(struct sockaddr_ina *)&val->in6, EV_DESYNC)) {
|
||||||
e = create_conn(pool, client,
|
|
||||||
(struct sockaddr_ina *)&dp->ext_proxy, EV_REDIRECT);
|
|
||||||
client->pair->in6 = val->in6;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
e = create_conn(pool, client,
|
|
||||||
(struct sockaddr_ina *)&val->in6, EV_DESYNC);
|
|
||||||
}
|
|
||||||
if (e) {
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
val->pair = 0;
|
val->pair = 0;
|
||||||
@ -688,17 +665,12 @@ static inline int on_connect(struct poolhd *pool, struct eval *val, int e)
|
|||||||
{
|
{
|
||||||
int error = 0;
|
int error = 0;
|
||||||
socklen_t len = sizeof(error);
|
socklen_t len = sizeof(error);
|
||||||
struct eval *pair = val->pair;
|
|
||||||
if (e) {
|
if (e) {
|
||||||
if (getsockopt(val->fd, SOL_SOCKET,
|
if (getsockopt(val->fd, SOL_SOCKET,
|
||||||
SO_ERROR, (char *)&error, &len)) {
|
SO_ERROR, (char *)&error, &len)) {
|
||||||
uniperror("getsockopt SO_ERROR");
|
uniperror("getsockopt SO_ERROR");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (unie(error) == ECONNREFUSED) {
|
|
||||||
e = try_again(pool, val);
|
|
||||||
if (!e) error = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (mod_etype(pool, val, POLLOUT, 0)) {
|
if (mod_etype(pool, val, POLLOUT, 0)) {
|
||||||
@ -708,8 +680,8 @@ static inline int on_connect(struct poolhd *pool, struct eval *val, int e)
|
|||||||
val->type = EV_TUNNEL;
|
val->type = EV_TUNNEL;
|
||||||
val->pair->type = EV_DESYNC;
|
val->pair->type = EV_DESYNC;
|
||||||
}
|
}
|
||||||
if (resp_error(pair->fd,
|
if (resp_error(val->pair->fd,
|
||||||
error, pair->flag) < 0) {
|
error, val->pair->flag) < 0) {
|
||||||
uniperror("send");
|
uniperror("send");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -717,90 +689,6 @@ static inline int on_connect(struct poolhd *pool, struct eval *val, int e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline int on_redirect(struct poolhd *pool, struct eval *val,
|
|
||||||
char *buffer, size_t bfsize)
|
|
||||||
{
|
|
||||||
struct eval *pair = val->pair;
|
|
||||||
int e = -1;
|
|
||||||
|
|
||||||
switch (val->flag) {
|
|
||||||
case FLAG_CONN:;
|
|
||||||
char a[3] = "\5\1\0";
|
|
||||||
if (send(val->fd, &a, sizeof(a), 0) < 0) {
|
|
||||||
uniperror("rr: send");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (mod_etype(pool, val, POLLOUT, 0)) {
|
|
||||||
uniperror("mod_etype");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
val->flag = FLAG_AUTH;
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case FLAG_AUTH:;
|
|
||||||
ssize_t n = recv(val->fd, buffer, bfsize, 0);
|
|
||||||
if (n < 2) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!(buffer[0] == 5 && buffer[1] == 0)) {
|
|
||||||
LOG(LOG_E, "rr: auth error: 0x%x\n", buffer[1]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
struct s5_req r = {.ver = 5, .cmd = S_CMD_CONN};
|
|
||||||
|
|
||||||
switch (val->in.sin_family) {
|
|
||||||
case AF_INET:
|
|
||||||
r.atp = S_ATP_I4;
|
|
||||||
r.i4 = val->in.sin_addr;
|
|
||||||
r.p4 = val->in.sin_port;
|
|
||||||
break;
|
|
||||||
case AF_INET6:
|
|
||||||
r.atp = S_ATP_I6;
|
|
||||||
r.i6 = val->in6.sin6_addr;
|
|
||||||
r.p6 = val->in6.sin6_port;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (send(val->fd, &r, sizeof(r), 0) < 0) {
|
|
||||||
uniperror("rr: send");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
val->flag = FLAG_ANSWER;
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case FLAG_ANSWER:
|
|
||||||
n = recv(val->fd, buffer, bfsize, 0);
|
|
||||||
if (n < sizeof(struct s5_rep)) {
|
|
||||||
uniperror("rr: recv");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
struct s5_rep *rr = (struct s5_rep *)buffer;
|
|
||||||
if (rr->ver != 5 || rr->code != 0) {
|
|
||||||
LOG(LOG_E, "rr: socks returned: %d\n", rr->code);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
val->flag = FLAG_CONN;
|
|
||||||
val->type = EV_TUNNEL;
|
|
||||||
pair->type = EV_DESYNC;
|
|
||||||
e = 0;
|
|
||||||
}
|
|
||||||
char is_first = (val->attempt == pair->attempt);
|
|
||||||
|
|
||||||
if (!e && !is_first) {
|
|
||||||
return on_desync(pool, val->pair, buffer, bfsize);
|
|
||||||
}
|
|
||||||
else if (e) {
|
|
||||||
e = try_again(pool, val);
|
|
||||||
}
|
|
||||||
if (is_first && resp_error(pair->fd,
|
|
||||||
e, pair->flag) < 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int event_loop(int srvfd)
|
int event_loop(int srvfd)
|
||||||
{
|
{
|
||||||
size_t bfsize = params.bfsize;
|
size_t bfsize = params.bfsize;
|
||||||
@ -870,11 +758,6 @@ int event_loop(int srvfd)
|
|||||||
del_event(pool, val);
|
del_event(pool, val);
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
case EV_REDIRECT:
|
|
||||||
if (on_redirect(pool, val, buffer, bfsize))
|
|
||||||
del_event(pool, val);
|
|
||||||
continue;
|
|
||||||
|
|
||||||
case EV_DESYNC:
|
case EV_DESYNC:
|
||||||
if (on_desync(pool, val, buffer, bfsize))
|
if (on_desync(pool, val, buffer, bfsize))
|
||||||
del_event(pool, val);
|
del_event(pool, val);
|
||||||
|
10
readme.txt
10
readme.txt
@ -37,22 +37,14 @@ $ ./ciadpi --disorder 3 -A --tlsrec 1+s
|
|||||||
|
|
||||||
-A, --auto
|
-A, --auto
|
||||||
Автоматический режим
|
Автоматический режим
|
||||||
Если будет выполнено одно из следующих условий,
|
Если сервер сразу сбросил подключение после первого запроса,
|
||||||
то будут применены параметры обхода, следующие за данной опцией
|
то будут применены параметры обхода, следующие за данной опцией
|
||||||
Условия:
|
|
||||||
- Сервер сбросил подключение, не отправив ответ
|
|
||||||
- Сервер прислал RST на этапе подключения
|
|
||||||
- Резервный прокси отказывает в соединении
|
|
||||||
Можно указывать несколько групп параметров, раделяя их данным флагом
|
Можно указывать несколько групп параметров, раделяя их данным флагом
|
||||||
Если соединение успешно прошло, то параметры для данного IP будут закешированны
|
Если соединение успешно прошло, то параметры для данного IP будут закешированны
|
||||||
|
|
||||||
-u, --cache-ttl <sec>
|
-u, --cache-ttl <sec>
|
||||||
Время жизни значения в кеше, указывается в секундах
|
Время жизни значения в кеше, указывается в секундах
|
||||||
|
|
||||||
-q, --redirect <ip:port>
|
|
||||||
Перенаправить подключение на другой SOCKS5 прокси
|
|
||||||
Имеет смысл указывать после --auto, для перенаправление только заблокированных ресурсов
|
|
||||||
|
|
||||||
-s, --split <n[+s]>
|
-s, --split <n[+s]>
|
||||||
Разбить запрос по указанному смещению
|
Разбить запрос по указанному смещению
|
||||||
После числа можно добавить флаг:
|
После числа можно добавить флаг:
|
||||||
|
Loading…
Reference in New Issue
Block a user