mirror of
https://github.com/hufrea/byedpi.git
synced 2024-12-22 06:15:14 +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_TUNNEL,
|
||||
EV_PRE_TUNNEL,
|
||||
EV_REDIRECT,
|
||||
EV_DESYNC
|
||||
};
|
||||
|
||||
#define FLAG_S4 1
|
||||
#define FLAG_S5 2
|
||||
#define FLAG_CONN 4
|
||||
#define FLAG_AUTH 8
|
||||
#define FLAG_ANSWER 16
|
||||
|
||||
#ifndef CONEV_H
|
||||
char *eid_name[] = {
|
||||
@ -53,7 +50,6 @@ char *eid_name[] = {
|
||||
"EV_IGNORE",
|
||||
"EV_TUNNEL",
|
||||
"EV_PRE_TUNNEL",
|
||||
"EV_REDIRECT",
|
||||
"EV_DESYNC"
|
||||
};
|
||||
#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)
|
||||
{
|
||||
struct timespec time = {
|
||||
.tv_nsec = ms * 1000000
|
||||
.tv_nsec = ms * 1e6
|
||||
};
|
||||
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)
|
||||
{
|
||||
struct desync_params dp = params.dp[dp_c];
|
||||
if (dp.redirect) {
|
||||
dst = (struct sockaddr *)&dp.ext_proxy;
|
||||
}
|
||||
|
||||
char *host = 0;
|
||||
int len = 0, type = 0;
|
||||
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"
|
||||
" -A, --auto Try desync params after this option\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 - add SNI offset\n"
|
||||
" +h - add HTTP Host offset\n"
|
||||
@ -120,7 +119,6 @@ const struct option options[] = {
|
||||
{"tlsrec", 1, 0, 'r'},
|
||||
{"def-ttl", 1, 0, 'g'},
|
||||
{"delay", 1, 0, 'w'}, //
|
||||
{"redirect", 1, 0, 'q'},
|
||||
{0}
|
||||
};
|
||||
|
||||
@ -517,15 +515,7 @@ int main(int argc, char **argv)
|
||||
|| params.sfdelay >= 1000 || *end)
|
||||
invalid = 1;
|
||||
break;
|
||||
|
||||
case 'q':
|
||||
if (get_addr(optarg, (struct sockaddr_ina *)&dp->ext_proxy) < 0)
|
||||
invalid = 1;
|
||||
else
|
||||
dp->redirect = 1;
|
||||
break;
|
||||
|
||||
|
||||
|
||||
case 0:
|
||||
break;
|
||||
|
||||
|
4
mpool.c
4
mpool.c
@ -102,9 +102,9 @@ void mem_delete(struct mphdr *hdr, int pos)
|
||||
hdr->max = max;
|
||||
hdr->values = new;
|
||||
}
|
||||
hdr->max = max;
|
||||
hdr->values = new;
|
||||
}
|
||||
free(hdr->values[pos]);
|
||||
|
||||
if (pos < hdr->count) {
|
||||
void *p = &hdr->values[pos];
|
||||
void *n = &hdr->values[pos + 1];
|
||||
|
2
params.h
2
params.h
@ -25,8 +25,6 @@ struct part {
|
||||
};
|
||||
|
||||
struct desync_params {
|
||||
char redirect;
|
||||
struct sockaddr_in6 ext_proxy;
|
||||
int ttl;
|
||||
int parts_n;
|
||||
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");
|
||||
return -1;
|
||||
}
|
||||
int e = 0, s5e = 0, m;
|
||||
int e = 0, s5e = 0;
|
||||
|
||||
if (*buffer == S_VER5) {
|
||||
if (val->flag != FLAG_S5) {
|
||||
@ -533,21 +533,7 @@ static inline int on_request(struct poolhd *pool, struct eval *val,
|
||||
return -1;
|
||||
}
|
||||
if (!e) {
|
||||
m = mode_add_get(&dst, -1);
|
||||
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);
|
||||
}
|
||||
e = create_conn(pool, val, &dst, EV_CONNECT);
|
||||
}
|
||||
if (e) {
|
||||
if (s5e) {
|
||||
@ -558,6 +544,7 @@ static inline int on_request(struct poolhd *pool, struct eval *val,
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
int m = mode_add_get(&dst, -1);
|
||||
if (m >= 0) {
|
||||
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)
|
||||
{
|
||||
struct eval *client = val->pair;
|
||||
int e = 0;
|
||||
int m = client->attempt + 1;
|
||||
|
||||
if (m >= params.dp_count) {
|
||||
@ -578,17 +564,8 @@ int try_again(struct poolhd *pool, struct eval *val)
|
||||
(struct sockaddr_ina *)&val->in6, 0);
|
||||
return -1;
|
||||
}
|
||||
struct desync_params *dp = ¶ms.dp[m];
|
||||
if (dp->redirect) {
|
||||
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) {
|
||||
if (create_conn(pool, client,
|
||||
(struct sockaddr_ina *)&val->in6, EV_DESYNC)) {
|
||||
return -1;
|
||||
}
|
||||
val->pair = 0;
|
||||
@ -688,17 +665,12 @@ static inline int on_connect(struct poolhd *pool, struct eval *val, int e)
|
||||
{
|
||||
int error = 0;
|
||||
socklen_t len = sizeof(error);
|
||||
struct eval *pair = val->pair;
|
||||
if (e) {
|
||||
if (getsockopt(val->fd, SOL_SOCKET,
|
||||
SO_ERROR, (char *)&error, &len)) {
|
||||
uniperror("getsockopt SO_ERROR");
|
||||
return -1;
|
||||
}
|
||||
if (unie(error) == ECONNREFUSED) {
|
||||
e = try_again(pool, val);
|
||||
if (!e) error = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
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->pair->type = EV_DESYNC;
|
||||
}
|
||||
if (resp_error(pair->fd,
|
||||
error, pair->flag) < 0) {
|
||||
if (resp_error(val->pair->fd,
|
||||
error, val->pair->flag) < 0) {
|
||||
uniperror("send");
|
||||
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)
|
||||
{
|
||||
size_t bfsize = params.bfsize;
|
||||
@ -870,11 +758,6 @@ int event_loop(int srvfd)
|
||||
del_event(pool, val);
|
||||
continue;
|
||||
|
||||
case EV_REDIRECT:
|
||||
if (on_redirect(pool, val, buffer, bfsize))
|
||||
del_event(pool, val);
|
||||
continue;
|
||||
|
||||
case EV_DESYNC:
|
||||
if (on_desync(pool, val, buffer, bfsize))
|
||||
del_event(pool, val);
|
||||
|
10
readme.txt
10
readme.txt
@ -37,22 +37,14 @@ $ ./ciadpi --disorder 3 -A --tlsrec 1+s
|
||||
|
||||
-A, --auto
|
||||
Автоматический режим
|
||||
Если будет выполнено одно из следующих условий,
|
||||
Если сервер сразу сбросил подключение после первого запроса,
|
||||
то будут применены параметры обхода, следующие за данной опцией
|
||||
Условия:
|
||||
- Сервер сбросил подключение, не отправив ответ
|
||||
- Сервер прислал RST на этапе подключения
|
||||
- Резервный прокси отказывает в соединении
|
||||
Можно указывать несколько групп параметров, раделяя их данным флагом
|
||||
Если соединение успешно прошло, то параметры для данного IP будут закешированны
|
||||
|
||||
-u, --cache-ttl <sec>
|
||||
Время жизни значения в кеше, указывается в секундах
|
||||
|
||||
-q, --redirect <ip:port>
|
||||
Перенаправить подключение на другой SOCKS5 прокси
|
||||
Имеет смысл указывать после --auto, для перенаправление только заблокированных ресурсов
|
||||
|
||||
-s, --split <n[+s]>
|
||||
Разбить запрос по указанному смещению
|
||||
После числа можно добавить флаг:
|
||||
|
Loading…
Reference in New Issue
Block a user