Add reverse config for V2Ray Pro

* add reverse 

add reverse 
  use io write ,fix sequence(cjson.encode's  sequence , reverse can't work )

* fix v2ray rule bug
This commit is contained in:
sitieqiang 2019-02-20 17:44:24 +08:00 committed by coolsnowwolf
parent a4cc14dc85
commit 9e5b35c867
4 changed files with 360 additions and 117 deletions

View File

@ -174,7 +174,116 @@ tls.rmempty = false
mux = s:taboption("main",Flag, "mux", translate("Mux"))
mux.rmempty = false
------------------------------------------------
s:tab("reverse", translate("Severse Setting"))
risen = s:taboption("reverse",Flag, "risen", translate("Enable"))
risen.rmempty = false
rserver = s:taboption("reverse",Value, "raddress", translate("Server Address"))
rserver.datatype = "host"
rserver.rmempty = ture
rserver_domain = s:taboption("reverse",Value, "rserver_domain", translate("Server domain"))
rserver_domain.datatype = "host"
rserver_domain.rmempty = ture
rserver_port = s:taboption("reverse",Value, "rport", translate("Server Port"))
rserver_port.datatype = "range(0,65535)"
rserver_port.rmempty = ture
rid = s:taboption("reverse",Value, "rid", translate("ID"))
rid.password = true
ralterId = s:taboption("reverse",Value, "ralterId", translate("Alter ID"))
ralterId.datatype = "range(1,65535)"
ralterId.rmempty = ture
rsecurity = s:taboption("reverse",ListValue, "rsecurity", translate("Security"))
rsecurity:value("none")
rsecurity:value("auto")
rsecurity:value("aes-128-cfb")
rsecurity:value("aes-128-gcm")
rsecurity:value("chacha20-poly1305")
rnetwork_type = s:taboption("reverse",ListValue, "rnetwork_type", translate("Network Type"))
rnetwork_type:value("tcp")
rnetwork_type:value("kcp")
rnetwork_type:value("ws")
rnetwork_type:value("h2")
-- tcp settings
rtcp_obfs = s:taboption("reverse",ListValue, "rtcp_obfs", translate("TCP Obfs"))
rtcp_obfs:value("none")
rtcp_obfs:value("http")
rtcp_obfs:depends("rnetwork_type", "tcp")
rtcp_path = s:taboption("reverse",DynamicList, "rtcp_path", translate("TCP Obfs Path"))
rtcp_path:depends("rtcp_obfs", "http")
rtcp_host = s:taboption("reverse",DynamicList, "rtcp_host", translate("TCP Obfs Header"))
rtcp_host:depends("rtcp_obfs", "http")
rtcp_host.datatype = "host"
-- kcp settings
rkcp_obfs = s:taboption("reverse",ListValue, "rkcp_obfs", translate("KCP Obfs"))
rkcp_obfs:value("none")
rkcp_obfs:value("srtp")
rkcp_obfs:value("utp")
rkcp_obfs:value("wechat-video")
rkcp_obfs:value("dtls")
rkcp_obfs:value("wireguard")
rkcp_obfs:depends("rnetwork_type", "kcp")
rkcp_mtu = s:taboption("reverse",Value, "rkcp_mtu", translate("KCP MTU"))
rkcp_mtu.datatype = "range(576,1460)"
rkcp_mtu:depends("rnetwork_type", "kcp")
rkcp_tti = s:taboption("reverse",Value, "rkcp_tti", translate("KCP TTI"))
rkcp_tti.datatype = "range(10,100)"
rkcp_tti:depends("rnetwork_type", "kcp")
rkcp_uplink = s:taboption("reverse",Value, "rkcp_uplink", translate("KCP uplinkCapacity"))
rkcp_uplink.datatype = "range(0,1000)"
rkcp_uplink:depends("rnetwork_type", "kcp")
rkcp_downlink = s:taboption("reverse",Value, "rkcp_downlink", translate("KCP downlinkCapacity"))
rkcp_downlink.datatype = "range(0,1000)"
rkcp_downlink:depends("rnetwork_type", "kcp")
rkcp_readbuf = s:taboption("reverse",Value, "rkcp_readbuf", translate("KCP readBufferSize"))
rkcp_readbuf.datatype = "range(0,100)"
rkcp_readbuf:depends("rnetwork_type", "kcp")
rkcp_writebuf = s:taboption("reverse",Value, "rkcp_writebuf", translate("KCP writeBufferSize"))
rkcp_writebuf.datatype = "range(0,100)"
rkcp_writebuf:depends("rnetwork_type", "kcp")
rkcp_congestion = s:taboption("reverse",Flag, "rkcp_congestion", translate("KCP Congestion"))
rkcp_congestion:depends("rnetwork_type", "kcp")
-- websocket settings
rws_path = s:taboption("reverse",Value, "rws_path", translate("WebSocket Path"))
rws_path:depends("rnetwork_type", "ws")
rws_headers = s:taboption("reverse",Value, "rws_headers", translate("WebSocket Header"))
rws_headers:depends("rnetwork_type", "ws")
rws_headers.datatype = "host"
-- http/2 settings
rh2_path = s:taboption("reverse",Value, "rh2_path", translate("HTTP Path"))
rh2_path:depends("rnetwork_type", "h2")
rh2_domain = s:taboption("reverse",Value, "rh2_domain", translate("HTTP Domain"))
rh2_domain:depends("rnetwork_type", "h2")
rh2_domain.datatype = "host"
-- others
rtls = s:taboption("reverse",Flag, "rtls", translate("TLS"))
rtls.rmempty = false
rmux = s:taboption("reverse",Flag, "rmux", translate("Mux"))
rmux.rmempty = false
--------------------------------------------------
s:tab("list", translate("User-defined GFW-List"))
gfwlist = s:taboption("list", TextValue, "conf")
gfwlist.description = translate("<br />!Note: When the domain name is entered and will automatically merge with the online GFW-List. Please manually update the GFW-List list after applying.")

6
package/lean/luci-app-v2ray-pro/po/zh-cn/v2raypro.po Normal file → Executable file
View File

@ -114,3 +114,9 @@ msgstr "文件已保存到"
msgid "No specify upload file."
msgstr "未指定上传文件"
msgid "Severse Setting"
msgstr "反向代理设置"
msgid "Server domain"
msgstr "反向代理域名"

View File

@ -9,10 +9,23 @@ config v2raypro 'v2raypro'
option id '00755892-0921-4433-bd92-04242abd92af'
option alterId '64'
option security 'aes-128-gcm'
option network_type 'ws'
option tls '1'
option mux '1'
option ws_path '/v2ray'
option ws_headers 'www.baidu.com'
option enabled '0'
option network_type 'tcp'
option tcp_obfs 'none'
option tls '0'
option mux '0'
option raddress '4.4.4.4'
option rport '455'
option ralterId '64'
option rsecurity 'none'
option rnetwork_type 'tcp'
option rtcp_obfs 'none'
option rtls '0'
option rmux '0'
option rid '00755892-0921-4433-bd92-04242abd92af'
option enabled '1'
option renable '1'
option rdomain 'abcd.com'
option renabled '0'
option risen '0'
option rserver_domain 'abc.com'

View File

@ -1,6 +1,10 @@
--[[
Auto generate config for Project V
Author: @libc0607
add reverse
use io write ,fix sequence(cjson.encode's sequence , reverse can't work )
@tqsi
]]--
local conf_path, json_path = ...
@ -8,13 +12,14 @@ conf_path = conf_path or "v2raypro"
json_path = json_path or "/tmp/config.json"
local local_listen_port = 7070
local cjson = require "cjson.safe"
local ucursor = require "luci.model.uci".cursor()
local lip = require "luci.ip"
local v2ray_stream_mode = ucursor:get(conf_path, "v2raypro", "network_type") -- tcp/kcp/ws
local v2ray_enReverse = ucursor:get(conf_path, "v2raypro", "risen")=="1" and true or false
function v2ray_get_conf_list(op)
local t = {}
for k, v in pairs(ucursor:get_list(conf_path, 'v2ray', op)) do
@ -47,122 +52,232 @@ function get_ip_list_by_domain(domain)
return domain_list
end
local v2ray = {
log = {
access = "",
error = "",
loglevel = "none"
},
inbound = {
protocol = "dokodemo-door",
port = local_listen_port,
domainOverride = {"tls", "http"},
address = "",
settings = {
network = "tcp,udp",
timeout = 30,
followRedirect = true
},
},
outbound = {
protocol = "vmess",
settings = {
vnext = {
[1] = {
address = ucursor:get(conf_path, "v2raypro", "address"),
port = tonumber(ucursor:get(conf_path, "v2raypro", "port")),
users = {
[1] = {
id = ucursor:get(conf_path, "v2raypro", "id"),
alterId = tonumber(ucursor:get(conf_path, "v2raypro", "alterId")),
security = ucursor:get(conf_path, "v2raypro", "security")
},
},
},
},
},
streamSettings = {
network = ucursor:get(conf_path, "v2raypro", "network_type"),
security = (ucursor:get(conf_path, "v2raypro", "tls") == '1') and "tls" or "none",
tcpSettings = (v2ray_stream_mode == "tcp" and ucursor:get(conf_path, "v2raypro", "tcp_obfs") == "http") and {
connectionReuse = true,
header = {
type = ucursor:get(conf_path, "v2raypro", "tcp_obfs"),
request = {
version = "1.1",
method = "GET",
path = v2ray_get_conf_list('tcp_path'),
headers = {
Host = v2ray_get_conf_list('tcp_host'),
User_Agent = {
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36",
"Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46"
},
Accept_Encoding = {"gzip, deflate"},
Connection = {"keep-alive"},
Pragma = "no-cache"
},
},
response = {
version = "1.1",
status = "200",
reason = "OK",
headers = {
Content_Type = {"application/octet-stream","video/mpeg"},
Transfer_Encoding = {"chunked"},
Connection= {"keep-alive"},
Pragma = "no-cache"
},
},
}
} or nil,
kcpSettings = (v2ray_stream_mode == "kcp") and {
mtu = tonumber(ucursor:get(conf_path, "v2raypro", "kcp_mtu")),
tti = tonumber(ucursor:get(conf_path, "v2raypro", "kcp_tti")),
uplinkCapacity = tonumber(ucursor:get(conf_path, "v2raypro", "kcp_uplink")),
downlinkCapacity = tonumber(ucursor:get(conf_path, "v2raypro", "kcp_downlink")),
congestion = (ucursor:get(conf_path, "v2raypro", "kcp_congestion") == "1") and true or false,
readBufferSize = tonumber(ucursor:get(conf_path, "v2raypro", "kcp_readbuf")),
writeBufferSize = tonumber(ucursor:get(conf_path, "v2raypro", "kcp_writebuf")),
header = {
type = ucursor:get(conf_path, "v2raypro", "kcp_obfs")
}
} or nil,
wsSettings = (v2ray_stream_mode == "ws") and {
connectionReuse = true,
path = ucursor:get(conf_path, "v2raypro", "ws_path"),
headers = (ucursor:get(conf_path, "v2raypro", "ws_headers") ~= nil) and {
Host = ucursor:get(conf_path, "v2raypro", "ws_headers")
} or nil,
} or nil,
httpSettings = (v2ray_stream_mode == "h2") and {
path = ucursor:get(conf_path, "v2raypro", "h2_path"),
host = (ucursor:get(conf_path, "v2raypro", "h2_domain") ~= nil) and {
ucursor:get(conf_path, "v2raypro", "h2_domain")
} or nil,
} or nil,
},
mux = {
enabled = (ucursor:get(conf_path, "v2raypro", "mux") == "1") and true or false
},
},
dns = {
servers = {
"localhost"
},
},
}
-- Generate config json to <json_path>
local json_raw = cjson.encode(v2ray)
local json_file = io.open(json_path, "w+")
io.output(json_file)
io.write(json_raw)
io.write("{\"log\":{\"loglevel\":\"warning\",\"access\":\"\",\"error\":\"\"},\"dns\": {\"servers\": [\"localhost\"]},\"inbounds\":[{\"port\":7070,\"tag\": \"listen\",\"protocol\":\"dokodemo-door\",\"address\":\"\",\"settings\":{\"followRedirect\":true,\"network\":\"tcp,udp\",\"timeout\":50},\"domainOverride\":[\"tls\",\"http\"]}],")
if v2ray_enReverse then --reverse set
io.write("\"reverse\": {\"bridges\": [{\"tag\": \"bridge\",\"domain\": \"")
io.write(ucursor:get(conf_path, "v2raypro", "rserver_domain"))
io.write("\"}]},")
end
--outbound
v2ray_proxy={
tag = "proxy",
protocol = "vmess",
settings = {
vnext = {
[1] = {
address = ucursor:get(conf_path, "v2raypro", "address"),
port = tonumber(ucursor:get(conf_path, "v2raypro", "port")),
users = {
[1] = {
id = ucursor:get(conf_path, "v2raypro", "id"),
alterId = tonumber(ucursor:get(conf_path, "v2raypro", "alterId")),
security = ucursor:get(conf_path, "v2raypro", "security")
},
},
},
},
},
streamSettings = {
network = ucursor:get(conf_path, "v2raypro", "network_type"),
security = (ucursor:get(conf_path, "v2raypro", "tls") == '1') and "tls" or "none",
tcpSettings = (v2ray_stream_mode == "tcp" and ucursor:get(conf_path, "v2raypro", "tcp_obfs") == "http") and {
connectionReuse = true,
header = {
type = ucursor:get(conf_path, "v2raypro", "tcp_obfs"),
request = {
version = "1.1",
method = "GET",
path = v2ray_get_conf_list('tcp_path'),
headers = {
Host = v2ray_get_conf_list('tcp_host'),
User_Agent = {
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36",
"Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46"
},
Accept_Encoding = {"gzip, deflate"},
Connection = {"keep-alive"},
Pragma = "no-cache"
},
},
response = {
version = "1.1",
status = "200",
reason = "OK",
headers = {
Content_Type = {"application/octet-stream","video/mpeg"},
Transfer_Encoding = {"chunked"},
Connection= {"keep-alive"},
Pragma = "no-cache"
},
},
}
} or nil,
kcpSettings = (v2ray_stream_mode == "kcp") and {
mtu = tonumber(ucursor:get(conf_path, "v2raypro", "kcp_mtu")),
tti = tonumber(ucursor:get(conf_path, "v2raypro", "kcp_tti")),
uplinkCapacity = tonumber(ucursor:get(conf_path, "v2raypro", "kcp_uplink")),
downlinkCapacity = tonumber(ucursor:get(conf_path, "v2raypro", "kcp_downlink")),
congestion = (ucursor:get(conf_path, "v2raypro", "kcp_congestion") == "1") and true or false,
readBufferSize = tonumber(ucursor:get(conf_path, "v2raypro", "kcp_readbuf")),
writeBufferSize = tonumber(ucursor:get(conf_path, "v2raypro", "kcp_writebuf")),
header = {
type = ucursor:get(conf_path, "v2raypro", "kcp_obfs")
}
} or nil,
wsSettings = (v2ray_stream_mode == "ws") and {
connectionReuse = true,
path = ucursor:get(conf_path, "v2raypro", "ws_path"),
headers = (ucursor:get(conf_path, "v2raypro", "ws_headers") ~= nil) and {
Host = ucursor:get(conf_path, "v2raypro", "ws_headers")
} or nil,
} or nil,
httpSettings = (v2ray_stream_mode == "h2") and {
path = ucursor:get(conf_path, "v2raypro", "h2_path"),
host = (ucursor:get(conf_path, "v2raypro", "h2_domain") ~= nil) and {
ucursor:get(conf_path, "v2raypro", "h2_domain")
} or nil,
} or nil,
},
mux = (v2ray_enReverse==false) and{
enabled = (ucursor:get(conf_path, "v2raypro", "mux") == "1") and true or false
} or nil,
}
io.write("\"outbounds\": [")
if v2ray_enReverse then
local v2ray_stream_tunnel_mode = ucursor:get(conf_path, "v2raypro", "rnetwork_type") -- tcp/kcp/ws
local v2ray_tunnel= {
tag = "tunnel",
protocol = "vmess",
settings = {
vnext = {
[1] = {
address = ucursor:get(conf_path, "v2raypro", "raddress"),
port = tonumber(ucursor:get(conf_path, "v2raypro", "rport")),
users = {
[1] = {
id = ucursor:get(conf_path, "v2raypro", "rid"),
alterId = tonumber(ucursor:get(conf_path, "v2raypro", "ralterId")),
security = ucursor:get(conf_path, "v2raypro", "rsecurity")
},
},
},
},
},
streamSettings = {
network = ucursor:get(conf_path, "v2raypro", "rnetwork_type"),
security = (ucursor:get(conf_path, "v2raypro", "rtls") == '1') and "tls" or "none",
tcpSettings = (v2ray_stream_tunnel_mode == "tcp" and ucursor:get(conf_path, "v2raypro", "rtcp_obfs") == "http") and {
connectionReuse = true,
header = {
type = ucursor:get(conf_path, "v2raypro", "rtcp_obfs"),
request = {
version = "1.1",
method = "GET",
path = v2ray_get_conf_list('tcp_path'),
headers = {
Host = v2ray_get_conf_list('tcp_host'),
User_Agent = {
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36",
"Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46"
},
Accept_Encoding = {"gzip, deflate"},
Connection = {"keep-alive"},
Pragma = "no-cache"
},
},
response = {
version = "1.1",
status = "200",
reason = "OK",
headers = {
Content_Type = {"application/octet-stream","video/mpeg"},
Transfer_Encoding = {"chunked"},
Connection= {"keep-alive"},
Pragma = "no-cache"
},
},
}
} or nil,
kcpSettings = (v2ray_stream_tunnel_mode == "kcp") and {
mtu = tonumber(ucursor:get(conf_path, "v2raypro", "rkcp_mtu")),
tti = tonumber(ucursor:get(conf_path, "v2raypro", "rkcp_tti")),
uplinkCapacity = tonumber(ucursor:get(conf_path, "v2raypro", "rkcp_uplink")),
downlinkCapacity = tonumber(ucursor:get(conf_path, "v2raypro", "rkcp_downlink")),
congestion = (ucursor:get(conf_path, "v2raypro", "rkcp_congestion") == "1") and true or false,
readBufferSize = tonumber(ucursor:get(conf_path, "v2raypro", "rkcp_readbuf")),
writeBufferSize = tonumber(ucursor:get(conf_path, "v2raypro", "rkcp_writebuf")),
header = {
type = ucursor:get(conf_path, "v2raypro", "rkcp_obfs")
}
} or nil,
wsSettings = (v2ray_stream_tunnel_mode == "ws") and {
connectionReuse = true,
path = ucursor:get(conf_path, "v2raypro", "rws_path"),
headers = (ucursor:get(conf_path, "v2raypro", "rws_headers") ~= nil) and {
Host = ucursor:get(conf_path, "v2raypro", "rws_headers")
} or nil,
} or nil,
httpSettings = (v2ray_stream_tunnel_mode == "h2") and {
path = ucursor:get(conf_path, "v2raypro", "rh2_path"),
host = (ucursor:get(conf_path, "v2raypro", "rh2_domain") ~= nil) and {
ucursor:get(conf_path, "v2raypro", "rh2_domain")
} or nil,
} or nil,
},
mux = (v2ray_enReverse==false) and{
enabled = (ucursor:get(conf_path, "v2raypro", "mux") == "1") and true or false
} or nil,
}
json_raw_t = cjson.encode(v2ray_tunnel)
io.write(json_raw_t..",")
io.write("{\"protocol\": \"freedom\",\"settings\": {},\"tag\": \"out\"},")
end
local json_raw = cjson.encode(v2ray_proxy)
io.write(json_raw.."],")
--io.write("]")
io.write("\"routing\": {\"strategy\": \"rules\",\"settings\": {\"rules\": [")--routing set
if v2ray_enReverse then
io.write("{\"type\": \"field\",\"inboundTag\": [\"bridge\"],\"domain\": [\"full:")
io.write(ucursor:get(conf_path, "v2raypro", "rserver_domain"))
io.write("\"],\"outboundTag\": \"tunnel\"},{\"type\": \"field\",\"inboundTag\": [\"bridge\"],\"outboundTag\": \"out\"},")
end
io.write("{\"domainStrategy\": \"IPIfNonMatch\",\"type\": \"field\",\"outboundTag\": \"proxy\",\"inboundTag\": [\"listen\"]}]}}")
io.write("}")--end
io.close(json_file)
-- change '_' to '-'
local keys_including_minus = {"User_Agent", "Content_Type", "Accept_Encoding", "Transfer_Encoding"}
local keys_corrected = {"User-Agent", "Content-Type", "Accept-Encoding", "Transfer-Encoding"}