update-09.14

This commit is contained in:
github-actions[bot] 2021-09-14 01:42:36 +08:00
parent a874109643
commit efcaf60fbf
14 changed files with 757 additions and 0 deletions

25
luci-app-udp2raw/Makefile Normal file
View File

@ -0,0 +1,25 @@
#
# Copyright (C) 2016-2017 Jian Chang <aa65535@live.com>
#
# This is free software, licensed under the GNU General Public License v3.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI Support for udp2raw-tunnel
LUCI_DESCRIPTION:=LuCI Support for udp2raw-tunnel.
LUCI_DEPENDS:=+udp2raw-tunnel
LUCI_PKGARCH:=all
PKG_NAME:=luci-app-udp2raw
PKG_VERSION:=1.0.0
PKG_RELEASE:=6
PKG_LICENSE:=GPLv3
PKG_LICENSE_FILES:=LICENSE
PKG_MAINTAINER:=Jian Chang <aa65535@live.com>
include ../../luci.mk
# call BuildPackage - OpenWrt buildroot signature

View File

@ -0,0 +1,32 @@
module("luci.controller.udp2raw", package.seeall)
function index()
if not nixio.fs.access("/etc/config/udp2raw") then
return
end
local page = entry({"admin", "services", "udp2raw"},
firstchild(), _("udp2raw-tunnel"))
page.dependent = false
page.acl_depends = { "luci-app-udp2raw" }
entry({"admin", "services", "udp2raw", "general"},
cbi("udp2raw/general"), _("Settings"), 1)
entry({"admin", "services", "udp2raw", "servers"},
arcombine(cbi("udp2raw/servers"), cbi("udp2raw/servers-details")),
_("Servers Manage"), 2).leaf = true
entry({"admin", "services", "udp2raw", "status"}, call("action_status"))
end
local function is_running(name)
return luci.sys.call("pidof %s >/dev/null" %{name}) == 0
end
function action_status()
luci.http.prepare_content("application/json")
luci.http.write_json({
running = is_running("udp2raw")
})
end

View File

@ -0,0 +1,39 @@
local m, s, o
local uci = luci.model.uci.cursor()
local servers = {}
local function has_bin(name)
return luci.sys.call("command -v %s >/dev/null" %{name}) == 0
end
if not has_bin("udp2raw") then
return Map("udp2raw", "%s - %s" %{translate("udp2raw-tunnel"),
translate("Settings")}, '<b style="color:red">udp2raw-tunnel binary file not found. install udp2raw-tunnel package, or copy binary to /usr/bin/udp2raw manually. </b>')
end
uci:foreach("udp2raw", "servers", function(s)
if s.server_addr and s.server_port then
servers[#servers+1] = {name = s[".name"], alias = s.alias or "%s:%s" %{s.server_addr, s.server_port}}
end
end)
m = Map("udp2raw", "%s - %s" %{translate("udp2raw-tunnel"), translate("Settings")})
m:append(Template("udp2raw/status"))
s = m:section(NamedSection, "general", "general", translate("General Settings"))
s.anonymous = true
s.addremove = false
o = s:option(DynamicList, "server", translate("Server"))
o.template = "udp2raw/dynamiclist"
o:value("nil", translate("Disable"))
for _, s in ipairs(servers) do o:value(s.name, s.alias) end
o.default = "nil"
o.rmempty = false
o = s:option(ListValue, "daemon_user", translate("Run Daemon as User"))
for u in luci.util.execi("cat /etc/passwd | cut -d ':' -f1") do o:value(u) end
o.default = "root"
o.rmempty = false
return m

View File

@ -0,0 +1,92 @@
local m, s, o
local sid = arg[1]
local raw_modes = {
"faketcp",
"udp",
"icmp",
}
local cipher_modes = {
"aes128cbc",
"xor",
"none",
}
local auth_modes = {
"md5",
"crc32",
"simple",
"none",
}
m = Map("udp2raw", "%s - %s" %{translate("udp2raw-tunnel"), translate("Edit Server")})
m.redirect = luci.dispatcher.build_url("admin/services/udp2raw/servers")
m.sid = sid
if m.uci:get("udp2raw", sid) ~= "servers" then
luci.http.redirect(m.redirect)
return
end
s = m:section(NamedSection, sid, "servers")
s.anonymous = true
s.addremove = false
o = s:option(Value, "alias", translate("Alias(optional)"))
o = s:option(Value, "server_addr", translate("Server"))
o.datatype = "host"
o.rmempty = false
o = s:option(Value, "server_port", translate("Server Port"))
o.datatype = "port"
o.placeholder = "8080"
o = s:option(Value, "listen_addr", translate("Local Listen Host"))
o.datatype = "ipaddr"
o.placeholder = "127.0.0.1"
o = s:option(Value, "listen_port", translate("Local Listen Port"))
o.datatype = "port"
o.placeholder = "2080"
o = s:option(ListValue, "raw_mode", translate("Raw Mode"))
for _, v in ipairs(raw_modes) do o:value(v, v:lower()) end
o.default = "faketcp"
o.rmempty = false
o = s:option(Value, "key", translate("Password"))
o.password = true
o = s:option(ListValue, "cipher_mode", translate("Cipher Mode"))
for _, v in ipairs(cipher_modes) do o:value(v, v:lower()) end
o.default = "aes128cbc"
o = s:option(ListValue, "auth_mode", translate("Auth Mode"))
for _, v in ipairs(auth_modes) do o:value(v, v:lower()) end
o.default = "md5"
o = s:option(Flag, "auto_rule", translate("Auto Rule"), translate("Auto add (and delete) iptables rule."))
o.default = "1"
o = s:option(Flag, "keep_rule", translate("Keep Rule"), translate("Monitor iptables and auto re-add if necessary."))
o:depends("auto_rule", "1")
o = s:option(Value, "seq_mode", translate("seq Mode"), translate("seq increase mode for faketcp."))
o.datatype = "range(0,4)"
o.placeholder = "3"
o = s:option(Value, "lower_level", translate("Lower Level"), translate("Send packets at OSI level 2, format: \"eth0#00:11:22:33:44:55\", or \"auto\"."))
o = s:option(Value, "source_ip", translate("Source-IP"), translate("Force source-ip for Raw Socket."))
o.datatype = "ipaddr"
o = s:option(Value, "source_port", translate("Source-Port"), translate("Force source-port for Raw Socket, TCP/UDP only."))
o.datatype = "port"
o = s:option(Value, "log_level", translate("Log Level"))
o.datatype = "range(0,6)"
o.placeholder = "4"
return m

View File

@ -0,0 +1,56 @@
local m, s, o
m = Map("udp2raw", "%s - %s" %{translate("udp2raw-tunnel"), translate("Servers Manage")})
s = m:section(TypedSection, "servers")
s.anonymous = true
s.addremove = true
s.sortable = true
s.template = "cbi/tblsection"
s.extedit = luci.dispatcher.build_url("admin/services/udp2raw/servers/%s")
function s.create(...)
local sid = TypedSection.create(...)
if sid then
luci.http.redirect(s.extedit % sid)
return
end
end
o = s:option(DummyValue, "alias", translate("Alias"))
function o.cfgvalue(...)
return Value.cfgvalue(...) or translate("None")
end
o = s:option(DummyValue, "_server_address", translate("Server Address"))
function o.cfgvalue(self, section)
local server_addr = m.uci:get("udp2raw", section, "server_addr") or "?"
local server_port = m.uci:get("udp2raw", section, "server_port") or "8080"
return "%s:%s" %{server_addr, server_port}
end
o = s:option(DummyValue, "_listen_address", translate("Listen Address"))
function o.cfgvalue(self, section)
local listen_addr = m.uci:get("udp2raw", section, "listen_addr") or "127.0.0.1"
local listen_port = m.uci:get("udp2raw", section, "listen_port") or "2080"
return "%s:%s" %{listen_addr, listen_port}
end
o = s:option(DummyValue, "raw_mode", translate("Raw Mode"))
function o.cfgvalue(...)
local v = Value.cfgvalue(...)
return v and v:lower() or "faketcp"
end
o = s:option(DummyValue, "cipher_mode", translate("Cipher Mode"))
function o.cfgvalue(...)
local v = Value.cfgvalue(...)
return v and v:lower() or "aes128cbc"
end
o = s:option(DummyValue, "auth_mode", translate("Auth Mode"))
function o.cfgvalue(...)
local v = Value.cfgvalue(...)
return v and v:lower() or "md5"
end
return m

View File

@ -0,0 +1,98 @@
<%#
Copyright (C) 2017 Jian Chang <aa65535@live.com>
Licensed to the public under the GNU General Public License v3.
-%>
<%+cbi/valueheader%>
<%-
local values = self:formvalue(section)
if not values then
values = self:cfgvalue(section) or {self.default}
end
local function serialize_json(x, cb)
local rv, push = nil, cb
if not push then
rv = { }
push = function(tok) rv[#rv+1] = tok end
end
if x == nil then
push("null")
elseif type(x) == "table" then
push("[")
for k = 1, #x do
if k > 1 then
push(",")
end
serialize_json(x[k], push)
end
push("]")
else
push('"%s"' % tostring(x):gsub('["%z\1-\31\\]',
function(c) return '\\u%04x' % c:byte(1) end))
end
if not cb then
return table.concat(rv, "")
end
end
-%>
<div<%=attr("id", cbid .. ".value.field")%>></div>
<script type="text/javascript">//<![CDATA[
(function() {
var values = <%=serialize_json(values)%>;
var keylist = <%=serialize_json(self.keylist)%>;
var vallist = <%=serialize_json(self.vallist)%>;
var parent = document.getElementById("<%=cbid%>.value.field");
var dynamiclist_cbi_init = function() {
while (parent.firstChild) {
parent.removeChild(parent.firstChild);
}
for (var i = 0; i < values.length; i++) {
var sel = document.createElement("select");
sel.id = "<%=cbid%>." + (i + 1);
sel.name = "<%=cbid%>";
sel.index = i;
sel.className = "cbi-input-select";
sel.onchange = function() {
values[this.index] = this.value;
};
parent.appendChild(sel);
for (var j = 0; j < keylist.length; j++) {
var opt = document.createElement("option");
opt.value = keylist[j];
if (opt.value == values[i]) {
opt.selected = "selected";
}
opt.appendChild(document.createTextNode(vallist[j]));
sel.appendChild(opt);
}
var btn = document.createElement('img');
btn.src = "<%=resource%>" + ((i + 1) < values.length ? "/cbi/remove.gif" : "/cbi/add.gif");
btn.index = i;
btn.className = 'cbi-image-button';
btn.onclick = function() {
if (this.src.indexOf('remove') > -1) {
values.splice(this.index, 1);
} else {
values.push("<%=self.default%>");
}
dynamiclist_cbi_init();
return false;
};
parent.appendChild(btn);
parent.appendChild(document.createElement('br'));
}
};
dynamiclist_cbi_init();
}());
//]]></script>
<%+cbi/valuefooter%>

View File

@ -0,0 +1,29 @@
<fieldset class="cbi-section">
<legend><%:Running Status%></legend>
<table width="100%" cellspacing="10" id="_udp2raw_status_table">
<tr>
<td width="33%"><%:Binary Version%></td>
<td>
<% if udp2raw_version == "" then -%>
<em><%:Invalid Binary File.%></em>
<% else -%>
<%=pcdata(udp2raw_version)%>
<%- end %>
</td>
</tr>
<% if udp2raw_build ~= "" then -%>
<tr><td width="33%"><%:Build Time%></td><td><%=pcdata(udp2raw_build)%></td></tr>
<% end -%>
<tr><td width="33%"><%:Running Status%></td><td id="_udp2raw_status"><em><%:Collecting data...%></em></td></tr>
</table>
</fieldset>
<script type="text/javascript">//<![CDATA[
var udp2raw_status = document.getElementById('_udp2raw_status');
XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "udp2raw", "status")%>', null, function(x, status) {
if ( x && x.status == 200 ) {
udp2raw_status.innerHTML = status.running ? '<%:RUNNING%>' : '<%:NOT RUNNING%>';
}
});
//]]></script>

1
luci-app-udp2raw/po/zh-cn Symbolic link
View File

@ -0,0 +1 @@
zh_Hans

View File

@ -0,0 +1,120 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8\n"
msgid "udp2raw-tunnel"
msgstr "udp2raw 隧道"
msgid "Settings"
msgstr "设置"
msgid "Servers Manage"
msgstr "服务器管理"
msgid "Running Status"
msgstr "运行状态"
msgid "Binary Version"
msgstr "文件版本"
msgid "Build Time"
msgstr "编译时间"
msgid "Invalid Binary File."
msgstr "可执行文件无效。"
msgid "RUNNING"
msgstr "运行中"
msgid "NOT RUNNING"
msgstr "未运行"
msgid "General Settings"
msgstr "基本设置"
msgid "Server"
msgstr "服务器"
msgid "Disable"
msgstr "停用"
msgid "Run Daemon as User"
msgstr "以该用户启动"
msgid "Alias"
msgstr "别名"
msgid "None"
msgstr "无"
msgid "Server Address"
msgstr "服务器地址"
msgid "Listen Address"
msgstr "监听地址"
msgid "Edit Server"
msgstr "编辑服务器"
msgid "Alias(optional)"
msgstr "别名(可选)"
msgid "Server Port"
msgstr "服务器端口"
msgid "Local Listen Host"
msgstr "本地监听地址"
msgid "Local Listen Port"
msgstr "本地监听端口"
msgid "Raw Mode"
msgstr "Raw 方式"
msgid "Password"
msgstr "密码"
msgid "Cipher Mode"
msgstr "加密方式"
msgid "Auth Mode"
msgstr "验证方式"
msgid "Auto Rule"
msgstr "自动规则"
msgid "Auto add (and delete) iptables rule."
msgstr "自动添加/删除 iptables 规则。"
msgid "Keep Rule"
msgstr "保持规则"
msgid "Monitor iptables and auto re-add if necessary."
msgstr "定期检查 iptables 并在必要时重新添加规则。"
msgid "seq Mode"
msgstr "seq 模式"
msgid "seq increase mode for faketcp."
msgstr "用于 faketcp 的 seq 增加方式。"
msgid "Lower Level"
msgstr ""
msgid "Send packets at OSI level 2, format: \"eth0#00:11:22:33:44:55\", or \"auto\"."
msgstr "在 OSI 模型第二层发送数据包,格式:\"eth0#00:11:22:33:44:55\",或 \"auto\"。"
msgid "Source-IP"
msgstr "源IP"
msgid "Force source-ip for Raw Socket."
msgstr "在原始数据包中强制指定源IP。"
msgid "Source-Port"
msgstr "源端口"
msgid "Force source-port for Raw Socket, TCP/UDP only."
msgstr "在原始数据包中强制指定源端口,仅用于 TCP/UDP。"
msgid "Log Level"
msgstr "日志级别"

View File

@ -0,0 +1,16 @@
config general 'general'
list server 'nil'
option daemon_user 'root'
config servers 'default'
option server_addr ''
option server_port '8080'
option listen_addr '127.0.0.1'
option listen_port '2080'
option raw_mode 'faketcp'
option key ''
option cipher_mode 'aes128cbc'
option auth_mode 'md5'
option auto_rule '1'

View File

@ -0,0 +1,156 @@
#!/bin/sh /etc/rc.common
START=88
STOP=15
USE_PROCD=1
NAME=udp2raw
_log() {
logger -p "daemon.$1" -t "$NAME" "$2"
}
has_valid_server() {
local server
for server in $@; do
[ "$(uci_get $NAME $server)" = "servers" ] && return 0
done
return 1
}
add_ipt_rule() {
if [ -z "$ipt_cmd" ]; then
command -v iptables >/dev/null 2>&1 || return 1
ipt_cmd='iptables'
[ -n "$(iptables -h 2> /dev/null | grep -e '--wait')" ] && ipt_cmd="$ipt_cmd --wait"
echo "# firewall include file" > "/var/etc/$NAME.include"
else
echo "$ipt_cmd" | grep -q -e '--wait'
[ $? -ne 0 ] && sleep 2
fi
$ipt_cmd -I INPUT -s "$server_addr"/32 -p tcp -m tcp --sport "$server_port" -m comment --comment "${NAME}DwrW" -j DROP
}
flush_ipt_rules() {
iptables-save -c | grep -v "${NAME}DwrW" | iptables-restore -c
[ -f "/var/etc/$NAME.include" ] && rm -f "/var/etc/$NAME.include"
}
export_ipt_rules() {
[ -f "/var/etc/$NAME.include" ] || return
cat <<-CAT >> "/var/etc/$NAME.include"
iptables-save -c | grep -v "${NAME}DwrW" | iptables-restore -c
iptables-restore -n <<-EOF
$(iptables-save -t filter | grep -E "${NAME}DwrW|^\*|^COMMIT" | sed 's/^-A /-I /')
EOF
CAT
}
create_config() {
local config_file="$1"
echo "# auto-generated config file from /etc/config/udp2raw" > $config_file
echo "-c" >> $config_file
echo "-l ${listen_addr}:${listen_port}" >> $config_file && _log "info" "listening on: ${listen_addr}:${listen_port}"
echo "-r ${server_addr}:${server_port}" >> $config_file
[ -n "$raw_mode" ] && echo "--raw-mode ${raw_mode}" >> $config_file && _log "info" "raw-mode: ${raw_mode}"
[ -n "$key" ] && echo "--key ${key}" >> $config_file
[ -n "$cipher_mode" ] && echo "--cipher-mode ${cipher_mode}" >> $config_file
[ -n "$auth_mode" ] && echo "--auth-mode ${auth_mode}" >> $config_file
[ $auto_rule -eq 1 -a $keep_rule -eq 1 ] && echo "--auto-rule" >> $config_file
[ $auto_rule -eq 1 -a $keep_rule -eq 1 ] && echo "--keep-rule" >> $config_file
[ -n "$seq_mode" ] && echo "--seq-mode ${seq_mode}" >> $config_file
[ -n "$lower_level" ] && echo "--lower-level ${lower_level}" >> $config_file
[ -n "$source_ip" ] && echo "--source-ip ${source_ip}" >> $config_file
[ -n "$source_port" ] && echo "--source-port ${source_port}" >> $config_file
echo "--retry-on-error" >> $config_file
[ -n "$log_level" ] && echo "--log-level ${log_level}" >> $config_file
echo "--disable-color" >> $config_file
}
validate_config_section() {
uci_validate_section "$NAME" general "$1" \
'server:uciname' \
'daemon_user:string:root'
}
validate_server_section() {
uci_validate_section "$NAME" servers "$1" \
'server_addr:host' \
'server_port:port:8080' \
'listen_addr:ipaddr:127.0.0.1' \
'listen_port:port:2080' \
'raw_mode:or("faketcp", "udp", "icmp"):faketcp' \
'key:string' \
'cipher_mode:or("aes128cbc", "xor", "none"):aes128cbc' \
'auth_mode:or("md5", "crc32", "simple", "none"):md5' \
'auto_rule:bool:1' \
'keep_rule:bool:0' \
'seq_mode:range(0,4)' \
'lower_level:string' \
'source_ip:ipaddr' \
'source_port:port' \
'log_level:range(0,6)'
}
start_instance() {
local server="$1"
if [ -z "$server" -o "$server" == "nil" ]; then
return 0
elif ! validate_server_section "$server"; then
_log "err" "Server config validation failed."
return 1
fi
/sbin/validate_data "ipaddr" "$server_addr" >/dev/null 2>&1
[ $? -ne 0 ] && server_addr=$(nslookup "$server_addr" | \
sed -n 's/^Address[[:space:]]*[0-9]*:[[:space:]]*\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\)$/\1/p')
if [ -z "$server_addr" ]; then
_log "err" "Server address validation failed."
return 1
fi
[ -d /var/etc ] || mkdir -p /var/etc
local config_file="/var/etc/${NAME}.${server}.conf"
create_config "$config_file" || return 1
if [ $auto_rule -eq 1 -a $keep_rule -ne 1 ]; then
add_ipt_rule || { _log "err" "added iptables rule failed."; return 1; }
fi
procd_open_instance
procd_set_param command /usr/bin/udp2raw
procd_append_param command --conf-file "$config_file"
procd_set_param respawn
procd_set_param file "$config_file"
[ -n "$daemon_user" ] && procd_set_param user "$daemon_user" && _log "info" "running from ${daemon_user} user"
procd_set_param pidfile "/var/run/${NAME}.${server}.pid"
procd_close_instance
}
service_triggers() {
procd_add_reload_trigger "$NAME"
}
start_service() {
if ! validate_config_section "general" ; then
_log "err" "Config validate failed."
return 1
fi
has_valid_server $server || return 1
flush_ipt_rules
for srv in $server; do
start_instance $srv
done
export_ipt_rules
}
stop_service() {
flush_ipt_rules
}

View File

@ -0,0 +1,29 @@
#!/bin/sh
uci -q batch <<-EOF > /dev/null
delete ucitrack.@udp2raw[-1]
add ucitrack udp2raw
set ucitrack.@udp2raw[-1].init=udp2raw
commit ucitrack
delete firewall.udp2raw
set firewall.udp2raw=include
set firewall.udp2raw.type=script
set firewall.udp2raw.path=/var/etc/udp2raw.include
set firewall.udp2raw.reload=1
commit firewall
EOF
general=$(uci -q get udp2raw.@general[-1])
if [ -z "$general" ]; then
uci -q add udp2raw general
fi
if [ "$general"x != "general"x ]; then
uci -q batch <<-EOF > /dev/null
rename udp2raw.@general[-1]="general"
set udp2raw.@general[-1].server="nil"
commit udp2raw
EOF
fi
rm -rf /tmp/luci-indexcache /tmp/luci-modulecache
exit 0

View File

@ -0,0 +1,11 @@
{
"luci-app-udp2raw": {
"description": "Grant UCI access for luci-app-udp2raw",
"read": {
"uci": [ "udp2raw" ]
},
"write": {
"uci": [ "udp2raw" ]
}
}
}

53
udp2raw-tunnel/Makefile Normal file
View File

@ -0,0 +1,53 @@
#
# Copyright (c) 2017 Yu Wang <wangyucn@gmail.com>
#
# This is free software, licensed under the MIT.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=udp2raw-tunnel
PKG_VERSION:=20200818.0
PKG_RELEASE:=$(AUTORELEASE)
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/wangyu-/udp2raw-tunnel/tar.gz/$(PKG_VERSION)?
PKG_HASH:=712b0cb819555cb374206e95005b0ca6b4af86c74d572e0570630f67dfeea313
PKG_LICENSE:=MIT
PKG_LICENSE_FILES:=LICENSE
PKG_MAINTAINER:=Yu Wang
PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/package.mk
define Package/udp2raw-tunnel
SECTION:=net
CATEGORY:=Network
TITLE:=Tunnel which turns UDP Traffic into Encrypted FakeTCP/UDP/ICMP Traffic
URL:=https://github.com/wangyu-/udp2raw-tunnel
DEPENDS:=+libstdcpp +libpthread +librt
endef
define Package/udp2raw-tunnel/description
udp2raw-tunnel is a tunnel which turns UDP Traffic into Encrypted FakeTCP/UDP/ICMP Traffic by using Raw Socket.
endef
MAKE_FLAGS += cross
define Build/Prepare
$(PKG_UNPACK)
sed -i 's/cc_cross=.*/cc_cross=$(TARGET_CXX)/g' $(PKG_BUILD_DIR)/makefile
sed -i '/\*gitversion/d' $(PKG_BUILD_DIR)/makefile
echo 'const char *gitversion = "$(PKG_VERSION)";' > $(PKG_BUILD_DIR)/git_version.h
$(Build/Patch)
endef
define Package/udp2raw-tunnel/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/udp2raw_cross $(1)/usr/bin/udp2raw
endef
$(eval $(call BuildPackage,udp2raw-tunnel))