интеграция с iptvportal

    Настройка связки iptvpotrtal и astra

    Настройка Astra

    создайте папку /etc/mod

    mkdir /etc/astra/mod
    

    в папке создайте файл ares.lua со следующим содержимым:

    ares.lua

    local backend = "http://go.iptvportal.ru/auth/arescrypt/"
    
    access_list = {
        "127.0.0.1",
        "192.168.0.0/24",
    }
    
    drop_list = {
        "192.168.1.0/24",
    }
    
    function ip_to_number(ip)
        ip = ip:split("%.")
        if #ip ~= 4 then return 0 end
        for k,v in ipairs(ip) do
            ip[k] = tonumber(v)
            if not ip[k] then return 0 end
        end
        return (ip[1] * 0x1000000) + (ip[2] * 0x10000) + (ip[3] * 0x100) + (ip[4])
    end
    
    function mask_to_number(mask)
        local a = 0xFFFFFFFF
        local m = 32 - tonumber(mask)
        if m > 0 then
            a = bit32.rshift(a, m)
            a = bit32.lshift(a, m)
        end
        return a
    end
    
    function parse_list(list)
        for i,v in ipairs(list) do
            local b = v:find("/")
            if b then
                local a = ip_to_number(v:sub(1, b - 1))
                local m = mask_to_number(v:sub(b + 1))
                a = bit32.band(a, m)
                list[i] = { a, m }
            else
                local a = ip_to_number(v)
                local m = mask_to_number(32)
                list[i] = { a, m }
            end
        end
    end
    
    parse_list(access_list)
    parse_list(drop_list)
    
    function ip_check(list, ip)
        ip = ip_to_number(ip)
        for _,v in ipairs(list) do
            if v[1] == bit32.band(ip, v[2]) then return true end
        end
        return false
    end
    
    function auth_request(client_id, request, callback)
        local session_data = http_output_client_list[client_id]
        if not request then
            if session_data.auth then
                session_data.auth:close()
                session_data.auth = nil
            end
            return nil
        end
    
        if ip_check(access_list, request.addr) then
            callback(true)
            return nil
        end
    
        if ip_check(drop_list, request.addr) then
            callback(false)
            return nil
        end
    
        local function check_backend(path)
            local conf = parse_url(path)
            conf.method = "GET"
            conf.headers = {
                "User-Agent: Astra",
                "Host: " .. conf.host .. ":" .. conf.port,
                "Connection: close",
            }
            conf.callback = function(self, response)
                session_data.auth = nil
                if response.code == 200 then
                    callback(true)
                elseif response.code == 401 or response.code == 403 then
                    callback(false)
                elseif response.code == 301 or response.code == 302 then
                    check_backend(response.headers["location"])
                else
                    callback(true)
                end
            end
            session_data.auth = http_request(conf)
        end
    
        local query = request.request_uri:sub(#request.path + 1)
        if #query == 0 then
            callback(false)
            return nil
        end
    
        check_backend(backend .. query)
    end
    
    

    access_list - могут работать без авторизации на портале.
    drop_list - безусловный запрет авторизации.

    перезапустите Astra


    Настройки портала:

    В меню "Ключи" создайте новый ключ:

    • название - "Astra"
    • алгоритм - "ARESSTREAM"
    • режим - "SM"
    • длинна ключа - "1472 бит"
    • период обновления - "1:00:00"

    В настройках канала:

    • колонка "auth" - укажите значение "arescrypt"
    • колонка "закодирован" - установите чекбокс.
    • колонка "ключ" - выберите "Astra"