mikrotik bridge dhcp snooping + opt 82

IPoE related questions
Post Reply
yazero
Posts: 28
Joined: 22 Apr 2017, 19:02

mikrotik bridge dhcp snooping + opt 82

Post by yazero »

Доброго дня.

В mikrotik ros появилась возможность настроить dhcp_snooping и opt.82 на bridge.
как пока разобрался в
agent_circuid_id он формирует из system identity + имя порта .
agent_remote_id он формирует из имени порта .


имя порта он использует разное , в circuit_id для порта default-name=ether1 name=ether1 он присвоил значение eth0/1
в agent_remote_id имя порта ether1.


И по какой-то причине все наоборот. remote_id --- circuit_id

кто подскажет как разобрать его через lua ?

сейчас это работает вот так

<Relay-Agent {Agent-Circuit-ID E4:8D:8C:8B:FF:41 eth 0/1} {Agent-Remote-ID ether1}>]
но после обработки в radius летит запрос 65:74:68:65:72:31-49


Подумал что плохая идея использовать mac для авторизации , и переписал на IP CPE так будет удобнее

Code: Select all

<Relay-Agent {Agent-Circuit-ID 192.168.240.120 eth 0/1} {Agent-Remote-ID ether1}>]
   Circuit-ID SubOption 1, length 23: 192.168.240.120 eth 0/1
   Remote-ID SubOption 2, length 6: ether1
но после обработки тож самое

Code: Select all

<User-Name "65:74:68:65:72:31-49"> <NAS-IP-Address 192.168.0.41> <NAS-Port 816> <NAS-Port-Id "ipoe0"> <NAS-Port-Type Ethernet> <Calling-Station-Id "30:5a:3a:a6:4
0:d8">

скрипт написан для snr+dlink

Code: Select all

#!lua
function username(pkt)

    local str=pkt:agent_remote_id()
    if string.len(str)>6 then
        str=string.sub(str,-6,-1)
    elseif string.len(str)<6 then
        print("short_remote_id")
        return "short_remote_id"
    end

    v,b1,b2,b3,b4,b5,b6=string.unpack(str,'bbbbbb')
    local remote_id=string.format("%02x:%02x:%02x:%02x:%02x:%02x", b1,b2,b3,b4,b5,b6)

    v,port=string.unpack(string.sub(pkt:agent_circuit_id(),'-1'),'b')
    local username=remote_id..'-'..port

    print(username)
    return username

end
mikrotik_dhcp.png
mikrotik_dhcp.png (97.14 KiB) Viewed 5203 times
yazero
Posts: 28
Joined: 22 Apr 2017, 19:02

Re: mikrotik bridge dhcp snooping + opt 82

Post by yazero »

в качестве индетификатора выступает строка в system-identify
вот скрипт lua дря разбора opt.82

здесь заготовка SNR+Dlink+Mikrotik

Code: Select all

#!lua
function username(pkt)
if (pkt:option(82) == nil) then
return "empty_opt82"
end
so=getsuboption(pkt:option(82),1)
ippart = so:match("((%d+)%.(%d+)%.(%d+)%.(%d+))")
if (ippart ~= nil) then
return ippart
end
local str=pkt:agent_remote_id()
if string.len(str)>6 then
str=string.sub(str,-6,-1)
elseif string.len(str)<6 then
print("short_remote_id")
return "short_remote_id"
end

v,b1,b2,b3,b4,b5,b6=string.unpack(str,'bbbbbb')
local remote_id=string.format("%02x:%02x:%02x:%02x:%02x:%02x", b1,b2,b3,b4,b5,b6)

v,port=string.unpack(string.sub(pkt:agent_circuit_id(),'-1'),'b')
local username=remote_id..'-'..port

-- print(username)
return username
end

function getsuboption(opt,id)
len=opt:len()
o=nil
i=1
while i<len do
v,t,l=string.unpack(opt:sub(i,i+1),'bb')
if (id == t) then
o=opt:sub(i+2,i+l+1)
end
i=i+l+2
end
return o
end



только mikrotik

Code: Select all

#!lua
function username(pkt)
so=getsuboption(pkt:option(82),1)
ippart = so:match("((%d+)%.(%d+)%.(%d+)%.(%d+))")
result = ippart
return result
end

function getsuboption(opt,id)
len=opt:len()
o=nil
i=1
while i<len do
v,t,l=string.unpack(opt:sub(i,i+1),'bb')
if (id == t) then
o=opt:sub(i+2,i+l+1)
end
i=i+l+2
end
return o
end
yazero
Posts: 28
Joined: 22 Apr 2017, 19:02

Re: mikrotik bridge dhcp snooping + opt 82

Post by yazero »

настройки accel-ppp
секция
[ipoe]
[ipoe]
mode=L2
shared=1
start=dhcpv4
ifcfg=1
interface=eth0.392

attr-dhcp-client-ip=DHCP-Client-IP-Address
attr-dhcp-router-ip=DHCP-Router-IP-Address
attr-dhcp-mask=DHCP-Mask
lua-file=/etc/accel-ppp.lua
username=lua:username
verbose=5
gw-ip-address=10.1.0.1/19
#zero edit : время аренды , увеличил с 600 при большом количестве абонентов , будет много запросов.
lease-time=3600
#zero edit : макс время аренды, если не было lease пакетов
max-lease-time=3660

#zero edit: разорвать сессию если не будет трафика в течении указанного времени, данный параметр не указывать
#idle-timeout=30
#zero edit: максимальное время сесси если все норм, lease-time/max-lease-time
#session-timeout=86400 # выдается через biling/radius
soft-teminate=1


[radius]
dictionary=/opt/accel-ppp/share/accel-ppp/radius/dictionary
nas-ip-address=192.168.0.41
auth-server=192.168.0.4:1814,pass
acct-server=192.168.0.4:1815,pass
dae-server=0.0.0.0:1814,ctrhtn
verbose=5
interim-verbose=3
timeout=5
max-try=5
acct-timeout=0
acct-interim-interval=30
Axiator
Posts: 22
Joined: 22 Feb 2017, 16:06

Re: mikrotik bridge dhcp snooping + opt 82

Post by Axiator »

В ROS 6.44 будет много фиксов этого дела. Лучше подождать.
yazero
Posts: 28
Joined: 22 Apr 2017, 19:02

Re: mikrotik bridge dhcp snooping + opt 82

Post by yazero »

На 6.43.12 и 6.44.beta проверял.
Изменений в логике формирования пакета нет. По описанию changelog меняется поведение на бридже. У меня были странные глюки прохождение через trust порт. То работает то нет. Но дамп не делал. Хотелось пока отловить opt82 и авторизоваться.
Axiator
Posts: 22
Joined: 22 Feb 2017, 16:06

Re: mikrotik bridge dhcp snooping + opt 82

Post by Axiator »

Отлично, спасибо за работу.
yazero
Posts: 28
Joined: 22 Apr 2017, 19:02

Re: mikrotik bridge dhcp snooping + opt 82

Post by yazero »

на 6.44 dhcp-snooping заработал без проблем и глюков (либо пока не выявились)
До выхода этой прошивки для работы dhcp snooping нужно было включать trust port на eth1
Post Reply