update 2023-04-02 09:22:12

This commit is contained in:
github-actions[bot]
2023-04-02 09:22:12 +08:00
parent b46bfccbb7
commit c8f19a6b52
15 changed files with 876 additions and 847 deletions

View File

@@ -10,12 +10,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=haproxy
PKG_VERSION:=2.6.11
PKG_VERSION:=2.6.12
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://www.haproxy.org/download/2.6/src
PKG_HASH:=e0bc430ac407747b077bc88ee6922b4616fa55a9e0f3ec84438dfb055eb9a715
PKG_HASH:=58f9edb26bf3288f4b502658399281cc5d6478468bd178eafe579c8f41895854
PKG_MAINTAINER:=Thomas Heil <heil@terminal-consulting.de>, \
Christian Lachner <gladiac@gmail.com>

View File

@@ -1,7 +1,7 @@
#!/bin/sh
CLONEURL=https://git.haproxy.org/git/haproxy-2.6.git
BASE_TAG=v2.6.11
BASE_TAG=v2.6.12
TMP_REPODIR=tmprepo
PATCHESDIR=patches

View File

@@ -5,7 +5,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-homeproxy
PKG_VERSION:=usertesting-0328
PKG_VERSION:=dev-230402
LUCI_TITLE:=The modern ImmortalWrt proxy platform for ARM64/AMD64
LUCI_PKGARCH:=all
@@ -18,7 +18,12 @@ LUCI_DEPENDS:= \
define Package/luci-app-homeproxy/conffiles
/etc/config/homeproxy
/etc/homeproxy/certs/
/etc/homeproxy/resources/
/etc/homeproxy/resources/geoip.db
/etc/homeproxy/resources/geoip.ver
/etc/homeproxy/resources/geosite.db
/etc/homeproxy/resources/geosite.ver
/etc/homeproxy/resources/direct_list.txt
/etc/homeproxy/resources/proxy_list.txt
endef
include $(TOPDIR)/feeds/luci/luci.mk

View File

@@ -14,6 +14,7 @@
'require view';
'require homeproxy as hp';
'require tools.firewall as fwtool';
'require tools.widgets as widgets';
var callServiceList = rpc.declare({
@@ -217,7 +218,8 @@ return view.extend({
o = s.taboption('routing', form.ListValue, 'proxy_mode', _('Proxy mode'));
o.value('redirect', _('Redirect TCP'));
o.value('redirect_tproxy', _('Redirect TCP + TProxy UDP'));
if (features.hp_has_tproxy)
o.value('redirect_tproxy', _('Redirect TCP + TProxy UDP'));
if (features.hp_has_tun) {
o.value('redirect_tun', _('Redirect TCP + Tun UDP'));
o.value('tun', _('Tun TCP/UDP'));
@@ -824,20 +826,6 @@ return view.extend({
/* LAN IP policy start */
ss.tab('lan_ip_policy', _('LAN IP Policy'));
var ipaddrs = {}, ip6addrs = {};
Object.keys(hosts).forEach(function(mac) {
var addrs = L.toArray(hosts[mac].ipaddrs || hosts[mac].ipv4);
for (var i = 0; i < addrs.length; i++)
ipaddrs[addrs[i]] = hosts[mac].name || mac;
});
Object.keys(hosts).forEach(function(mac) {
var addrs = L.toArray(hosts[mac].ip6addrs || hosts[mac].ipv6);
for (var i = 0; i < addrs.length; i++)
ip6addrs[addrs[i]] = hosts[mac].name || mac;
});
so = ss.taboption('lan_ip_policy', form.ListValue, 'lan_proxy_mode', _('Proxy filter mode'));
so.value('disabled', _('Disable'));
so.value('listed_only', _('Proxy listed only'));
@@ -845,62 +833,39 @@ return view.extend({
so.default = 'disabled';
so.rmempty = false;
so = ss.taboption('lan_ip_policy', form.DynamicList, 'lan_direct_ipv4_ips', _('Direct IPv4 IP-s'));
so.datatype = 'or(ip4addr, cidr4)';
so = fwtool.addIPOption(ss, 'lan_ip_policy', 'lan_direct_ipv4_ips', _('Direct IPv4 IP-s'), null, 'ipv4', hosts, true);
so.depends('lan_proxy_mode', 'except_listed');
L.sortedKeys(ipaddrs, null, 'addr').forEach(function(ipv4) {
so.value(ipv4, '%s (%s)'.format(ipv4, ipaddrs[ipv4]));
});
so = ss.taboption('lan_ip_policy', form.DynamicList, 'lan_direct_ipv6_ips', _('Direct IPv6 IP-s'));
so.datatype = 'or(ip6addr, cidr6)';
so = fwtool.addIPOption(ss, 'lan_ip_policy', 'lan_direct_ipv6_ips', _('Direct IPv6 IP-s'), null, 'ipv6', hosts, true);
so.depends({'lan_proxy_mode': 'except_listed', 'homeproxy.config.ipv6_support': '1'});
so = fwtool.addMACOption(ss, 'lan_ip_policy', 'lan_direct_mac_addrs', _('Direct MAC-s'), null, hosts);
so.depends('lan_proxy_mode', 'except_listed');
L.sortedKeys(ip6addrs, null, 'addr').forEach(function(ipv6) {
so.value(ipv6, '%s (%s)'.format(ipv6, ip6addrs[ipv6]));
});
so.depends('homeproxy.config.ipv6_support', '1');
so = ss.taboption('lan_ip_policy', form.DynamicList, 'lan_proxy_ipv4_ips', _('Proxy IPv4 IP-s'));
so.datatype = 'or(ip4addr, cidr4)';
so = fwtool.addIPOption(ss, 'lan_ip_policy', 'lan_proxy_ipv4_ips', _('Proxy IPv4 IP-s'), null, 'ipv4', hosts, true);
so.depends('lan_proxy_mode', 'listed_only');
L.sortedKeys(ipaddrs, null, 'addr').forEach(function(ipv4) {
so.value(ipv4, '%s (%s)'.format(ipv4, ipaddrs[ipv4]));
});
so = ss.taboption('lan_ip_policy', form.DynamicList, 'lan_proxy_ipv6_ips', _('Proxy IPv6 IP-s'));
so.datatype = 'or(ip6addr, cidr6)';
so = fwtool.addIPOption(ss, 'lan_ip_policy', 'lan_proxy_ipv6_ips', _('Proxy IPv6 IP-s'), null, 'ipv6', hosts, true);
so.depends({'lan_proxy_mode': 'listed_only', 'homeproxy.config.ipv6_support': '1'});
so = fwtool.addMACOption(ss, 'lan_ip_policy', 'lan_proxy_mac_addrs', _('Proxy MAC-s'), null, hosts);
so.depends('lan_proxy_mode', 'listed_only');
L.sortedKeys(ip6addrs, null, 'addr').forEach(function(ipv6) {
so.value(ipv6, '%s (%s)'.format(ipv6, ip6addrs[ipv6]));
});
so = fwtool.addIPOption(ss, 'lan_ip_policy', 'lan_gaming_mode_ipv4_ips', _('Gaming mode IPv4 IP-s'), null, 'ipv4', hosts, true);
so = fwtool.addIPOption(ss, 'lan_ip_policy', 'lan_gaming_mode_ipv6_ips', _('Gaming mode IPv6 IP-s'), null, 'ipv6', hosts, true);
so.depends('homeproxy.config.ipv6_support', '1');
so = ss.taboption('lan_ip_policy', form.DynamicList, 'lan_gaming_mode_ipv4_ips', _('Gaming mode IPv4 IP-s'));
so.datatype = 'or(ip4addr, cidr4)';
L.sortedKeys(ipaddrs, null, 'addr').forEach(function(ipv4) {
so.value(ipv4, '%s (%s)'.format(ipv4, ipaddrs[ipv4]));
});
so = fwtool.addMACOption(ss, 'lan_ip_policy', 'lan_gaming_mode_mac_addrs', _('Gaming mode MAC-s'), null, hosts);
so = ss.taboption('lan_ip_policy', form.DynamicList, 'lan_gaming_mode_ipv6_ips', _('Gaming mode IPv6 IP-s'));
so.datatype = 'or(ip6addr, cidr6)';
L.sortedKeys(ip6addrs, null, 'addr').forEach(function(ipv6) {
so.value(ipv6, '%s (%s)'.format(ipv6, ip6addrs[ipv6]));
});
so.depends('homeproxy.config.ipv6_support', '1');
so = ss.taboption('lan_ip_policy', form.DynamicList, 'lan_global_proxy_ipv4_ips', _('Global proxy IPv4 IP-s'));
so.datatype = 'or(ip4addr, cidr4)';
L.sortedKeys(ipaddrs, null, 'addr').forEach(function(ipv4) {
so.value(ipv4, '%s (%s)'.format(ipv4, ipaddrs[ipv4]));
});
so = fwtool.addIPOption(ss, 'lan_ip_policy', 'lan_global_proxy_ipv4_ips', _('Global proxy IPv4 IP-s'), null, 'ipv4', hosts, true);
so.depends({'homeproxy.config.routing_mode': 'custom', '!reverse': true});
so = ss.taboption('lan_ip_policy', form.DynamicList, 'lan_global_proxy_ipv6_ips', _('Global proxy IPv6 IP-s'));
so.datatype = 'or(ip6addr, cidr6)';
L.sortedKeys(ip6addrs, null, 'addr').forEach(function(ipv6) {
so.value(ipv6, '%s (%s)'.format(ipv6, ip6addrs[ipv6]));
});
so = fwtool.addIPOption(ss, 'lan_ip_policy', 'lan_global_proxy_ipv6_ips', _('Global proxy IPv6 IP-s'), null, 'ipv6', hosts, true);
so.depends({'homeproxy.config.routing_mode': /^((?!custom).)+$/, 'homeproxy.config.ipv6_support': '1'});
so = fwtool.addMACOption(ss, 'lan_ip_policy', 'lan_global_proxy_mac_addrs', _('Global proxy MAC-s'), null, hosts);
so.depends({'homeproxy.config.routing_mode': 'custom', '!reverse': true});
/* LAN IP policy end */
/* WAN IP policy start */

View File

@@ -35,7 +35,7 @@ return view.extend({
o.default = o.disabled;
o.rmempty = false;
s = m.section(form.GridSection, 'server');
s = m.section(form.GridSection, 'server', _('Server settings'));
s.addremove = true;
s.rowcolors = true;
s.sortable = true;

View File

@@ -9,6 +9,7 @@
'require fs';
'require poll';
'require rpc';
'require uci';
'require ui';
'require view';
@@ -74,7 +75,8 @@ function getResVersion(self, type) {
}, [ _('Check update') ]),
' ',
E('strong', { 'style': (res.error ? 'color:red' : 'color:green') },
[ res.error ? 'not found' : res.version ]),
[ res.error ? 'not found' : res.version ]
),
]);
self.default = spanTemp;
@@ -144,21 +146,30 @@ function getRuntimeLog(name) {
}
return view.extend({
render: function() {
load: function() {
return Promise.all([
uci.load('homeproxy')
]);
},
render: function(data) {
var m, s, o;
var routing_mode = uci.get(data[0], 'config', 'routing_mode') || 'bypass_mainland_china';
m = new form.Map('homeproxy');
s = m.section(form.NamedSection, 'config', 'homeproxy', _('Resources management'));
s.anonymous = true;
o = s.option(form.DummyValue, '_geoip_version', _('GeoIP version'));
o.cfgvalue = function() { return getResVersion(this, 'geoip') };
o.rawhtml = true;
if (routing_mode === 'custom') {
o = s.option(form.DummyValue, '_geoip_version', _('GeoIP version'));
o.cfgvalue = function() { return getResVersion(this, 'geoip') };
o.rawhtml = true;
o = s.option(form.DummyValue, '_geosite_version', _('GeoSite version'));
o.cfgvalue = function() { return getResVersion(this, 'geosite') };
o.rawhtml = true;
o = s.option(form.DummyValue, '_geosite_version', _('GeoSite version'));
o.cfgvalue = function() { return getResVersion(this, 'geosite') };
o.rawhtml = true;
}
o = s.option(form.DummyValue, '_china_ip4_version', _('China IPv4 list version'));
o.cfgvalue = function() { return getResVersion(this, 'china_ip4') };
@@ -168,14 +179,14 @@ return view.extend({
o.cfgvalue = function() { return getResVersion(this, 'china_ip6') };
o.rawhtml = true;
o = s.option(form.DummyValue, '_gfw_list_version', _('GFW list version'));
o.cfgvalue = function() { return getResVersion(this, 'gfw_list') };
o.rawhtml = true;
o = s.option(form.DummyValue, '_china_list_version', _('China list version'));
o.cfgvalue = function() { return getResVersion(this, 'china_list') };
o.rawhtml = true;
o = s.option(form.DummyValue, '_gfw_list_version', _('GFW list version'));
o.cfgvalue = function() { return getResVersion(this, 'gfw_list') };
o.rawhtml = true;
o = s.option(form.DummyValue, '_homeproxy_logview');
o.render = L.bind(getRuntimeLog, this, 'HomeProxy');

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -5,12 +5,29 @@
import { readfile } from 'fs';
import { cursor } from 'uci';
import { isEmpty } from '/etc/homeproxy/scripts/homeproxy.uc';
function array_to_nftstr(array) {
const fw4 = require('fw4');
function array_to_nftarr(array) {
if (type(array) !== 'array')
return array;
return null;
return join(', ', array);
return `{ ${join(', ', uniq(array))} }`;
}
function resolve_ipv6(str) {
if (isEmpty(str))
return null;
let ipv6 = fw4.parse_subnet(str)?.[0];
if (!ipv6 || ipv6.family !== 6)
return null;
if (ipv6.bits > -1)
return `${ipv6.addr}/${ipv6.bits}`;
else
return `& ${ipv6.mask} == ${ipv6.addr}`;
}
/* Misc config */
@@ -62,7 +79,7 @@ const control_options = [
"lan_direct_mac_addrs", "lan_direct_ipv4_ips", "lan_direct_ipv6_ips",
"lan_proxy_mac_addrs", "lan_proxy_ipv4_ips", "lan_proxy_ipv6_ips",
"lan_gaming_mode_mac_addrs", "lan_gaming_mode_ipv4_ips", "lan_gaming_mode_ipv6_ips",
"lan_global_proxy_ipv4_ips", "lan_global_proxy_ipv6_ips",
"lan_global_proxy_mac_addrs", "lan_global_proxy_ipv4_ips", "lan_global_proxy_ipv6_ips",
"wan_proxy_ipv4_ips", "wan_proxy_ipv6_ips",
"wan_direct_ipv4_ips", "wan_direct_ipv6_ips"
];
@@ -160,91 +177,6 @@ set homeproxy_mainland_addr_v6 {
{% endif /* ipv6_support */ %}
{% endif /* routing_mode */ %}
{# LAN ACL addresses #}
{% if (control_info.lan_proxy_mode === 'listed_only'): %}
set homeproxy_lan_proxy_addr_v4 {
type ipv4_addr
flags interval
auto-merge
{% if (control_info.lan_proxy_ipv4_ips): %}
elements = { {{ join(', ', control_info.lan_proxy_ipv4_ips) }} }
{% endif %}
}
{% if (ipv6_support === '1'): %}
set homeproxy_lan_proxy_addr_v6 {
type ipv6_addr
flags interval
auto-merge
{% if (control_info.lan_proxy_ipv6_ips): %}
elements = { {{ join(', ', control_info.lan_proxy_ipv6_ips) }} }
{% endif /* lan_proxy_ipv6_ips */ %}
{% endif /* ipv6_support */ %}
}
{% elif (control_info.lan_proxy_mode === 'except_listed'): %}
set homeproxy_lan_direct_addr_v4 {
type ipv4_addr
flags interval
auto-merge
{% if (control_info.lan_direct_ipv4_ips): %}
elements = { {{ join(', ', control_info.lan_direct_ipv4_ips) }} }
{% endif %}
}
{% if (ipv6_support === '1'): %}
set homeproxy_lan_direct_addr_v6 {
type ipv6_addr
flags interval
auto-merge
{% if (control_info.lan_direct_ipv6_ips): %}
elements = { {{ join(', ', control_info.lan_direct_ipv6_ips) }} }
{% endif /* lan_direct_ipv6_ips */ %}
}
{% endif /* ipv6_support */ %}
{% endif /* lan_proxy_mode */ %}
set homeproxy_lan_gaming_addr_v4 {
type ipv4_addr
flags interval
auto-merge
{% if (control_info.lan_gaming_mode_ipv4_ips): %}
elements = { {{ join(', ', control_info.lan_gaming_mode_ipv4_ips) }} }
{% endif %}
}
{% if (ipv6_support === '1'): %}
set homeproxy_lan_gaming_addr_v6 {
type ipv6_addr
flags interval
auto-merge
{% if (control_info.lan_gaming_mode_ipv6_ips): %}
elements = { {{ join(', ', control_info.lan_gaming_mode_ipv6_ips) }} }
{% endif /* lan_gaming_mode_ipv6_ips */ %}
}
{% endif /* ipv6_support */ %}
{% if (routing_mode !== 'custom'): %}
set homeproxy_lan_global_proxy_addr_v4 {
type ipv4_addr
flags interval
auto-merge
{% if (control_info.lan_global_proxy_ipv4_ips): %}
elements = { {{ join(', ', control_info.lan_global_proxy_ipv4_ips) }} }
{% endif /* lan_global_proxy_ipv4_ips */ %}
}
{% if (ipv6_support === '1'): %}
set homeproxy_lan_global_proxy_addr_v6 {
type ipv6_addr
flags interval
auto-merge
{% if (control_info.lan_global_proxy_ipv6_ips): %}
elements = { {{ join(', ', control_info.lan_global_proxy_ipv6_ips) }} }
{% endif /* lan_global_proxy_ipv6_ips */ %}
}
{% endif /* ipv6_support */ %}
{% endif /* routing_mode */ %}
{# WAN ACL addresses #}
set homeproxy_wan_proxy_addr_v4 {
type ipv4_addr
@@ -297,6 +229,10 @@ set homeproxy_routing_port {
{# TCP redirect #}
{% if (match(proxy_mode, /redirect/)): %}
chain homeproxy_redirect_proxy {
meta l4proto tcp counter redirect to :{{ redirect_port }}
}
chain homeproxy_redirect_proxy_port {
{% if (routing_port !== 'all'): %}
tcp dport != @homeproxy_routing_port counter return
@@ -304,25 +240,42 @@ chain homeproxy_redirect_proxy_port {
goto homeproxy_redirect_proxy
}
chain homeproxy_redirect_proxy {
meta l4proto tcp counter redirect to :{{ redirect_port }}
chain homeproxy_redirect_lanac {
{% if (control_info.listen_interfaces): %}
meta iifname != {{ array_to_nftarr(control_info.listen_interfaces) }} counter return
{% endif %}
meta mark {{ self_mark }} counter return
{% if (control_info.lan_proxy_mode === 'listed_only'): %}
{% if (!isEmpty(control_info.lan_proxy_ipv4_ips)): %}
ip saddr {{ array_to_nftarr(control_info.lan_proxy_ipv4_ips) }} counter goto homeproxy_redirect
{% endif /* lan_proxy_ipv4_ips */ %}
{% for (let ipv6 in control_info.lan_proxy_ipv6_ips): %}
ip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_redirect
{% endfor /* lan_proxy_ipv6_ips */ %}
{% if (!isEmpty(control_info.lan_proxy_mac_addrs)): %}
ether saddr {{ array_to_nftarr(control_info.lan_proxy_mac_addrs) }} counter goto homeproxy_redirect
{% endif /* lan_proxy_mac_addrs */ %}
{% elif (control_info.lan_proxy_mode === 'except_listed'): %}
{% if (!isEmpty(control_info.lan_direct_ipv4_ips)): %}
ip saddr {{ array_to_nftarr(control_info.lan_direct_ipv4_ips) }} counter return
{% endif /* lan_direct_ipv4_ips */ %}
{% for (let ipv6 in control_info.lan_direct_ipv6_ips): %}
ip6 saddr {{ resolve_ipv6(ipv6) }} counter return
{% endfor /* lan_direct_ipv6_ips */ %}
{% if (!isEmpty(control_info.lan_direct_mac_addrs)): %}
ether saddr {{ array_to_nftarr(control_info.lan_direct_mac_addrs) }} counter return
{% endif /* lan_direct_mac_addrs */ %}
{% endif /* lan_proxy_mode */ %}
{% if (control_info.lan_proxy_mode !== 'listed_only'): %}
counter goto homeproxy_redirect
{% endif %}
}
chain homeproxy_redirect {
meta mark {{ self_mark }} counter return
{% if (control_info.lan_proxy_mode === 'listed_only'): %}
ip saddr != @homeproxy_lan_proxy_addr_v4 counter return
{% if (ipv6_support === '1'): %}
ip6 saddr != @homeproxy_lan_proxy_addr_v6 counter return
{% endif /* ipv6_support */ %}
{% elif (control_info.lan_proxy_mode === 'except_listed'): %}
ip saddr @homeproxy_lan_direct_addr_v4 counter return
{% if (ipv6_support === '1'): %}
ip6 saddr @homeproxy_lan_direct_addr_v6 counter return
{% endif /* ipv6_support */ %}
{% endif /* lan_proxy_mode */ %}
ip daddr @homeproxy_wan_proxy_addr_v4 counter goto homeproxy_redirect_proxy_port
{% if (ipv6_support === '1'): %}
ip6 daddr @homeproxy_wan_proxy_addr_v6 counter goto homeproxy_redirect_proxy_port
@@ -334,10 +287,15 @@ chain homeproxy_redirect {
{% endif %}
{% if (routing_mode !== 'custom'): %}
ip saddr @homeproxy_lan_global_proxy_addr_v4 counter goto homeproxy_redirect_proxy_port
{% if (ipv6_support === '1'): %}
ip6 saddr @homeproxy_lan_global_proxy_addr_v6 counter goto homeproxy_redirect_proxy_port
{% endif /* ipv6_support */ %}
{% if (!isEmpty(control_info.lan_global_proxy_ipv4_ips)): %}
ip saddr {{ array_to_nftarr(control_info.lan_global_proxy_ipv4_ips) }} counter goto homeproxy_redirect
{% endif /* lan_global_proxy_ipv4_ips */ %}
{% for (let ipv6 in control_info.lan_global_proxy_ipv6_ips): %}
ip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_redirect
{% endfor /* lan_global_proxy_ipv6_ips */ %}
{% if (!isEmpty(control_info.lan_global_proxy_mac_addrs)): %}
ether saddr {{ array_to_nftarr(control_info.lan_global_proxy_mac_addrs) }} counter goto homeproxy_redirect
{% endif /* lan_global_proxy_mac_addrs */ %}
{% endif /* routing_mode */ %}
ip daddr @homeproxy_wan_direct_addr_v4 counter return
@@ -362,41 +320,31 @@ chain homeproxy_redirect {
{% endif /* ipv6_support */ %}
{% endif /* routing_mode */ %}
ip saddr @homeproxy_lan_gaming_addr_v4 counter goto homeproxy_redirect_proxy
{% if (ipv6_support === '1'): %}
ip6 saddr @homeproxy_lan_gaming_addr_v6 counter goto homeproxy_redirect_proxy
{% endif /* ipv6_support */ %}
{% if (!isEmpty(control_info.lan_gaming_mode_ipv4_ips)): %}
ip saddr {{ array_to_nftarr(control_info.lan_gaming_mode_ipv4_ips) }} counter goto homeproxy_redirect_proxy
{% endif /* lan_gaming_mode_ipv4_ips */ %}
{% for (let ipv6 in control_info.lan_gaming_mode_ipv6_ips): %}
ip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_redirect_proxy
{% endfor /* lan_gaming_mode_ipv6_ips */ %}
{% if (!isEmpty(control_info.lan_gaming_mode_mac_addrs)): %}
ether saddr {{ array_to_nftarr(control_info.lan_gaming_mode_mac_addrs) }} counter goto homeproxy_redirect_proxy
{% endif /* lan_gaming_mode_mac_addrs */ %}
counter goto homeproxy_redirect_proxy_port
}
chain homeproxy_dstnat_redir {
{% if (control_info.listen_interfaces): %}
meta iifname != { {{ array_to_nftstr(control_info.listen_interfaces) }} } counter return
{% endif %}
goto homeproxy_redirect
}
chain homeproxy_output_redir {
type nat hook output priority filter -105; policy accept
meta nfproto { {{ (ipv6_support === '1') ? 'ipv4, ipv6' : 'ipv4' }} } meta l4proto tcp jump homeproxy_redirect
}
chain dstnat {
meta nfproto { {{ (ipv6_support === '1') ? 'ipv4, ipv6' : 'ipv4' }} } meta l4proto tcp jump homeproxy_dstnat_redir
meta nfproto { {{ (ipv6_support === '1') ? 'ipv4, ipv6' : 'ipv4' }} } meta l4proto tcp jump homeproxy_redirect_lanac
}
{% endif %}
{# UDP tproxy #}
{% if (match(proxy_mode, /tproxy/) && (outbound_udp_node !== 'nil' || routing_mode === 'custom')): %}
chain homeproxy_mangle_tproxy_port {
{% if (routing_port !== 'all'): %}
udp dport != @homeproxy_routing_port counter return
{% endif %}
goto homeproxy_mangle_tproxy
}
chain homeproxy_mangle_tproxy {
meta l4proto udp mark set {{ tproxy_mark }} tproxy ip to 127.0.0.1:{{ tproxy_port }} counter accept
{% if (ipv6_support === '1'): %}
@@ -404,6 +352,13 @@ chain homeproxy_mangle_tproxy {
{% endif %}
}
chain homeproxy_mangle_tproxy_port {
{% if (routing_port !== 'all'): %}
udp dport != @homeproxy_routing_port counter return
{% endif %}
goto homeproxy_mangle_tproxy
}
chain homeproxy_mangle_mark {
{% if (routing_port !== 'all'): %}
udp dport != @homeproxy_routing_port counter return
@@ -411,25 +366,40 @@ chain homeproxy_mangle_mark {
meta l4proto udp mark set {{ tproxy_mark }} counter accept
}
chain homeproxy_mangle_prerouting {
chain homeproxy_mangle_lanac {
{% if (control_info.listen_interfaces): %}
meta iifname != { {{ array_to_nftstr(control_info.listen_interfaces) }}, lo } counter return
meta iifname != {{ array_to_nftarr(split(join(' ', control_info.listen_interfaces) + ' lo', ' ')) }} counter return
{% endif %}
meta mark {{ self_mark }} counter return
{% if (control_info.lan_proxy_mode === 'listed_only'): %}
ip saddr != @homeproxy_lan_proxy_addr_v4 counter return
{% if (ipv6_support === '1'): %}
ip6 saddr != @homeproxy_lan_proxy_addr_v6 counter return
{% endif /* ipv6_support */ %}
{% if (!isEmpty(control_info.lan_proxy_ipv4_ips)): %}
ip saddr {{ array_to_nftarr(control_info.lan_proxy_ipv4_ips) }} counter goto homeproxy_mangle_prerouting
{% endif /* lan_proxy_ipv4_ips */ %}
{% for (let ipv6 in control_info.lan_proxy_ipv6_ips): %}
ip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_mangle_prerouting
{% endfor /* lan_proxy_ipv6_ips */ %}
{% if (!isEmpty(control_info.lan_proxy_mac_addrs)): %}
ether saddr {{ array_to_nftarr(control_info.lan_proxy_mac_addrs) }} counter goto homeproxy_mangle_prerouting
{% endif /* lan_proxy_mac_addrs */ %}
{% elif (control_info.lan_proxy_mode === 'except_listed'): %}
ip saddr @homeproxy_lan_direct_addr_v4 counter return
{% if (ipv6_support === '1'): %}
ip6 saddr @homeproxy_lan_direct_addr_v6 counter return
{% endif /* ipv6_support */ %}
{% if (!isEmpty(control_info.lan_direct_ipv4_ips)): %}
ip saddr {{ array_to_nftarr(control_info.lan_direct_ipv4_ips) }} counter return
{% endif /* lan_direct_ipv4_ips */ %}
{% for (let ipv6 in control_info.lan_direct_ipv6_ips): %}
ip6 saddr {{ resolve_ipv6(ipv6) }} counter return
{% endfor /* lan_direct_ipv6_ips */ %}
{% if (!isEmpty(control_info.lan_direct_mac_addrs)): %}
ether saddr {{ array_to_nftarr(control_info.lan_direct_mac_addrs) }} counter return
{% endif /* lan_direct_mac_addrs */ %}
{% endif /* lan_proxy_mode */ %}
{% if (control_info.lan_proxy_mode !== 'listed_only'): %}
counter goto homeproxy_mangle_prerouting
{% endif %}
}
chain homeproxy_mangle_prerouting {
ip daddr @homeproxy_wan_proxy_addr_v4 counter goto homeproxy_mangle_tproxy_port
{% if (ipv6_support === '1'): %}
ip6 daddr @homeproxy_wan_proxy_addr_v6 counter goto homeproxy_mangle_tproxy_port
@@ -441,10 +411,15 @@ chain homeproxy_mangle_prerouting {
{% endif %}
{% if (routing_mode !== 'custom'): %}
ip saddr @homeproxy_lan_global_proxy_addr_v4 counter goto homeproxy_mangle_tproxy_port
{% if (ipv6_support === '1'): %}
ip6 saddr @homeproxy_lan_global_proxy_addr_v6 counter goto homeproxy_mangle_tproxy_port
{% endif /* ipv6_support */ %}
{% if (!isEmpty(control_info.lan_global_proxy_ipv4_ips)): %}
ip saddr {{ array_to_nftarr(control_info.lan_global_proxy_ipv4_ips) }} counter goto homeproxy_mangle_tproxy_port
{% endif /* lan_global_proxy_ipv4_ips */ %}
{% for (let ipv6 in control_info.lan_global_proxy_ipv6_ips): %}
ip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_mangle_tproxy_port
{% endfor /* lan_global_proxy_ipv6_ips */ %}
{% if (!isEmpty(control_info.lan_global_proxy_mac_addrs)): %}
ether saddr {{ array_to_nftarr(control_info.lan_global_proxy_mac_addrs) }} counter goto homeproxy_mangle_tproxy_port
{% endif /* lan_global_proxy_mac_addrs */ %}
{% endif /* routing_mode */ %}
ip daddr @homeproxy_wan_direct_addr_v4 counter return
@@ -473,10 +448,15 @@ chain homeproxy_mangle_prerouting {
{% endif /* ipv6_support */ %}
{% endif /* routing_mode */ %}
ip saddr @homeproxy_lan_gaming_addr_v4 counter goto homeproxy_mangle_tproxy
{% if (ipv6_support === '1'): %}
ip6 saddr @homeproxy_lan_gaming_addr_v6 counter goto homeproxy_mangle_tproxy
{% endif /* ipv6_support */ %}
{% if (!isEmpty(control_info.lan_gaming_mode_ipv4_ips)): %}
ip saddr {{ array_to_nftarr(control_info.lan_gaming_mode_ipv4_ips) }} counter goto homeproxy_mangle_tproxy
{% endif /* lan_gaming_mode_ipv4_ips */ %}
{% for (let ipv6 in control_info.lan_gaming_mode_ipv6_ips): %}
ip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_mangle_tproxy
{% endfor /* lan_gaming_mode_ipv6_ips */ %}
{% if (!isEmpty(control_info.lan_gaming_mode_mac_addrs)): %}
ether saddr {{ array_to_nftarr(control_info.lan_gaming_mode_mac_addrs) }} counter goto homeproxy_mangle_tproxy
{% endif /* lan_gaming_mode_mac_addrs */ %}
counter goto homeproxy_mangle_tproxy_port
}
@@ -520,7 +500,7 @@ chain homeproxy_mangle_output {
}
chain mangle_prerouting {
meta nfproto { {{ (ipv6_support === '1') ? 'ipv4, ipv6' : 'ipv4' }} } meta l4proto udp jump homeproxy_mangle_prerouting
meta nfproto { {{ (ipv6_support === '1') ? 'ipv4, ipv6' : 'ipv4' }} } meta l4proto udp jump homeproxy_mangle_lanac
}
chain mangle_output {
@@ -530,11 +510,38 @@ chain mangle_output {
{# TUN #}
{% if (match(proxy_mode, /tun/)): %}
chain homeproxy_mangle_prerouting_tun {
chain homeproxy_mangle_lanac {
iifname {{ tun_name }} counter return
{% if (control_info.listen_interfaces): %}
meta iifname != { {{ array_to_nftstr(control_info.listen_interfaces) }} } counter return
meta iifname != {{ array_to_nftarr(control_info.listen_interfaces) }} counter return
{% endif %}
{% if (control_info.lan_proxy_mode === 'listed_only'): %}
{% if (!isEmpty(control_info.lan_proxy_ipv4_ips)): %}
ip saddr {{ array_to_nftarr(control_info.lan_proxy_ipv4_ips) }} counter goto homeproxy_mangle_tun
{% endif /* lan_proxy_ipv4_ips */ %}
{% for (let ipv6 in control_info.lan_proxy_ipv6_ips): %}
ip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_mangle_tun
{% endfor /* lan_proxy_ipv6_ips */ %}
{% if (!isEmpty(control_info.lan_proxy_mac_addrs)): %}
ether saddr {{ array_to_nftarr(control_info.lan_proxy_mac_addrs) }} counter goto homeproxy_mangle_tun
{% endif /* lan_proxy_mac_addrs */ %}
{% elif (control_info.lan_proxy_mode === 'except_listed'): %}
{% if (!isEmpty(control_info.lan_direct_ipv4_ips)): %}
ip saddr {{ array_to_nftarr(control_info.lan_direct_ipv4_ips) }} counter return
{% endif /* lan_direct_ipv4_ips */ %}
{% for (let ipv6 in control_info.lan_direct_ipv6_ips): %}
ip6 saddr {{ resolve_ipv6(ipv6) }} counter return
{% endfor /* lan_direct_ipv6_ips */ %}
{% if (!isEmpty(control_info.lan_direct_mac_addrs)): %}
ether saddr {{ array_to_nftarr(control_info.lan_direct_mac_addrs) }} counter return
{% endif /* lan_direct_mac_addrs */ %}
{% endif /* lan_proxy_mode */ %}
{% if (control_info.lan_proxy_mode !== 'listed_only'): %}
counter goto homeproxy_mangle_tun
{% endif %}
jump homeproxy_mangle_tun
}
chain homeproxy_mangle_tun_mark {
@@ -551,18 +558,6 @@ chain homeproxy_mangle_tun_mark {
chain homeproxy_mangle_tun {
iifname {{ tun_name }} counter return
{% if (control_info.lan_proxy_mode === 'listed_only'): %}
ip saddr != @homeproxy_lan_proxy_addr_v4 counter return
{% if (ipv6_support === '1'): %}
ip6 saddr != @homeproxy_lan_proxy_addr_v6 counter return
{% endif /* ipv6_support */ %}
{% elif (control_info.lan_proxy_mode === 'except_listed'): %}
ip saddr @homeproxy_lan_direct_addr_v4 counter return
{% if (ipv6_support === '1'): %}
ip6 saddr @homeproxy_lan_direct_addr_v6 counter return
{% endif /* ipv6_support */ %}
{% endif /* lan_proxy_mode */ %}
ip daddr @homeproxy_wan_proxy_addr_v4 counter goto homeproxy_mangle_tun_mark
{% if (ipv6_support === '1'): %}
ip6 daddr @homeproxy_wan_proxy_addr_v6 counter goto homeproxy_mangle_tun_mark
@@ -574,17 +569,22 @@ chain homeproxy_mangle_tun {
{% endif %}
{% if (routing_mode !== 'custom'): %}
ip saddr @homeproxy_lan_global_proxy_addr_v4 counter goto homeproxy_mangle_tun_mark
{% if (ipv6_support === '1'): %}
ip6 saddr @homeproxy_lan_global_proxy_addr_v6 counter goto homeproxy_mangle_tun_mark
{% endif /* ipv6_support */ %}
{% if (!isEmpty(control_info.lan_global_proxy_ipv4_ips)): %}
ip saddr {{ array_to_nftarr(control_info.lan_global_proxy_ipv4_ips) }} counter goto homeproxy_mangle_tun_mark
{% endif /* lan_global_proxy_ipv4_ips */ %}
{% for (let ipv6 in control_info.lan_global_proxy_ipv6_ips): %}
ip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_mangle_tun_mark
{% endfor /* lan_global_proxy_ipv6_ips */ %}
{% if (!isEmpty(control_info.lan_global_proxy_mac_addrs)): %}
ether saddr {{ array_to_nftarr(control_info.lan_global_proxy_mac_addrs) }} counter goto homeproxy_mangle_tun_mark
{% endif /* lan_global_proxy_mac_addrs */ %}
{% endif /* routing_mode */ %}
{% if (control_info.wan_direct_ipv4_ips): %}
ip daddr { {{ array_to_nftstr(control_info.wan_direct_ipv4_ips) }} } counter return
ip daddr {{ array_to_nftarr(control_info.wan_direct_ipv4_ips) }} counter return
{% endif /* wan_direct_ipv4_ips */ %}
{% if (control_info.wan_direct_ipv6_ips): %}
ip6 daddr { {{ array_to_nftstr(control_info.wan_direct_ipv6_ips) }} } counter return
ip6 daddr {{ array_to_nftarr(control_info.wan_direct_ipv6_ips) }} counter return
{% endif /* wan_direct_ipv6_ips */ %}
{% if (routing_mode === 'gfwlist'): %}
@@ -608,16 +608,21 @@ chain homeproxy_mangle_tun {
{% endif /* ipv6_support */ %}
{% endif /* routing_mode */ %}
ip saddr @homeproxy_lan_gaming_addr_v4 counter mark set {{ tun_mark }}
{% if (ipv6_support === '1'): %}
ip6 saddr @homeproxy_lan_gaming_addr_v6 counter mark set {{ tun_mark }}
{% endif /* ipv6_support */ %}
{% if (!isEmpty(control_info.lan_gaming_mode_ipv4_ips)): %}
ip saddr {{ array_to_nftarr(control_info.lan_gaming_mode_ipv4_ips) }} counter mark set {{ tun_mark }}
{% endif /* lan_gaming_mode_ipv4_ips */ %}
{% for (let ipv6 in control_info.lan_gaming_mode_ipv6_ips): %}
ip6 saddr {{ resolve_ipv6(ipv6) }} counter mark set {{ tun_mark }}
{% endfor /* lan_gaming_mode_ipv6_ips */ %}
{% if (!isEmpty(control_info.lan_gaming_mode_mac_addrs)): %}
ether saddr {{ array_to_nftarr(control_info.lan_gaming_mode_mac_addrs) }} counter mark set {{ tun_mark }}
{% endif /* lan_gaming_mode_mac_addrs */ %}
counter goto homeproxy_mangle_tun_mark
}
chain mangle_prerouting {
meta nfproto { {{ (ipv6_support === '1') ? 'ipv4, ipv6' : 'ipv4' }} } meta l4proto { {{ (proxy_mode === 'tun') ? 'tcp, udp' : 'udp' }} } jump homeproxy_mangle_prerouting_tun
meta nfproto { {{ (ipv6_support === '1') ? 'ipv4, ipv6' : 'ipv4' }} } meta l4proto { {{ (proxy_mode === 'tun') ? 'tcp, udp' : 'udp' }} } jump homeproxy_mangle_lanac
}
chain mangle_output {

View File

@@ -609,24 +609,8 @@ if (!isEmpty(main_node) || !isEmpty(default_outbound))
default_interface: default_interface
};
/* Routing rules */
if (!isEmpty(main_node)) {
/* Routing rules */
/* LAN ACL */
if (length(lan_proxy_ips)) {
if (dedicated_udp_node) {
push(config.route.rules, {
source_ip_cidr: lan_proxy_ips,
network: 'udp',
outbound: 'main-udp-out'
});
}
push(config.route.rules, {
source_ip_cidr: lan_proxy_ips,
outbound: 'main-out'
});
}
/* Direct list */
if (length(direct_domain_list))
push(config.route.rules, {

View File

@@ -133,7 +133,6 @@ start_service() {
fi
utpl -S "$HP_DIR/scripts/firewall_post.ut" > "$RUN_DIR/fw4_post.nft"
fi
utpl -S "$HP_DIR/scripts/firewall_pre.ut" > "$RUN_DIR/fw4_pre.nft"
@@ -191,22 +190,18 @@ stop_service() {
# Nftables rules
for i in "homeproxy_dstnat_redir" "homeproxy_output_redir" \
"homeproxy_redirect" "homeproxy_redirect_proxy_port" \
"homeproxy_redirect_proxy" "homeproxy_mangle_prerouting" \
"homeproxy_mangle_output" "homeproxy_mangle_tproxy_port" \
"homeproxy_mangle_tproxy" "homeproxy_mangle_mark" \
"homeproxy_mangle_tun" "homeproxy_mangle_tun_mark" \
"homeproxy_mangle_prerouting_tun"; do
"homeproxy_redirect" "homeproxy_redirect_proxy" \
"homeproxy_redirect_proxy_port" "homeproxy_redirect_lanac" \
"homeproxy_mangle_prerouting" "homeproxy_mangle_output" \
"homeproxy_mangle_tproxy" "homeproxy_mangle_tproxy_port" \
"homeproxy_mangle_tproxy_lanac" "homeproxy_mangle_mark" \
"homeproxy_mangle_tun" "homeproxy_mangle_tun_mark"; do
nft flush chain inet fw4 "$i"
nft delete chain inet fw4 "$i"
done 2>"/dev/null"
for i in "homeproxy_local_addr_v4" "homeproxy_local_addr_v6" \
"homeproxy_gfw_list_v4" "homeproxy_gfw_list_v6" \
"homeproxy_mainland_addr_v4" "homeproxy_mainland_addr_v6" \
"homeproxy_lan_proxy_addr_v4" "homeproxy_lan_proxy_addr_v6" \
"homeproxy_lan_direct_addr_v4" "homeproxy_lan_direct_addr_v6" \
"homeproxy_lan_gaming_addr_v4" "homeproxy_lan_gaming_addr_v6" \
"homeproxy_lan_global_proxy_addr_v4" "homeproxy_lan_global_proxy_addr_v6" \
"homeproxy_wan_proxy_addr_v4" "homeproxy_wan_proxy_addr_v6" \
"homeproxy_wan_direct_addr_v4" "homeproxy_wan_direct_addr_v6" \
"homeproxy_routing_port"; do

View File

@@ -148,6 +148,7 @@ const methods = {
fd.close();
}
features.hp_has_tproxy = access('/etc/modules.d/nft-tproxy');
features.hp_has_tun = access('/etc/modules.d/30-tun');
return features;

View File

@@ -643,6 +643,7 @@
10000tc.com
10000yao.com
10001wan.com
100024.xyz
1000360.com
10006.info
1000ci.net
@@ -1770,6 +1771,7 @@
1kuang.com
1kx.me
1kxun.com
1kyx.com
1lan.tv
1lewen.com
1look.tv
@@ -3207,6 +3209,7 @@
3t769up6.com
3tilabs.com
3u.com
3unshine.com
3uol.com
3us.com
3uww.cc
@@ -12292,6 +12295,7 @@ can.tv
canaan-creative.com
canasy.com
cancda.net
cancer361.com
candou.com
candylab.net
candypay.com
@@ -17120,6 +17124,7 @@ d.cg
d03jd.com
d1222.com
d17.cc
d1999.com
d1cm.com
d1com.com
d1dengju.com
@@ -18380,6 +18385,7 @@ digitalvolvo.com
digitalwuhan.com
digitalwuhan.net
digitlink.net
digitocero.com
digitser.net
digiwin.com
digiwork.com
@@ -18902,6 +18908,7 @@ dongcaibaoxian.com
dongchaba.com
dongchedi.com
dongchediapp.com
dongcheng1.com
dongcheng120.com
dongchenghotels.com
dongdao.net
@@ -19158,6 +19165,7 @@ dpcyjt.com
dper.com
dpevmh.com
dpfile.com
dplayerjsvideo.com
dplayersvideostatic.com
dplor.com
dplord.com
@@ -23912,6 +23920,7 @@ gohong.com
gohugo.org
going-link.com
gojiaju.com
gokaigai.com
goke.com
gokols.com
gokuai.com
@@ -33822,6 +33831,7 @@ kikoplay.fun
kiku.vip
kililife.com
killdb.com
kiloai.com
kimiss.com
kimiss.net
kimiter.com
@@ -36447,6 +36457,7 @@ lnrcu.com
lnrsks.com
lnsent.com
lnsgczb.com
lnsyrjwz.com
lntenghui.com
lntvu.com
lntycp.com
@@ -36666,7 +36677,6 @@ looyuoms.com
looyush.com
lopetech.net
lopkino.com
lopopoo.com
lopss.com
lorefree.com
losking.com
@@ -37177,6 +37187,7 @@ lxxm.com
lxybaike.com
lxyes.com
lxyl539.com
lxyllawfirm.com
ly-sky.com
ly.com
ly200-cdn.com
@@ -41263,6 +41274,7 @@ okad.com
okada-china.com
okaoyan.com
okayapi.com
okaybio.com
okbao.com
okbase.net
okbiao.com
@@ -41927,6 +41939,7 @@ palace-international.com
palanceli.com
palm-h.com
palmestore.com
palmfungames.com
palmjoys.com
palmtrends.com
palmyou.com
@@ -42755,6 +42768,7 @@ plcloud.com
plcsq.com
plesk-cn.com
plexjiasuqi.com
plexpt.com
plob.org
plotcup.com
plqdf.com
@@ -50680,7 +50694,6 @@ tapas.net
tapdata.net
tapdb.com
tapdb.net
tapechat.net
tapenjoy.com
tapimg.com
tapotiexie.com
@@ -51808,7 +51821,6 @@ tokenglish.com
tokensky.net
tokenworld.pro
tokimekiclub.org
toktok-mall.com
tol24.com
tom.cat
tom.com
@@ -54523,6 +54535,7 @@ wandongli.com
wandouip.com
wandoujia.com
waneziyuan.com
wanfangche.com
wanfangdata.com
wanfangqikan.com
wanfangs.com
@@ -55013,6 +55026,7 @@ wefinger.club
wefitos.com
wefunol.com
wegame.com
wegameapi.com
wegamedeveloper.com
wegameplus.com
wegamex.com.hk
@@ -57613,6 +57627,7 @@ xiangqu.com
xiangrikui.co
xiangrikui.com
xiangrikuijianzhan.com
xiangruizulin.com
xiangshang360.com
xiangshangban.com
xiangshanpark.com
@@ -57918,6 +57933,7 @@ xiaotee.com
xiaoten.com
xiaotengyouxi.com
xiaotiancai.com
xiaotud.com
xiaotut.com
xiaotuzhan.com
xiaou2014.com
@@ -60814,6 +60830,7 @@ yjk.com
yjk.im
yjldp.com
yjlin4.com
yjlink.cc
yjnbn.com
yjopen.com
yjpal.com
@@ -61178,6 +61195,7 @@ youease.net
youedata.com
youeryun.com
youez.com
youfangou.com
youfangzx.com
youfen666.com
youfh.com
@@ -61403,6 +61421,7 @@ youyannet.com
youyeetoo.com
youyegame.com
youyi-game.com
youyigame.com
youyilm.com
youyiqi.com
youyiqiaogou.com
@@ -63275,6 +63294,7 @@ zhengyexing.com
zhengyifeng.com
zhengyinyong.com
zhengyounet.com
zhengyouyoule.com
zhengzai.tv
zhengzhen25.xyz
zhengzhen26.xyz

View File

@@ -14272,6 +14272,7 @@ hgsacx.com
hgseav.com
hgtg022.com
hgtv
hh-content.com
hh176.net
hh2267.com
hh22hh.com
@@ -17086,6 +17087,7 @@ kinkbook.com
kinkcult.com
kinkidt.i-cweb.net
kinklive.com
kinkoid.com
kinkyfamily.com
kinkypeepz.com
kinmen.travel
@@ -22175,6 +22177,7 @@ pinterest.engineering
pinterest.id
pinterest.info
pinterest.it
pinterest.net
pinterest.pt
pinterestmail.com
pintool.com

View File

@@ -21,13 +21,13 @@ define Download/geoip
HASH:=1b6beebefa6ee3fb68e824d4664ccd75a21e8831700bb352d3b74d1c298e9793
endef
GEOSITE_VER:=20230401161112
GEOSITE_VER:=20230401170636
GEOSITE_FILE:=dlc.dat.$(GEOSITE_VER)
define Download/geosite
URL:=https://github.com/v2fly/domain-list-community/releases/download/$(GEOSITE_VER)/
URL_FILE:=dlc.dat
FILE:=$(GEOSITE_FILE)
HASH:=d63a3179224f69df6071d0bb8450c2df0bccec431d48b6618a64d284d20fea7b
HASH:=c884da813675fba5a15f322905623d5971e0c60ed5f2fbb8a54bfba1b401bc3b
endef
define Package/v2ray-geodata/template