luci: shunt mode add iface support

This commit is contained in:
xiaorouji 2023-08-10 18:06:45 +08:00 committed by sbwml
parent c7afc342a8
commit c2010b482d
9 changed files with 58 additions and 21 deletions

View File

@ -6,7 +6,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall
PKG_VERSION:=4.67-1
PKG_VERSION:=4.67-2
PKG_RELEASE:=
PKG_CONFIG_DEPENDS:= \

View File

@ -131,6 +131,7 @@ if (has_v2ray or has_xray) and #nodes_table > 0 then
local normal_list = {}
local balancing_list = {}
local shunt_list = {}
local iface_list = {}
for k, v in pairs(nodes_table) do
if v.node_type == "normal" then
normal_list[#normal_list + 1] = v
@ -141,6 +142,9 @@ if (has_v2ray or has_xray) and #nodes_table > 0 then
if v.protocol and v.protocol == "_shunt" then
shunt_list[#shunt_list + 1] = v
end
if v.protocol and v.protocol == "_iface" then
iface_list[#iface_list + 1] = v
end
end
local function get_cfgvalue(shunt_node_id, option)
@ -216,6 +220,9 @@ if (has_v2ray or has_xray) and #nodes_table > 0 then
for k1, v1 in pairs(balancing_list) do
o:value(v1.id, v1.remark)
end
for k1, v1 in pairs(iface_list) do
o:value(v1.id, v1.remark)
end
for k1, v1 in pairs(normal_list) do
o:value(v1.id, v1.remark)
pt:depends({ [node_option] = v1.id, [vid .. "-preproxy_enabled"] = "1" })
@ -233,6 +240,9 @@ if (has_v2ray or has_xray) and #nodes_table > 0 then
for k1, v1 in pairs(balancing_list) do
o:value(v1.id, v1.remark)
end
for k1, v1 in pairs(iface_list) do
o:value(v1.id, v1.remark)
end
for k1, v1 in pairs(normal_list) do
o:value(v1.id, v1.remark)
end

View File

@ -137,6 +137,7 @@ iface:depends("protocol", "_iface")
local nodes_table = {}
local balancers_table = {}
local iface_table = {}
for k, e in ipairs(api.get_valid_nodes()) do
if e.node_type == "normal" then
nodes_table[#nodes_table + 1] = {
@ -150,6 +151,12 @@ for k, e in ipairs(api.get_valid_nodes()) do
remarks = e["remark"]
}
end
if e.protocol == "_iface" then
iface_table[#iface_table + 1] = {
id = e[".name"],
remarks = e["remark"]
}
end
end
-- 负载均衡列表
@ -184,6 +191,9 @@ if #nodes_table > 0 then
for k, v in pairs(balancers_table) do
o:value(v.id, v.remarks)
end
for k, v in pairs(iface_table) do
o:value(v.id, v.remarks)
end
for k, v in pairs(nodes_table) do
o:value(v.id, v.remarks)
end
@ -202,6 +212,9 @@ uci:foreach(appname, "shunt_rules", function(e)
for k, v in pairs(balancers_table) do
o:value(v.id, v.remarks)
end
for k, v in pairs(iface_table) do
o:value(v.id, v.remarks)
end
local pt = s:option(ListValue, e[".name"] .. "_proxy_tag", string.format('* <a style="color:red">%s</a>', e.remarks .. " " .. translate("Preproxy")))
pt:value("nil", translate("Close"))
pt:value("main", translate("Preproxy Node"))
@ -230,6 +243,9 @@ if #nodes_table > 0 then
for k, v in pairs(balancers_table) do
default_node:value(v.id, v.remarks)
end
for k, v in pairs(iface_table) do
default_node:value(v.id, v.remarks)
end
local dpt = s:option(ListValue, "default_proxy_tag", string.format('* <a style="color:red">%s</a>', translate("Default Preproxy")), translate("When using, localhost will connect this node first and then use this node to connect the default node."))
dpt:value("nil", translate("Close"))
dpt:value("main", translate("Preproxy Node"))

View File

@ -290,7 +290,7 @@ function get_valid_nodes()
e.id = e[".name"]
if e.type and e.remarks then
if e.protocol and (e.protocol == "_balancing" or e.protocol == "_shunt" or e.protocol == "_iface") then
e["remark"] = "%s[%s] " % {i18n.translatef(e.type .. e.protocol), e.remarks}
e["remark"] = "%s[%s] " % {e.type .. " " .. i18n.translatef(e.protocol), e.remarks}
e["node_type"] = "special"
nodes[#nodes + 1] = e
end
@ -327,7 +327,7 @@ function get_node_remarks(n)
local remarks = ""
if n then
if n.protocol and (n.protocol == "_balancing" or n.protocol == "_shunt" or n.protocol == "_iface") then
remarks = "%s[%s] " % {i18n.translatef(n.type .. n.protocol), n.remarks}
remarks = "%s[%s] " % {n.type .. " " .. i18n.translatef(n.protocol), n.remarks}
else
local type2 = n.type
if (n.type == "V2ray" or n.type == "Xray") and n.protocol then

View File

@ -385,6 +385,7 @@ function gen_config_server(node)
}
}
}
sys.call("mkdir -p /tmp/etc/passwall/iface && touch /tmp/etc/passwall/iface/" .. node.outbound_node_iface)
else
local outbound_node_t = uci:get_all("passwall", node.outbound_node)
if node.outbound_node == "_socks" or node.outbound_node == "_http" then
@ -819,6 +820,21 @@ function gen_config(var)
rule_balancerTag = balancer.tag
end
end
elseif _node.protocol == "_iface" then
if _node.iface then
local _outbound = {
protocol = "freedom",
tag = rule_name,
streamSettings = {
sockopt = {
interface = _node.iface
}
}
}
table.insert(outbounds, _outbound)
rule_outboundTag = rule_name
sys.call("touch /tmp/etc/passwall/iface/" .. _node.iface)
end
end
end
return rule_outboundTag, rule_balancerTag
@ -916,6 +932,7 @@ function gen_config(var)
}
}
}
sys.call("touch /tmp/etc/passwall/iface/" .. node.iface)
end
else
outbound = gen_outbound(flag, node)

View File

@ -340,14 +340,17 @@ msgstr "添加方式"
msgid "Type"
msgstr "类型"
msgid "Balancing"
msgid "_balancing"
msgstr "负载均衡"
msgid "Xray_balancing"
msgstr "Xray 负载均衡"
msgid "_shunt"
msgstr "分流"
msgid "V2ray_balancing"
msgstr "V2ray 负载均衡"
msgid "_iface"
msgstr "接口"
msgid "Balancing"
msgstr "负载均衡"
msgid "Balancing Strategy"
msgstr "负载均衡策略"
@ -373,12 +376,6 @@ msgstr "发起探测的间隔。每经过这个时间,就会对一个服务器
msgid "Shunt"
msgstr "分流"
msgid "Xray_shunt"
msgstr "Xray 分流"
msgid "V2ray_shunt"
msgstr "V2ray 分流"
msgid "Preproxy"
msgstr "前置代理"

View File

@ -13,6 +13,7 @@ TMP_ID_PATH=$TMP_PATH/id
TMP_PORT_PATH=$TMP_PATH/port
TMP_ROUTE_PATH=$TMP_PATH/route
TMP_ACL_PATH=$TMP_PATH/acl
TMP_IFACE_PATH=$TMP_PATH/iface
TMP_PATH2=/tmp/etc/${CONFIG}_tmp
DNSMASQ_PATH=/etc/dnsmasq.d
TMP_DNSMASQ_PATH=/tmp/dnsmasq.d/passwall
@ -396,10 +397,6 @@ run_v2ray() {
_extra_param="${_extra_param} -loglevel $loglevel"
lua $UTIL_XRAY gen_config ${_extra_param} > $config_file
ln_run "$(first_type $(config_t_get global_app ${type}_file) ${type})" ${type} $log_file run -c "$config_file"
local protocol=$(config_n_get $node protocol)
[ "$protocol" == "_iface" ] && {
IFACES="$IFACES $(config_n_get $node iface)"
}
}
run_dns2socks() {
@ -1682,7 +1679,7 @@ DNS_QUERY_STRATEGY="UseIPv4"
export V2RAY_LOCATION_ASSET=$(config_t_get global_rules v2ray_location_asset "/usr/share/v2ray/")
export XRAY_LOCATION_ASSET=$V2RAY_LOCATION_ASSET
mkdir -p /tmp/etc $TMP_PATH $TMP_BIN_PATH $TMP_SCRIPT_FUNC_PATH $TMP_ID_PATH $TMP_PORT_PATH $TMP_ROUTE_PATH $TMP_ACL_PATH $TMP_PATH2
mkdir -p /tmp/etc $TMP_PATH $TMP_BIN_PATH $TMP_SCRIPT_FUNC_PATH $TMP_ID_PATH $TMP_PORT_PATH $TMP_ROUTE_PATH $TMP_ACL_PATH $TMP_IFACE_PATH $TMP_PATH2
arg1=$1
shift

View File

@ -1061,7 +1061,7 @@ add_firewall_rule() {
# 加载ACLS
load_acl
for iface in $IFACES; do
for iface in $(ls ${TMP_IFACE_PATH}); do
$ipt_n -I PSW_OUTPUT -o $iface -j RETURN
$ipt_m -I PSW_OUTPUT -o $iface -j RETURN
done

View File

@ -1082,7 +1082,7 @@ add_firewall_rule() {
# 加载ACLS
load_acl
for iface in $IFACES; do
for iface in $(ls ${TMP_IFACE_PATH}); do
nft "insert rule inet fw4 $nft_output_chain oif $iface counter return"
nft "insert rule inet fw4 PSW_OUTPUT_MANGLE_V6 oif $iface counter return"
done