Port filter

This commit is contained in:
ruti 2024-07-29 16:08:35 +03:00
parent 83128935b8
commit 380f91058c
4 changed files with 38 additions and 10 deletions

View File

@ -90,6 +90,13 @@ int mode_add_get(struct sockaddr_ina *dst, int m)
} }
inline bool check_port(uint16_t *p, struct sockaddr_in6 *dst)
{
return (dst->sin6_port >= p[0]
&& dst->sin6_port <= p[1]);
}
int connect_hook(struct poolhd *pool, struct eval *val, int connect_hook(struct poolhd *pool, struct eval *val,
struct sockaddr_ina *dst, int next) struct sockaddr_ina *dst, int next)
{ {
@ -355,8 +362,9 @@ int on_desync(struct poolhd *pool, struct eval *val,
if (!m) for (; m < params.dp_count; m++) { if (!m) for (; m < params.dp_count; m++) {
struct desync_params *dp = &params.dp[m]; struct desync_params *dp = &params.dp[m];
if (!dp->detect && if (!dp->detect &&
(!dp->hosts || check_host(dp->hosts, val)) && (!dp->pf[0] || check_port(dp->pf, &val->pair->in6)) &&
(!dp->proto || check_proto_tcp(dp->proto, val))) { (!dp->proto || check_proto_tcp(dp->proto, val)) &&
(!dp->hosts || check_host(dp->hosts, val))) {
break; break;
} }
} }
@ -379,16 +387,15 @@ ssize_t udp_hook(struct eval *val,
if (!m) for (; m < params.dp_count; m++) { if (!m) for (; m < params.dp_count; m++) {
struct desync_params *dp = &params.dp[m]; struct desync_params *dp = &params.dp[m];
if (!dp->detect && if (!dp->detect &&
(!dp->proto || (dp->proto & IS_UDP))) { (!dp->proto || (dp->proto & IS_UDP)) &&
(!dp->pf[0] || check_port(dp->pf, &dst->in6))) {
break; break;
} }
} }
if (m >= params.dp_count) { if (m >= params.dp_count) {
return -1; return -1;
} }
val->attempt = m; return desync_udp(val->fd, buffer, bfsize, n, &dst->sa, m);
return desync_udp(val->fd, buffer, bfsize, n, &dst->sa, 0);
} }

24
main.c
View File

@ -84,7 +84,8 @@ const char help_text[] = {
" -T, --timeout <sec> Timeout waiting for response, after which trigger auto\n" " -T, --timeout <sec> Timeout waiting for response, after which trigger auto\n"
#endif #endif
" -K, --proto <t,h,u> Protocol whitelist: tls,http,udp\n" " -K, --proto <t,h,u> Protocol whitelist: tls,http,udp\n"
" -H, --hosts <file|:str> Hosts whitelist\n" " -H, --hosts <file|:str> Hosts whitelist, filename or :string\n"
" -V, --pf <port[-portr]> Port or port range whitelist\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"
@ -130,6 +131,7 @@ const struct option options[] = {
#endif #endif
{"proto", 1, 0, 'K'}, {"proto", 1, 0, 'K'},
{"hosts", 1, 0, 'H'}, {"hosts", 1, 0, 'H'},
{"pf", 1, 0, 'V'},
{"split", 1, 0, 's'}, {"split", 1, 0, 's'},
{"disorder", 1, 0, 'd'}, {"disorder", 1, 0, 'd'},
{"oob", 1, 0, 'o'}, {"oob", 1, 0, 'o'},
@ -737,6 +739,24 @@ int main(int argc, char **argv)
dp->udp_fake_count = val; dp->udp_fake_count = val;
break; break;
case 'V':
val = strtol(optarg, &end, 0);
if (val <= 0 || val > USHRT_MAX)
invalid = 1;
else {
dp->pf[0] = htons(val);
if (*end == '-') {
val = strtol(end + 1, &end, 0);
if (val <= 0 || val > USHRT_MAX)
invalid = 1;
}
if (*end)
invalid = 1;
else
dp->pf[1] = htons(val);
}
break;
case 'g': case 'g':
val = strtol(optarg, &end, 0); val = strtol(optarg, &end, 0);
if (val <= 0 || val > 255 || *end) if (val <= 0 || val > 255 || *end)
@ -780,7 +800,7 @@ int main(int argc, char **argv)
clear_params(); clear_params();
return -1; return -1;
} }
if (dp->hosts || dp->proto) { if (dp->hosts || dp->proto || dp->pf[0]) {
dp = add((void *)&params.dp, dp = add((void *)&params.dp,
&params.dp_count, sizeof(struct desync_params)); &params.dp_count, sizeof(struct desync_params));
if (!dp) { if (!dp) {

View File

@ -68,6 +68,7 @@ struct desync_params {
int proto; int proto;
int detect; int detect;
struct mphdr *hosts; struct mphdr *hosts;
uint16_t pf[2];
char *file_ptr; char *file_ptr;
ssize_t file_size; ssize_t file_size;

View File

@ -695,7 +695,7 @@ int on_udp_tunnel(struct eval *val, char *buffer, size_t bfsize)
} }
val->pair->in6 = addr.in6; val->pair->in6 = addr.in6;
} }
ns = udp_hook(val, data + offs, bfsize - offs, n - offs, ns = udp_hook(val->pair, data + offs, bfsize - offs, n - offs,
(struct sockaddr_ina *)&val->pair->in6); (struct sockaddr_ina *)&val->pair->in6);
} }
else { else {