Remove --redirect, fix mem_delete

This commit is contained in:
ruti 2024-03-12 02:53:57 +03:00
parent 015095d2ef
commit 191f141a08
7 changed files with 13 additions and 156 deletions

View File

@ -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

View File

@ -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
View File

@ -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;

View File

@ -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];

View File

@ -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
View File

@ -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 = &params.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 = &params.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);

View File

@ -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]>
Разбить запрос по указанному смещению Разбить запрос по указанному смещению
После числа можно добавить флаг: После числа можно добавить флаг: