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

View File

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

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

View File

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

View File

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

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

View File

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