mirror of
https://github.com/Waujito/youtubeUnblock.git
synced 2026-01-01 06:08:49 +03:00
@@ -187,6 +187,8 @@ Available flags:
|
|||||||
|
|
||||||
- `--threads=<threads number>` Specifies the amount of threads you want to be running for your program. This defaults to **1** and shouldn't be edited for normal use. If you have performance issues, consult [performance chaptr](https://github.com/Waujito/youtubeUnblock?tab=readme-ov-file#performance)
|
- `--threads=<threads number>` Specifies the amount of threads you want to be running for your program. This defaults to **1** and shouldn't be edited for normal use. If you have performance issues, consult [performance chaptr](https://github.com/Waujito/youtubeUnblock?tab=readme-ov-file#performance)
|
||||||
|
|
||||||
|
- `--packet-mark=<mark>` Use this option if youtubeUnblock conflicts with other systems rely on packet mark. Note that you may want to change accept rule for iptables to follow the mark.
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
If you got troubles with some sites and you sure that they are blocked by SNI (youtube for example), use may play around with [flags](#flags) and their combinations. At first it is recommended to try `--faking-strategy` flag and `--frag-sni-faked=1`.
|
If you got troubles with some sites and you sure that they are blocked by SNI (youtube for example), use may play around with [flags](#flags) and their combinations. At first it is recommended to try `--faking-strategy` flag and `--frag-sni-faked=1`.
|
||||||
|
|||||||
15
args.c
15
args.c
@@ -22,6 +22,7 @@ struct config_t config = {
|
|||||||
.frag_sni_pos = 2,
|
.frag_sni_pos = 2,
|
||||||
.use_ipv6 = 1,
|
.use_ipv6 = 1,
|
||||||
.fakeseq_offset = 10000,
|
.fakeseq_offset = 10000,
|
||||||
|
.mark = DEFAULT_RAWSOCKET_MARK,
|
||||||
|
|
||||||
.sni_detection = SNI_DETECTION_PARSE,
|
.sni_detection = SNI_DETECTION_PARSE,
|
||||||
|
|
||||||
@@ -67,13 +68,14 @@ struct config_t config = {
|
|||||||
#define OPT_SNI_DETECTION 17
|
#define OPT_SNI_DETECTION 17
|
||||||
#define OPT_NO_IPV6 20
|
#define OPT_NO_IPV6 20
|
||||||
#define OPT_FAKE_SEQ_OFFSET 21
|
#define OPT_FAKE_SEQ_OFFSET 21
|
||||||
|
#define OPT_PACKET_MARK 22
|
||||||
#define OPT_SEG2DELAY 5
|
#define OPT_SEG2DELAY 5
|
||||||
#define OPT_THREADS 6
|
#define OPT_THREADS 6
|
||||||
#define OPT_SILENT 7
|
#define OPT_SILENT 7
|
||||||
#define OPT_NO_GSO 8
|
#define OPT_NO_GSO 8
|
||||||
#define OPT_QUEUE_NUM 9
|
#define OPT_QUEUE_NUM 9
|
||||||
|
|
||||||
#define OPT_MAX OPT_FAKE_SEQ_OFFSET
|
#define OPT_MAX OPT_PACKET_MARK
|
||||||
|
|
||||||
static struct option long_opt[] = {
|
static struct option long_opt[] = {
|
||||||
{"help", 0, 0, 'h'},
|
{"help", 0, 0, 'h'},
|
||||||
@@ -99,6 +101,7 @@ static struct option long_opt[] = {
|
|||||||
{"no-gso", 0, 0, OPT_NO_GSO},
|
{"no-gso", 0, 0, OPT_NO_GSO},
|
||||||
{"no-ipv6", 0, 0, OPT_NO_IPV6},
|
{"no-ipv6", 0, 0, OPT_NO_IPV6},
|
||||||
{"queue-num", 1, 0, OPT_QUEUE_NUM},
|
{"queue-num", 1, 0, OPT_QUEUE_NUM},
|
||||||
|
{"packet-mark", 1, 0, OPT_PACKET_MARK},
|
||||||
{0,0,0,0}
|
{0,0,0,0}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -148,6 +151,7 @@ void print_usage(const char *argv0) {
|
|||||||
printf("\t--sni-detection={parse|brute}\n");
|
printf("\t--sni-detection={parse|brute}\n");
|
||||||
printf("\t--seg2delay=<delay>\n");
|
printf("\t--seg2delay=<delay>\n");
|
||||||
printf("\t--threads=<threads number>\n");
|
printf("\t--threads=<threads number>\n");
|
||||||
|
printf("\t--packet-mark=<mark>\n");
|
||||||
printf("\t--silent\n");
|
printf("\t--silent\n");
|
||||||
printf("\t--trace\n");
|
printf("\t--trace\n");
|
||||||
printf("\t--no-gso\n");
|
printf("\t--no-gso\n");
|
||||||
@@ -331,6 +335,15 @@ int parse_args(int argc, char *argv[]) {
|
|||||||
|
|
||||||
config.queue_start_num = num;
|
config.queue_start_num = num;
|
||||||
break;
|
break;
|
||||||
|
case OPT_PACKET_MARK:
|
||||||
|
num = parse_numeric_option(optarg);
|
||||||
|
if (errno != 0 || num < 0) {
|
||||||
|
goto invalid_opt;
|
||||||
|
}
|
||||||
|
|
||||||
|
config.mark = num;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|||||||
3
config.h
3
config.h
@@ -45,6 +45,7 @@ struct config_t {
|
|||||||
unsigned int fake_sni_pkt_sz;
|
unsigned int fake_sni_pkt_sz;
|
||||||
unsigned int fk_winsize;
|
unsigned int fk_winsize;
|
||||||
unsigned int fakeseq_offset;
|
unsigned int fakeseq_offset;
|
||||||
|
unsigned int mark;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct config_t config;
|
extern struct config_t config;
|
||||||
@@ -71,7 +72,7 @@ extern struct config_t config;
|
|||||||
#define FRAGMENTATION_STRATEGY FRAG_STRAT_TCP
|
#define FRAGMENTATION_STRATEGY FRAG_STRAT_TCP
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define RAWSOCKET_MARK (1 << 15)
|
#define DEFAULT_RAWSOCKET_MARK (1 << 15)
|
||||||
|
|
||||||
#ifdef USE_SEG2_DELAY
|
#ifdef USE_SEG2_DELAY
|
||||||
#define SEG2_DELAY 100
|
#define SEG2_DELAY 100
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ static int open_raw_socket(void) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int mark = RAWSOCKET_MARK;
|
int mark = config.mark;
|
||||||
if (setsockopt(rawsocket, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) < 0)
|
if (setsockopt(rawsocket, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) < 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "setsockopt(SO_MARK, %d) failed\n", mark);
|
fprintf(stderr, "setsockopt(SO_MARK, %d) failed\n", mark);
|
||||||
@@ -139,7 +139,7 @@ static int open_raw6_socket(void) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int mark = RAWSOCKET_MARK;
|
int mark = config.mark;
|
||||||
if (setsockopt(raw6socket, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) < 0)
|
if (setsockopt(raw6socket, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) < 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "setsockopt(SO_MARK, %d) failed\n", mark);
|
fprintf(stderr, "setsockopt(SO_MARK, %d) failed\n", mark);
|
||||||
@@ -424,8 +424,8 @@ static int queue_cb(const struct nlmsghdr *nlh, void *data) {
|
|||||||
|
|
||||||
if (attr[NFQA_MARK] != NULL) {
|
if (attr[NFQA_MARK] != NULL) {
|
||||||
// Skip packets sent by rawsocket to escape infinity loop.
|
// Skip packets sent by rawsocket to escape infinity loop.
|
||||||
if ((ntohl(mnl_attr_get_u32(attr[NFQA_MARK])) & RAWSOCKET_MARK) ==
|
if ((ntohl(mnl_attr_get_u32(attr[NFQA_MARK])) & config.mark) ==
|
||||||
RAWSOCKET_MARK) {
|
config.mark) {
|
||||||
return fallback_accept_packet(packet.id, *qdata);
|
return fallback_accept_packet(packet.id, *qdata);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user