diff --git a/luci-app-easytier/luasrc/model/cbi/easytier.lua b/luci-app-easytier/luasrc/model/cbi/easytier.lua index 46311f6..d7d3396 100644 --- a/luci-app-easytier/luasrc/model/cbi/easytier.lua +++ b/luci-app-easytier/luasrc/model/cbi/easytier.lua @@ -4,9 +4,9 @@ local nixio = require "nixio" m = Map("easytier") m.description = translate('一个简单、安全、去中心化的内网穿透 VPN 组网方案,使用 Rust 语言和 Tokio 框架实现。 项目地址:github.com/EasyTier/EasyTier  官网文档  QQ群  菜鸟教程') --- easytier m:section(SimpleSection).template = "easytier/easytier_status" +-- easytier-core s=m:section(TypedSection, "easytier", translate("EasyTier配置")) s.addremove=false s.anonymous=true @@ -28,14 +28,14 @@ btncq.write = function() end etcmd = s:taboption("general",ListValue, "etcmd", translate("启动方式"), - translate("默认使用命令行方式启动,也可以使用配置文件启动或WEB网页配置
切换启动方式后将以指定的方式启动,请谨慎选择")) + translate("官方Web控制台:easytier.cn/web
官方配置文件生成器:easytier.cn/web/index.html#/config_generator
注意配置RPC端口为15888")) etcmd.default = "etcmd" etcmd:value("etcmd",translate("命令行")) etcmd:value("config",translate("配置文件")) -etcmd:value("web",translate("WEB配置")) +etcmd:value("web",translate("Web配置")) et_config = s:taboption("general",TextValue, "et_config", translate("配置文件"), - translate("配置文件在/etc/easytier/config.toml
命令行的启动参数和此配置文件的参数并不同步,请自行修改
配置文件介绍:点此查看")) + translate("配置文件在/etc/easytier/config.toml
命令行的启动参数和此配置文件的参数不会同步
注意填写tun网卡名和端口用以自动防火墙放行")) et_config.rows = 18 et_config.wrap = "off" et_config:depends("etcmd", "config") @@ -53,8 +53,8 @@ et_config.write = function(self, section, value) nixio.fs.writefile(file, value:gsub("\r\n", "\n")) end -web_config = s:taboption("general", Value, "web_config", translate("WEB服务器地址"), - translate("WEB配置服务器地址。(-w 参数)
自建WEB服务器 输入格式:udp://服务器地址:22020/账户名
官方WEB服务器 输入格式:账户名
官方WEB服务器配置:点此")) +web_config = s:taboption("general", Value, "web_config", translate("Web服务器地址"), + translate("Web配置服务器地址。(-w 参数)
自建Web服务器 输入格式:udp://服务器地址:22020/账户名
官方Web服务器 输入格式:账户名
官方Web控制台:easytier.cn/web")) web_config.placeholder = "admin" web_config:depends("etcmd", "web") @@ -63,9 +63,10 @@ network_name = s:taboption("general", Value, "network_name", translate("网络 network_name.password = true network_name.placeholder = "test" network_name:depends("etcmd", "etcmd") +network_name:depends("etcmd", "web") network_secret = s:taboption("general", Value, "network_secret", translate("网络密钥"), - translate("用于验证此节点是否属于 VPN 网络的网络密钥(--network-secret 参数)")) + translate("网络密钥,用于验证此节点是否属于 VPN 网络(--network-secret 参数)")) network_secret.password = true network_secret.placeholder = "test" network_secret:depends("etcmd", "etcmd") @@ -83,10 +84,9 @@ ipaddr:depends("etcmd", "etcmd") peeradd = s:taboption("general",DynamicList, "peeradd", translate("对等节点"), translate("初始连接的对等节点,和下方参数作用一样 (-p 参数)
公共服务器可用状态查询:点此查询")) peeradd.placeholder = "tcp://public.easytier.top:11010" -peeradd:value("tcp://public.easytier.top:11010", translate("官方公共服务器-广东河源-tcp://public.easytier.top:11010")) -peeradd:value("tcp://43.136.45.249:11010", translate("广州V4-tcp://43.136.45.249:11010")) +peeradd:value("tcp://public.easytier.top:11010", translate("官方服务器-广东河源-tcp://public.easytier.top:11010")) +peeradd:value("tcp://turn.hb.629957.xyz:11010", translate("湖北十堰电信V4-tcp://turn.hb.629957.xyz:11010")) peeradd:value("tcp://et.ie12vps.xyz:11010", translate("南京V4/V6-tcp://et.ie12vps.xyz:11010")) -peeradd:value("tcp://minebg.top:11010", translate("广州V4-tcp://minebg.top:11010")) peeradd:value("tcp://ah.nkbpal.cn:11010", translate("安徽电信V4-tcp://ah.nkbpal.cn:11010")) peeradd:value("udp://ah.nkbpal.cn:11010", translate("安徽电信V4-udp://ah.nkbpal.cn:11010")) peeradd:value("wss://ah.nkbpal.cn:11012", translate("安徽电信V4-wss://ah.nkbpal.cn:11012")) @@ -109,7 +109,7 @@ external_node = s:taboption("general", Value, "external_node", translate("共享 translate("使用公共共享节点来发现对等节点,和上方参数作用一样 (-e 参数)")) external_node.default = "" external_node.placeholder = "tcp://public.easytier.top:11010" -external_node:value("tcp://public.easytier.top:11010", translate("官方公共服务器-广东河源-tcp://public.easytier.top:11010")) +external_node:value("tcp://public.easytier.top:11010", translate("官方服务器-广东河源-tcp://public.easytier.top:11010")) external_node:depends("etcmd", "etcmd") proxy_network = s:taboption("general",DynamicList, "proxy_network", translate("子网代理"), @@ -121,8 +121,9 @@ mapped_listeners = s:taboption("privacy",DynamicList, "mapped_listeners", transl mapped_listeners:depends("listenermode", "ON") rpc_portal = s:taboption("privacy", Value, "rpc_portal", translate("门户地址端口"), - translate("用于管理的 RPC 门户地址。0 表示随机端口,12345 表示监听本地主机的 12345 端口,0.0.0.0:12345 表示在所有接口上监听 12345 端口。默认值为 0,首选 15888 (-r 参数)")) + translate("用于管理的 RPC 门户地址。0 表示随机端口,12345 表示监听本地主机的 12345 端口,0.0.0.0:12345 表示在所有接口上监听 12345 端口。
默认值为 0,建议选 15888 防止无法获取状态信息 (-r 参数)")) rpc_portal.placeholder = "15888" +rpc_portal.default = "15888" rpc_portal.datatype = "range(1,65535)" rpc_portal:depends("etcmd", "etcmd") @@ -134,33 +135,33 @@ listenermode.default = "OFF" listenermode:depends("etcmd", "etcmd") listener6 = s:taboption("general",Flag, "listener6", translate("同时监听IPV6"), - translate("默认只监听IPV4,对等节点只能使用IPV4连接,启用后将同时监听IPV6,例如 -l tcp://[::]:11010")) + translate("默认只监听IPV4,对等节点只能使用IPV4连接,启用后将同时监听IPV6端口")) listener6:depends("listenermode", "ON") listener6:depends("etcmd", "etcmd") tcp_port = s:taboption("general",Value, "tcp_port", translate("tcp/udp端口"), - translate("tcp/udp协议,端口号:11010,表示 tcp/udp 将在 11010 上监听
如果是WEB配置请填写和WEB配置一样的监听端口用于防火墙放行")) + translate("tcp/udp协议,端口号:11010,表示 tcp/udp 将在 11010 上监听
如果是配置文件Web配置请填写一样的监听端口用于防火墙放行")) tcp_port.datatype = "range(1,65535)" tcp_port.default = "11010" tcp_port:depends("listenermode", "ON") tcp_port:depends("etcmd", "web") ws_port = s:taboption("general",Value, "ws_port", translate("ws端口"), - translate("ws协议,端口号:11011,表示 ws 将在 11011 上监听
如果是WEB配置请填写和WEB配置一样的监听端口用于防火墙放行")) + translate("ws协议,端口号:11011,表示 ws 将在 11011 上监听
如果是配置文件Web配置请填写一样的监听端口用于防火墙放行")) ws_port.datatype = "range(1,65535)" ws_port.default = "11011" ws_port:depends("listenermode", "ON") ws_port:depends("etcmd", "web") wss_port = s:taboption("general",Value, "wss_port", translate("wss端口"), - translate("wss协议,端口号:11012,表示 wss 将在 11012 上监听
如果是WEB配置请填写和WEB配置一样的监听端口用于防火墙放行")) + translate("wss协议,端口号:11012,表示 wss 将在 11012 上监听
如果是配置文件Web配置请填写一样的监听端口用于防火墙放行")) wss_port.datatype = "range(1,65535)" wss_port.default = "11012" wss_port:depends("listenermode", "ON") wss_port:depends("etcmd", "web") wg_port = s:taboption("general",Value, "wg_port", translate("wg端口"), - translate("wireguard协议,端口号:11011,表示 wg 将在 11011 上监听
如果是WEB配置请填写和WEB配置一样的监听端口用于防火墙放行")) + translate("wireguard协议,端口号:11011,表示 wg 将在 11011 上监听
如果是配置文件Web配置请填写一样的监听端口用于防火墙放行")) wg_port.datatype = "range(1,65535)" wg_port.placeholder = "11011" wg_port:depends("listenermode", "ON") @@ -179,9 +180,10 @@ desvice_name.default = device_name desvice_name:depends("etcmd", "etcmd") instance_name = s:taboption("privacy",Value, "instance_name", translate("实例名称"), - translate("用于在同一台机器中标识此 VPN 节点的实例名称 (--instance-name 参数)")) + translate("用于在同一台机器中标识此 VPN 节点的实例名称,启用日志需要填写,web配置时填一样的instance_name名称 (-m 参数)")) instance_name.placeholder = "default" instance_name:depends("etcmd", "etcmd") +instance_name:depends("etcmd", "web") vpn_portal = s:taboption("privacy",Value, "vpn_portal", translate("VPN门户URL"), translate("定义 VPN 门户的 URL,允许其他 VPN 客户端连接。
示例:wg://0.0.0.0:11011/10.14.14.0/24,表示 VPN 门户是一个在 vpn.example.com:11010 上监听的 WireGuard 服务器,并且 VPN 客户端位于 10.14.14.0/24 网络中(--vpn-portal 参数)")) @@ -242,14 +244,16 @@ exit_nodes:depends("etcmd", "etcmd") smoltcp = s:taboption("privacy",Flag, "smoltcp", translate("使用用户态协议栈"), translate("为子网代理启用smoltcp堆栈(--use-smoltcp 参数)")) -smoltcp.rmempty = false smoltcp:depends("etcmd", "etcmd") no_tun = s:taboption("privacy",Flag, "no_tun", translate("无tun模式"), translate("不创建TUN设备,可以使用子网代理访问节点( --no-tun 参数)")) -no_tun.rmempty = false no_tun:depends("etcmd", "etcmd") +proxy_forward = s:taboption("privacy",Flag, "proxy_forward", translate("禁用内置NAT"), + translate("通过系统内核转发子网代理数据包,禁用内置NAT( --proxy-forward-by-system 参数)")) +proxy_forward:depends("etcmd", "etcmd") + manual_routes = s:taboption("privacy",DynamicList, "manual_routes", translate("路由CIDR"), translate("手动分配路由CIDR,将禁用子网代理和从对等节点传播的wireguard路由。(--manual-routes 参数)")) manual_routes.placeholder = "192.168.0.0/16" @@ -257,7 +261,6 @@ manual_routes:depends("etcmd", "etcmd") relay_network = s:taboption("privacy",Flag, "relay_network", translate("转发白名单网络的流量"), translate("仅转发白名单网络的流量,默认允许所有网络")) -relay_network.rmempty = false relay_network:depends("etcmd", "etcmd") whitelist = s:taboption("privacy",DynamicList, "whitelist", translate("白名单网络"), @@ -272,45 +275,37 @@ socks_port:depends("etcmd", "etcmd") disable_p2p = s:taboption("privacy",Flag, "disable_p2p", translate("禁用P2P"), translate("禁用P2P通信,只通过-p指定的节点转发数据包 ( --disable-p2p 参数)")) -disable_p2p.rmempty = false disable_p2p:depends("etcmd", "etcmd") disable_udp = s:taboption("privacy",Flag, "disable_udp", translate("禁用UDP"), translate("禁用UDP打洞功能( --disable-udp-hole-punching 参数)")) -disable_udp.rmempty = false disable_udp:depends("etcmd", "etcmd") relay_all = s:taboption("privacy",Flag, "relay_all", translate("允许转发"), translate("转发所有对等节点的RPC数据包,即使对等节点不在转发网络白名单中。
这可以帮助白名单外网络中的对等节点建立P2P连接。( -relay-all-peer-rpc 参数)")) -relay_all.rmempty = false relay_all:depends("etcmd", "etcmd") bind_device = s:taboption("privacy",Flag, "bind_device", translate("仅使用物理网卡"), translate("将连接器的套接字绑定到物理设备以避免路由问题。
比如子网代理网段与某节点的网段冲突,绑定物理设备后可以与该节点正常通信。( --bind-device 参数)")) -bind_device.rmempty = false -bind_device.default = "1" +bind_device.default = "0" bind_device:depends("etcmd", "etcmd") kcp_proxy = s:taboption("privacy",Flag, "kcp_proxy", translate("启用KCP代理"), translate("将TCP流量转为 KCP 流量,降低传输延迟,提升传输速度。
KCP 代理功能需要虚拟网内所有节点的 EasyTier 版本在 v2.2.0 以上。( --enable-kcp-proxy 参数)")) -kcp_proxy.rmempty = false kcp_proxy:depends("etcmd", "etcmd") kcp_input = s:taboption("privacy",Flag, "kcp_input", translate("禁用KCP输入"), translate("不允许其他节点使用 KCP 代理 TCP 流到此节点。
开启 KCP 代理的节点访问此节点时,依然使用原始。( --disable-kcp-input 参数)")) -kcp_input.rmempty = false kcp_input:depends("etcmd", "etcmd") log = s:taboption("general",ListValue, "log", translate("程序日志"), translate("运行日志在/tmp/easytier.log,可在上方日志查看
若启动失败,请前往 状态- 系统日志 查看具体启动失败日志
详细程度:警告<信息<调试<跟踪")) -log.default = "info" +log.default = "off" log:value("off",translate("关闭")) log:value("warn",translate("警告")) log:value("info",translate("信息")) log:value("debug",translate("调试")) log:value("trace",translate("跟踪")) -log:depends("etcmd", "etcmd") -log:depends("etcmd", "config") et_forward = s:taboption("privacy",MultiValue, "et_forward", translate("访问控制"), translate("设置不同网络区域之间的流量允许规则")) @@ -513,7 +508,7 @@ end btnrm = s:taboption("infos", Button, "btnrm") btnrm.inputtitle = translate("检测更新") -btnrm.description = translate("点击按钮开始检测更新,刷新上方状态栏显示") +btnrm.description = translate("点击按钮开始检测更新,刷新上方状态栏版本显示") btnrm.inputstyle = "apply" btnrm.write = function() os.execute("rm -rf /tmp/easytier*.tag /tmp/easytier*.newtag /tmp/easytier-core_*") @@ -523,6 +518,12 @@ end easytierbin = s:taboption("upload", Value, "easytierbin", translate("easytier-core程序路径"), translate("自定义easytier-core的存放路径,确保填写完整的路径及名称,若指定的路径可用空间不足将会自动移至/tmp/easytier-core")) easytierbin.placeholder = "/usr/bin/easytier-core" +easytierbin.default = "/usr/bin/easytier-core" + +webbin = s:taboption("upload", Value, "webbin", translate("easytier-web程序路径"), + translate("自定义easytier-web的存放路径,确保填写完整的路径及名称,然后上传安装程序")) +webbin.placeholder = "/usr/bin/easytier-web" +webbin.default = "/usr/bin/easytier-web" local upload = s:taboption("upload", FileUpload, "upload_file") upload.optional = true @@ -561,12 +562,16 @@ http.setfilehandler( local extracted_dir = "/tmp/easytier-linux-*/" os.execute("mv " .. extracted_dir .. "easytier-cli /tmp/easytier-cli") os.execute("mv " .. extracted_dir .. "easytier-core /tmp/easytier-core") + os.execute("mv " .. extracted_dir .. "easytier-core /tmp/easytier-web") if nixio.fs.access("/tmp/easytier-cli") then um.value = um.value .. "\n" .. translate("-程序/tmp/easytier-cli上传成功,重启一次插件才生效") end if nixio.fs.access("/tmp/easytier-core") then um.value = um.value .. "\n" .. translate("-程序/tmp/easytier-core上传成功,重启一次插件才生效") end + if nixio.fs.access("/tmp/easytier-web") then + um.value = um.value .. "\n" .. translate("-程序/tmp/easytier-web上传成功,重启一次插件才生效") + end end if string.sub(meta.file, -7) == ".tar.gz" then local file_path = dir .. meta.file @@ -574,15 +579,20 @@ http.setfilehandler( local extracted_dir = "/tmp/easytier-linux-*/" os.execute("mv " .. extracted_dir .. "easytier-cli /tmp/easytier-cli") os.execute("mv " .. extracted_dir .. "easytier-core /tmp/easytier-core") + os.execute("mv " .. extracted_dir .. "easytier-core /tmp/easytier-web") if nixio.fs.access("/tmp/easytier-cli") then um.value = um.value .. "\n" .. translate("-程序/tmp/easytier-cli上传成功,重启一次插件才生效") end if nixio.fs.access("/tmp/easytier-core") then um.value = um.value .. "\n" .. translate("-程序/tmp/easytier-core上传成功,重启一次插件才生效") end + if nixio.fs.access("/tmp/easytier-web") then + um.value = um.value .. "\n" .. translate("-程序/tmp/easytier-web上传成功,重启一次插件才生效") + end end os.execute("chmod +x /tmp/easytier-core") - os.execute("chmod +x /tmp/easytier-cli") + os.execute("chmod +x /tmp/easytier-cli") + os.execute("chmod +x /tmp/easytier-web") end end ) @@ -590,4 +600,57 @@ if luci.http.formvalue("upload") then local f = luci.http.formvalue("ulfile") end +-- easytier-web +s=m:section(TypedSection, "easytierweb", translate("自建Web服务器")) +s.addremove=false +s.anonymous=true + +switch = s:option(Flag, "enabled", translate("Enable")) +switch.rmempty = false + +btncq = s:option(Button, "btncq", translate("重启")) +btncq.inputtitle = translate("重启") +btncq.description = translate("在没有修改参数的情况下快速重新启动一次") +btncq.inputstyle = "apply" +btncq:depends("enabled", "1") +btncq.write = function() + luci.sys.call("/etc/init.d/easytier restart >/dev/null 2>&1 &") -- 执行重启命令 +end + +db_path = s:option(Value, "db_path", translate("数据库文件路径"), + translate(" sqlite3 数据库文件路径, 用于保存所有数据。( -d 参数)")) +db_path.default = "/etc/easytier/et.db" +db_path:depends("enabled", "1") + +web_protocol = s:option(ListValue, "web_protocol", translate("监听协议"), + translate("配置服务器的监听协议,用于被 easytier-core 连接。( -p 参数)")) +web_protocol.default = "udp" +web_protocol:value("udp",translate("UDP")) +web_protocol:value("tcp",translate("TCP")) +web_protocol:depends("enabled", "1") + +web_port = s:option(Value, "web_port", translate("服务端口"), + translate("配置服务器的监听端口,用于被 easytier-core 连接。( -c 参数)")) +web_port.datatype = "range(1,65535)" +web_port.placeholder = "22020" +web_port.default = "22020" +web_port:depends("enabled", "1") + +api_port = s:option(Value, "api_port", translate("API端口"), + translate("restful 服务器的监听端口,作为 ApiHost 并被 web 前端使用。( -a 参数)")) +api_port.datatype = "range(1,65535)" +api_port.placeholder = "11211" +api_port.default = "11211" +api_port:depends("enabled", "1") + +weblog = s:option(ListValue, "weblog", translate("程序日志"), + translate("运行日志在/tmp/easytierweb.log,可在上方日志查看
若启动失败,请前往 状态- 系统日志 查看具体启动失败日志
详细程度:警告<信息<调试<跟踪")) +weblog.default = "off" +weblog:value("off",translate("关闭")) +weblog:value("warn",translate("警告")) +weblog:value("info",translate("信息")) +weblog:value("debug",translate("调试")) +weblog:value("trace",translate("跟踪")) +weblog:depends("enabled", "1") + return m