Skip to content

Latest commit

 

History

History
188 lines (135 loc) · 4.88 KB

lua.md

File metadata and controls

188 lines (135 loc) · 4.88 KB

本文是对lua配置的简单介绍,更完整的介绍可见 ruci 用户手册

Config 是 提供给 rucimp 的项, 静态示例如下

静态链

无论lua 中代码怎么写, 对于静态链, 程序只会在lua 代码中找一个全局变量 "Config"

tls = { TLS = {  cert = "test.cert", key = "test.key" } }
listen = { Listener  = { listen_addr = "0.0.0.0:10800"} }
c = "Counter"
chain1 = {
    listen,
    { Adder = 3 },
    c,
    tls,
    c,
    { Socks5 = {  userpass = "u0 p0", more = {"u1 p1"} } },
    "Counter",

}
len = table.getn(chain1)
for i=1,5 do 
    chain1[len+1] = tls
    chain1[len+2] = c 
    len = len + 2
    print(len)
end

Config = {
    inbounds = {
        {chain = chain1, tag = "listen1"}
    },
    outbounds = { tag = "d1", chain = { "Blackhole" } },

    tag_route = { { "listen1", "dial1" }, { "listen2", "dial2" }  },

    rule_route = { 
        { 
            out_tag = "dial1", 
            mode = "WhiteList",
            in_tags = { "listen1" } ,
            is_fallback = false,
             userset = {
                { "plaintext:u0 p0", "trojan:mypassword" },
                { "plaintext:u1 p1", "trojan:password1" },
            },
            ta_ip_countries = { "CN", "US" }, --ta means target_addr
            ta_networks = { "tcp", "udp" },
            ta_ipv4 = { "192.168.1.0/24" },
            ta_domain_matcher = {
                domain_regex = {  "[a-z]+@[a-z]+",
                "[a-z]+" },
                domain_set = { "www.baidu.com" },
            }
        } 
    }
}

要求每一条inbound 都要有一个 tag, 每一个 inbound 中的 chain 都要有至少一个 map (映射)

rule_route 和 tag_route 同时出现时, 程序只会采用 rule_route. 因为 rule_route 的内容涵盖了 tag_route

rule_route 的 mode 可为 WhiteList 或 BlackList

WhiteList意思是, 给出的规则必须完全匹配, 才算通过.
BlackList 意思是, 给出的规则有任意一项匹配就算通过. 一般BlackList 用于 路由到 BlackHole, 故名.

动态链

演示动态链的基本用法:

有限(局部)动态链

有限动态链中, 程序一样会读取 Config 变量, 和 静态链一样. 但它还要读一个 Dyn_Selectors 全局函数

Dyn_Selectors, 对每一个tag 的inbound/outbound 都要有返回一个selector

selector 接受 this_index 和 data 作为输入, 返回一个新的index, index 是 在 该chain (Map数组) 中的索引

selector 在 "有限状态机" 里对应的是 "状态转移函数"

示例:

---[[

-- 演示 有限动态链的 选择器用法


function Dyn_Selectors(tag)
    if tag == "listen1" then 
        return dyn_inbound_next_selector
    end
     if tag == "dial1" then 
        return dyn_outbound_next_selector
    end
end

-- 下面两个selector 示例都是 最简单的示例, 使得动态链的行为和静态链相同

local dyn_inbound_next_selector = function (this_index, data)
    -- print("data:",data)
   
    return this_index + 1
end

local dyn_outbound_next_selector = function (this_index, data)
    return this_index + 1
end


--]]

无限(完全)动态链

完全动态链的基本演示完全动态链不使用 固定的列表 来预定义任何Maps, 它只给出一个函数

generator, generator 根据参数内容来动态生成 [Map]; 或者也可以利用 Create_in_map 和 Create_out_map 这两个方法来直接在 lua 中创建map.

Create_* 方法的使用 主要是用于 创建一个map 并缓存起来, 留作之后使用

如果不想重复生成以前生成过的Map, 则可以返回一个已创建过的Map

下面演示的是 inbound 为 tcp - socks5, outbound 为 direct 的情况

使用 Create_* 方法的示例见 local.lua 和其它 示例 lua 文件

基本演示

---[[


local inspect = require("inspect")

-- my_cid_record = {}

Infinite = {

    inbounds = {{
        tag = "listen1",

        generator = function(cid, state_index, data)
            if state_index == -1 then
                return 0, {
                    stream_generator = {
                        Listener = { listen_addr = "0.0.0.0:10800"}
                    },
                    new_thread_fn = function(cid, state_index, data)
                        -- print("lua: cid",inspect(cid))
                        -- table.insert(my_cid_record,cid)
                        -- print("lua: cid cache",inspect(my_cid_record))

                        local new_cid, newi, new_data = coroutine.yield(1, {
                            Socks5 = {}
                        })
                        return -1, {}
                    end
                }
            end
        end
    }},

    outbounds = {{
        tag = "dial1",
        generator = function(cid, state_index, data)
            if state_index == -1 then
                return 0, "Direct"
            else
                return -1, {}
            end
        end
    }}

}

-- ]]