Browse Source

feat(acl): switch to use mac addr for acl settings

Signed-off-by: Tianling Shen <[email protected]>
Tianling Shen 2 years ago
parent
commit
89d66a7673

+ 7 - 8
htdocs/luci-static/resources/view/unblockneteasemusic/config.js

@@ -80,6 +80,7 @@ return view.extend({
 
 	render: function(data) {
 		var m, s, o;
+		var hosts = data[1]?.hosts;
 
 		m = new form.Map('unblockneteasemusic', _('解除网易云音乐播放限制'),
 			_('原理:采用 [Bilibili/JOOX/酷狗/酷我/咪咕/pyncmd/QQ/Youtube] 等音源,替换网易云音乐 无版权/收费 歌曲链接<br/>' +
@@ -308,14 +309,12 @@ return view.extend({
 		o.default = o.enabled;
 		o.rmempty = false;
 
-		o = s.option(form.Value, 'ip_addr', _('IP 地址'));
-		o.datatype = 'ip4addr';
-		for (var i of Object.entries(data[1].hosts))
-			for (var v in i[1].ipaddrs)
-				if (i[1].ipaddrs[v]) {
-					var ip_addr = i[1].ipaddrs[v], ip_host = i[1].name;
-					o.value(ip_addr, ip_host ? String.format('%s (%s)', ip_host, ip_addr) : ip_addr)
-				}
+		o = s.option(form.Value, 'mac_addr', _('MAC 地址'));
+		o.datatype = 'macaddr';
+		Object.keys(hosts).forEach(function(mac) {
+			var hint = hosts[mac].name || L.toArray(hosts[mac].ipaddrs || hosts[mac].ipv4)[0];
+			o.value(mac, hint ? '%s (%s)'.format(mac, hint) : mac);
+		});
 		o.rmempty = false;
 
 		o = s.option(form.ListValue, 'filter_mode', _('规则'));

+ 13 - 13
root/etc/init.d/unblockneteasemusic

@@ -51,33 +51,33 @@ append_filter_client() {
 
 	is_enabled "$cfg" "enable" || return 1
 
-	local ip_addr filter_mode
-	config_get ip_addr "$cfg" "ip_addr"
+	local mac_addr filter_mode
+	config_get mac_addr "$cfg" "mac_addr"
 	config_get filter_mode "$cfg" "filter_mode"
-	[ -n "$ip_addr" -a -n "$filter_mode" ] || return 1
+	[ -n "$mac_addr" -a -n "$filter_mode" ] || return 1
 
 	case "${filter_mode}" in
 	"disable_http")
 		if [ -n "$FW4" ]; then
-			acl_http_addr="${acl_http_addr:+$acl_http_addr\n}${ip_addr}"
+			acl_http_addr="${acl_http_addr:+$acl_http_addr\n}${mac_addr}"
 		else
-			ipset -! add "acl_neteasemusic_http" "${ip_addr}"
+			ipset -! add "acl_neteasemusic_http" "${mac_addr}"
 		fi
 		;;
 	"disable_https")
 		if [ -n "$FW4" ]; then
-			acl_https_addr="${acl_https_addr:+$acl_https_addr\n}${ip_addr}"
+			acl_https_addr="${acl_https_addr:+$acl_https_addr\n}${mac_addr}"
 		else
-			ipset -! add "acl_neteasemusic_https" "${ip_addr}"
+			ipset -! add "acl_neteasemusic_https" "${mac_addr}"
 		fi
 		;;
 	"disable_all")
 		if [ -n "$FW4" ]; then
-			acl_http_addr="${acl_http_addr:+$acl_http_addr\n}${ip_addr}"
-			acl_https_addr="${acl_https_addr:+$acl_https_addr\n}${ip_addr}"
+			acl_http_addr="${acl_http_addr:+$acl_http_addr\n}${mac_addr}"
+			acl_https_addr="${acl_https_addr:+$acl_https_addr\n}${mac_addr}"
 		else
-			ipset -! add "acl_neteasemusic_http" "${ip_addr}"
-			ipset -! add "acl_neteasemusic_https" "${ip_addr}"
+			ipset -! add "acl_neteasemusic_http" "${mac_addr}"
+			ipset -! add "acl_neteasemusic_https" "${mac_addr}"
 		fi
 		;;
 	esac
@@ -186,8 +186,8 @@ start_service() {
 		/etc/init.d/dnsmasq restart 2>"/dev/null"
 
 		if [ -z "$FW4" ]; then
-			ipset create "acl_neteasemusic_http" hash:ip
-			ipset create "acl_neteasemusic_https" hash:ip
+			ipset create "acl_neteasemusic_http" hash:mac
+			ipset create "acl_neteasemusic_https" hash:mac
 			ipset create "neteasemusic" hash:ip
 		fi
 		config_foreach append_filter_client "acl_rule"

+ 4 - 4
root/usr/share/unblockneteasemusic/nftables.ut

@@ -1,7 +1,7 @@
 #!/usr/bin/utpl -S
 
 set acl_neteasemusic_http {
-	type ipv4_addr;
+	type ether_addr;
 	flags interval;
 	auto-merge;
 
@@ -11,7 +11,7 @@ set acl_neteasemusic_http {
 }
 
 set acl_neteasemusic_https {
-	type ipv4_addr;
+	type ether_addr;
 	flags interval;
 	auto-merge;
 
@@ -55,8 +55,8 @@ chain netease_cloud_music_redir {
 		2001::/32, 2001:10::/28, 2001:20::/28, 2001:db8::/28, 2002::/16,
 		fc00::/7, fe80::/10, ff00::/8 } counter return;
 
-	ip saddr @acl_neteasemusic_http tcp dport 80 counter return;
-	ip saddr @acl_neteasemusic_https tcp dport 443 counter return;
+	ether saddr @acl_neteasemusic_http tcp dport 80 counter return;
+	ether saddr @acl_neteasemusic_https tcp dport 443 counter return;
 
 	tcp dport 80 counter redirect to :{{ http_port }};
 	tcp dport 443 counter redirect to :{{ https_port }};