@@ -153,6 +153,36 @@ function parse_dnsquery(strquery) {
153
153
154
154
}
155
155
156
+ function generate_endpoint (node ) {
157
+ if (type (node ) !== 'object' || isEmpty (node ))
158
+ return null ;
159
+
160
+ const endpoint = {
161
+ type : node .type ,
162
+ tag : 'cfg-' + node ['.name' ] + '-out' ,
163
+ address : node .wireguard_local_address ,
164
+ mtu : strToInt (node .wireguard_mtu ),
165
+ private_key : node .wireguard_private_key ,
166
+ peers : (node .type === 'wireguard' ) ? [
167
+ {
168
+ address : node .address ,
169
+ port : strToInt (node .port ),
170
+ allowed_ips : [
171
+ '0.0.0.0/0' ,
172
+ '::/0'
173
+ ],
174
+ persistent_keepalive_interval : strToInt (node .wireguard_persistent_keepalive_interval ),
175
+ public_key : node .wireguard_peer_public_key ,
176
+ pre_shared_key : node .wireguard_pre_shared_key ,
177
+ reserved : parse_port (node .wireguard_reserved ),
178
+ }
179
+ ] : null ,
180
+ system : (node .type === 'wireguard' ) ? false : null ,
181
+ };
182
+
183
+ return endpoint ;
184
+ }
185
+
156
186
function generate_outbound (node ) {
157
187
if (type (node ) !== 'object' || isEmpty (node ))
158
188
return null ;
@@ -214,14 +244,6 @@ function generate_outbound(node) {
214
244
global_padding : node .vmess_global_padding ? (node .vmess_global_padding === '1' ) : null ,
215
245
authenticated_length : node .vmess_authenticated_length ? (node .vmess_authenticated_length === '1' ) : null ,
216
246
packet_encoding : node .packet_encoding ,
217
- /* WireGuard */
218
- gso : (node .wireguard_gso === '1' ) || null ,
219
- local_address : node .wireguard_local_address ,
220
- private_key : node .wireguard_private_key ,
221
- peer_public_key : node .wireguard_peer_public_key ,
222
- pre_shared_key : node .wireguard_pre_shared_key ,
223
- reserved : parse_port (node .wireguard_reserved ),
224
- mtu : strToInt (node .wireguard_mtu ),
225
247
226
248
multiplex : (node .multiplex === '1' ) ? {
227
249
enabled : true ,
@@ -573,6 +595,8 @@ if (match(proxy_mode, /tun/))
573
595
/* Inbound end */
574
596
575
597
/* Outbound start */
598
+ config .endpoints = [];
599
+
576
600
/* Default outbounds */
577
601
config .outbounds = [
578
602
{
@@ -602,9 +626,14 @@ if (!isEmpty(main_node)) {
602
626
urltest_nodes = main_urltest_nodes ;
603
627
} else {
604
628
const main_node_cfg = uci .get_all (uciconfig , main_node ) || {};
605
- push (config .outbounds , generate_outbound (main_node_cfg ));
606
- config .outbounds [length (config .outbounds )-1 ].domain_strategy = (ipv6_support !== '1' ) ? 'prefer_ipv4' : null ;
607
- config .outbounds [length (config .outbounds )-1 ].tag = 'main-out' ;
629
+ if (main_node_cfg .type === 'wireguard' ) {
630
+ push (config .endpoints , generate_endpoint (main_node_cfg ));
631
+ config .endpoints [length (config .endpoints )-1 ].tag = 'main-out' ;
632
+ } else {
633
+ push (config .outbounds , generate_outbound (main_node_cfg ));
634
+ config .outbounds [length (config .outbounds )-1 ].domain_strategy = (ipv6_support !== '1' ) ? 'prefer_ipv4' : null ;
635
+ config .outbounds [length (config .outbounds )-1 ].tag = 'main-out' ;
636
+ }
608
637
}
609
638
610
639
if (main_udp_node === 'urltest' ) {
@@ -623,14 +652,26 @@ if (!isEmpty(main_node)) {
623
652
urltest_nodes = [...urltest_nodes , ...filter (main_udp_urltest_nodes , (l ) => !~index (urltest_nodes , l ))];
624
653
} else if (dedicated_udp_node ) {
625
654
const main_udp_node_cfg = uci .get_all (uciconfig , main_udp_node ) || {};
626
- push (config .outbounds , generate_outbound (main_udp_node_cfg ));
627
- config .outbounds [length (config .outbounds )-1 ].domain_strategy = (ipv6_support !== '1' ) ? 'prefer_ipv4' : null ;
628
- config .outbounds [length (config .outbounds )-1 ].tag = 'main-udp-out' ;
655
+ if (main_node_cfg .type === 'wireguard' ) {
656
+ push (config .endpoints , generate_endpoint (main_udp_node_cfg ));
657
+ config .endpoints [length (config .endpoints )-1 ].tag = 'main-udp-out' ;
658
+ } else {
659
+ push (config .outbounds , generate_outbound (main_udp_node_cfg ));
660
+ config .outbounds [length (config .outbounds )-1 ].domain_strategy = (ipv6_support !== '1' ) ? 'prefer_ipv4' : null ;
661
+ config .outbounds [length (config .outbounds )-1 ].tag = 'main-udp-out' ;
662
+ }
629
663
}
630
664
631
665
for (let i in urltest_nodes ) {
632
- push (config .outbounds , generate_outbound (uci .get_all (uciconfig , i )));
633
- config .outbounds [length (config .outbounds )-1 ].domain_strategy = (ipv6_support !== '1' ) ? 'prefer_ipv4' : null ;
666
+ const urltest_node = uci .get_all (uciconfig , i ) || {};
667
+ if (urltest_node .type === 'wireguard' ) {
668
+ push (config .endpoints , generate_endpoint (urltest_node ));
669
+ config .endpoints [length (config .endpoints )-1 ].tag = 'cfg-' + i + '-out' ;
670
+ } else {
671
+ push (config .outbounds , generate_outbound (urltest_node ));
672
+ config .outbounds [length (config .outbounds )-1 ].domain_strategy = (ipv6_support !== '1' ) ? 'prefer_ipv4' : null ;
673
+ config .outbounds [length (config .outbounds )-1 ].tag = 'cfg-' + i + '-out' ;
674
+ }
634
675
}
635
676
} else if (!isEmpty (default_outbound )) {
636
677
let urltest_nodes = [],
@@ -654,17 +695,29 @@ if (!isEmpty(main_node)) {
654
695
urltest_nodes = [...urltest_nodes , ...filter (cfg .urltest_nodes , (l ) => !~index (urltest_nodes , l ))];
655
696
} else {
656
697
const outbound = uci .get_all (uciconfig , cfg .node ) || {};
657
- push (config .outbounds , generate_outbound (outbound ));
658
- config .outbounds [length (config .outbounds )-1 ].domain_strategy = cfg .domain_strategy ;
659
- config .outbounds [length (config .outbounds )-1 ].bind_interface = cfg .bind_interface ;
660
- config .outbounds [length (config .outbounds )-1 ].detour = get_outbound (cfg .outbound );
698
+ if (outbound .type === 'wireguard' ) {
699
+ push (config .endpoints , generate_endpoint (outbound ));
700
+ } else {
701
+ push (config .outbounds , generate_outbound (outbound ));
702
+ config .outbounds [length (config .outbounds )-1 ].domain_strategy = cfg .domain_strategy ;
703
+ config .outbounds [length (config .outbounds )-1 ].bind_interface = cfg .bind_interface ;
704
+ config .outbounds [length (config .outbounds )-1 ].detour = get_outbound (cfg .outbound );
705
+ }
661
706
push (routing_nodes , cfg .node );
662
707
}
663
708
});
664
709
665
- for (let i in filter (urltest_nodes , (l ) => !~index (routing_nodes , l )))
666
- push (config .outbounds , generate_outbound (uci .get_all (uciconfig , i )));
710
+ for (let i in filter (urltest_nodes , (l ) => !~index (routing_nodes , l ))) {
711
+ const urltest_node = uci .get_all (uciconfig , i ) || {};
712
+ if (urltest_node .type === 'wireguard' )
713
+ push (config .endpoints , generate_endpoint (urltest_node ));
714
+ else
715
+ push (config .outbounds , generate_outbound (urltest_node ));
716
+ }
667
717
}
718
+
719
+ if (isEmpty (config .endpoints ))
720
+ config .endpoints = null ;
668
721
/* Outbound end */
669
722
670
723
/* Routing rules start */
0 commit comments