Инструменты пользователя

Инструменты сайта

Перевод этой страницы:

ru:ipoe

На данный момент поддерживаются L2 и L3 способы связи с клиентами. Старт сессии по DHCP Discover и неклассифицированному пакету.
Для реализации старта сессии по неклассифицированному пакету и использования общего интерфейса разработан вспомогательный модуль ядра.
Модуль ядра для каждой сессии (кроме vlan-per-user) создаёт виртуальный интерфейс, аналог ifb.
Этот интерфейс используется для шейпера и задания белого ип (нат).
Функциональное отличие L2 от L3, заключается в том что в случае L2 входящий пакет будет проверяться на совпадение mac адреса установленного при старте сессии, а исходящие пакеты будут отправляться прямиком на этот mac адрес, без дополнительных запросов ARP, что обеспечивает защиту от подмены IP/mac адресов. В случае L3 исходящий пакет будет маршрутизироваться согласно установленным правилам маршрутизации.

Общий обзор конфигурационного файла

[ipoe]

verbose=n
Если n больше нуля то будут генерироваться более подробные логи.
username=ifname|lua:имя_функции
Эта опция определяет как будет определяться имя пользователя.
Если username=ifname, то именем пользователя будет имя интерфейса с которого пришел запрос.
Если username==lua:имя_функции, то имя пользователя должна будет сформировать функция имя_функции (подробнее описано ниже). По умолчанию для DHCP сессий username=ifname, для сессий «по неклассифицированному пакету» - IP адрес клиента.
password=username|empty|пароль
Определяет как будет формироваться пароль.
Если password=username - то пароль будет соотвествовать username.
password=empty - пароль будет пустой.
password=пароль - пароль, соотвествеено, задаётся строкой пароль.
lua-file=имя_файла
Указывает имя файла с lua скриптом, который используется для написания вспомогательных функций.
lease-time=n
Эта опция указывает время аренды (в секундах) которое будет отправлено DHCP клиентам.(По умолчанию 600 секунд)
max-lease-time=n
Указывает время по истечении которого сессия будет прервана, если от DHCP клиента не было запрос на продление аренды. (По умолчанию 660 секунд)
renew-time=n
Указывает время, по истечению которого клиент должен отправить запрос на продление аренды ip-адреса (dhcp option 58). По умолчанию renew-time = lease_time /2.
idle-timeout=n
время простоя в секундах (отсутсвие пакетов) по истечению которого сессия будет завершена. (чаще всего используется для схемы L3)
session-timeout=n
максимально время жизни сессии в секундах, после чего она будет завершена.
unit-cache=n
Так-же как и для ppp эта опция используется для уменьшения негативного эффекта от низкой скорости создания и удаления интерфейсов (актуально только для сессий которые используют вспомогательный модуль ядра).
Смысл в том что после завершения сессии интерфейс не удаляется а помещается в кэш, так что новые сессии могут его использовать повторно.
l4-redirect-table=n
Задаёт номер таблицы для L4-redirect (подробнее рассмотрено ниже).
l4-redirect-ipset=наименование
Задаёт наименование ipset списка для L4-redirect (подробнее рассмотрено ниже).
agent-remote-id=идентификатор
В случае если accel-ppp работает в качестве релея, то в DHCP запросы будет вставляться опция 82 с указанным agent-remote-id и agent-circuit-id с именем интерфейса с которого пришел запрос.
shared=0|1
mode=L2|L3
start=dhcpv4|up
ifcfg=0|1
relay=адрес
giaddr=адрес
proxy-arp=0|1
Эти параметры задают значения по умолчанию для по-интерфейсного конфига (см. ниже).
interface=[re:]ifname[,shared=0|1][,mode=L2|L3][,start=dhcpv4|up][,ifcfg=0|1][,mtu=N][,range=сеть/маска][,relay=адрес][,giaddr=адрес]
Эта опция указывает какие интерфейсы использовать для связи с клиентами (для ожидания DHCP и неклассифицированных пакетов). Можно указывать несколько этих опций.
Если перед ifname стоит префикс re:, то ifname интерпретируется как регулярное выражение, таким образом одной опцией можно указать множество интерфейсов.
shared=0|1 - указывает доступно ли через этот интерфейс несколько клиентов, либо может быть только один (в случае vlan-per-user).
mode=L2|L3 - указывает вид связи, L2 - клиенты находятся в одной сети что и интерфейс, L3 - клиенты находятся за маршрутизатором.
start=dhcpv4|up - указывает каким образом запускать сессию, dhcpv4 - по DHCP Discover, up - по неклассифицированному пакету.
ifcfg=0|1 - указывает должен ли accel-ppp управлять назначением IP адресов и маршрутов на интерфейсе, либо он сконфигурирован внешне.
Заметка: Для деактивации стоит явно указать ifcfg=0.
Подробнее о ifcfg описано ниже.
mtu=n - устанавливает MTU(maximum transmission unit) для интерфейсов. По умолчанию не установлено и наследуется MTU родительского интерфейса. Для QinQ рекомендуется установить данный параметр в 1500
Заметка: Для деактивации стоит явно указать ifcfg=0.
range=сеть/маска - указывает локальный пул адресов для DHCP клиентов в случае если accel-ppp выдаёт адреса, первый адрес сети будет считаться адресом маршрутизатора (более подробно описано ниже).
relay=адрес - указывает адрес DHCP сервера на который нужно перенаправлять запросы. Так-же необходимо указать giaddr
giaddr=адрес - указывает свой адрес релей агента (Relay Agent IP Address). Если ifcfg=1 то этот адрес будет добавлен на интерфейс при старте. Так-же при старте должен существовать маршрут giaddr←→relay
proxy-arp=0/1 - указывает должен ли accel-ppp отвечать на arp запросы. Подробнее описано ниже
local-net=сеть/маска
Указывает список сетей пакеты которых будут считаться неклассифицированными. Можно указывать несколько таких опций.
attr-dhcp-client-ip=атрибут
Указывает в каком радиус атрибуте передаётся ип адрес клиента (актуально только для DHCP).
attr-dhcp-router-ip=атрибут
Указывает в каком радиус атрибуте передаётся ип адрес маршрутизатора (актуально только для DHCP).
attr-dhcp-mask=атрибут
Указывает в каком радиус атрибуте передаётся маска сети (актуально только для DHCP).
attr-l4-redirect=атрибут
Указывает в каком радиус атрибуте передаётся информация об необходимости добавить правило для L4-redirect (подробнее описано ниже).
soft-terminate=1
Включаение режима мягкого завершения сессии. При завершении сессий через команды cli или Radius Disconnect-Message сессия не будет завершена немедленно, но будет помечена как завершенная и клиент продолжит работать, но при следующем запросе продления аренды ему будет отказано и в это время сессия завершится. По умолчанию мягкое завершение отключено. Для принудительного завершения сесcии не смотря на включенный режим мягкого завершения можно использовать команду cli
terminate <селектор сессии> hard
proto=номер
Задаёт номер протокола с которым будут добавляться маршруты (по умлочанию 3 - boot). Работает только при ifcg=0, когда маршрут создает accel-ppp, а не ядро. GW ip адрес должен присутствовать в системе на каком либо из интерфейсов, в противном случае в лог будет выведена ошибка
debug: libnetlink: RTNETLINK answers: Invalid argument
offer-delay=задежка[,задержка:кол-во[,задежка:кол-во[,…]]]
Задаёт задержку или задержки DHCPOFFER в зависимости от количества активных сессий (в милисекундах).
Последняя задержка в списке может иметь значение -1, что означает не принимать новых соединений.
Список должен быть отсортирован в порядке возрастания количества сессий.
vlan-mon=[re:]ifname[,список_вланов]
Эта опция запускает монитор вланов на указаном интерфейсе (работает при поддержки модуля в ядре ipoe)
список_вланов - указывает список допустимых вланов в форме vlan-mon=eth1,5,7,9,100-200
В случае появления пакета на интерфейсе в указанных вланах accel-ppp будет создавать вланы в форме eth1.XXX и применять к ним настройки из опции interface c подходящим именем интерфейса
После окончания сессии или по таймаутут (если сессия не была запущена) accel-ppp будет удалять созданные вланы.
check-mac-change=1
В данном режиме при обнаружении смены MAC-адреса сессия будет завершена, таким образом произойдет переавторизация пользователя, используется для mode=L2 (по умолчанию включено). Для деактивации стоит явно указать check-mac-change=0
weight=n
Способ распределения нагрузки(балансировки) основанный на весах. Может применяться на интерфейс: interface=ethX,weight=N.
  • Описание работы: при получении DHCPDISCOVER accel-ppp отправляет широковещательный DHCP пакет с таким-же xid и добавляет спец. venodor-specific опцию куда записывает свой вес: глобальный weight умноженный на общее кол-во сессий, либо, если задан интерфейсный вес, то интрефейсный вес умноженный на кол-во сессий на интерфейсе. Получив такое сообщение от другого accel-ppp, происходит поиск сессий по xid и сравнивается её вес с принятым, если принятый вес меньше, то сессия останавливается.Интерфейсный weight=0 является специальным, используется для обозначения интерфейса который будет резервным, т.е. при получении любого веса от другого сервера, сессия будет останавливаться, таким образом сессия запустится только если никто больше не отвечает.
offer-timeout=n
Время в секундах, которое accel-ppp будет ждать DHCP request от клиента. Если клиент не отправил request в течении этого времени, accel-ppp завершает сессию. (по умолчанию 10 секунд)
noauth=n
Если n не равно нулю, позволяет пользователям произвести соединения без аутентификация по radius или chap-secrets. Для корректной работоспособности необходимо использовать в связке с ip-pool.
По умолчанию 0.

Использование LUA для формирования имени пользователя на основе DHCP пакета

Описано тут


Варианты использования

L2-connected, старт по DHCP Discover, общий интерфейс

Предположим, что клиенты находятся на интерфейсах vlan2, vlan3, vlan4.
Перед запуском accel-ppp эти интерфейсы должны быть подняты.
Далее возможны два варианта: интерфейсы конфигурируются вручную (ifcfg=0), либо это делает accel-ppp (ifcfg=1)
Если делегировать эту функцию accel-ppp, то он при старте сессии будет добавлять на интерфейс адрес siaddr с маской 32 и маршрут yiaddr src siaddr.
1. локальные адреса раздаёт локальный пул

[ipoe]
mode=L2
shared=1
start=dhcpv4
ifcfg=0 или 1 (см. выше)
interface=vlan2,range=192.168.1.0/24
interface=vlan3,range=192.168.2.0/24
interface=vlan4,range=192.168.3.0/24
lua-file=/etc/accel-ppp.lua
username=lua:username

Так-же следует отметить что в качестве адреса сервера (роутера) будет выбран первый адрес из пула, т.е. 192.168.1.1 для vlan2, 192.168.2.1 для vlan3 и 192.168.3.1 для vlan4.
Клиентам будет отправлена маска /24.
2. адреса выдаёт радиус

[ipoe]
mode=L2
shared=1
start=dhcpv4
ifcfg=0 или 1 (см. выше)
interface=re:^vlan[2-4]$
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

Т.к. эти атрибуты нестандартные их нужно добавить в словарь радиус атрибутов, например так:

ATTRIBUTE DHCP-Client-IP-Address 240 ipaddr
ATTRIBUTE DHCP-Router-IP-Address 241 ipaddr
ATTRIBUTE DHCP-Mask              242 integer

3. информацию для клиента выдаёт внешний DHCP сервер

[ipoe]
mode=L2
shared=1
start=dhcpv4
ifcfg=0 или 1 (см. выше)
relay=172.16.7.8
agent-remote-id=accel-ppp
interface=vlan2,giaddr=192.168.1.1
interface=vlan3,giaddr=192.168.2.1
interface=vlan4,giaddr=192.168.3.1
lua-file=/etc/accel-ppp.lua
username=lua:username

Для каждой сессии будут создаваться псевдоинтерфейсы типа vlan2.ipoe0, vlan2.ipoe1 и т.д.
Если радиус (или локальный пул) выдаст внешний ип, то он будет назначен на этот псевдоинтерфейс и с помощью него будет осуществляться NAT.
Так-же если радиус выдаст параметры для шейпера, то он будет сконфигурирован на этом псевдоинтерфейсе.

L2-connected, старт по DHCP Discover, vlan-per-user

Возможны два варианта: ip-unnumbered, либо обычный локальный ип + NAT.
Варианты конфигурации аналогичны предыдущим, за исключением того что нужно заменить shared=0. В случае ip-unnumbered вспомогательный модуль ядра не требуется, клиенту локальный IP выдавать не нужно, нужно выдать только белый IP.
Так-же в случае ip-unnumbered можно использовать имя интерфейса в качестве имени пользователя:

[ipoe]
username=ifname

L2/L3-connected, старт по неклассифицированному пакету

В этом случае в качестве имени пользователя будет использован IP адрес отправителя пакета.
Адреса которые будут считаться неклассифицированными указываеются в local-net.

[ipoe]
mode=L2 или L3
shared=1
start=up
interface=re:^vlan[2-4]$
local-net=192.168.0.0/24
local-net=192.168.1.0/24

Гибридная конфигурация

Предусмотрена возможность установки для каждого интерфейса индивидуальных параметров.
Например, требуется на интерфейсе vlan2 использовать L2, запуск по DHCP Discover, локальный пул адресов, на vlan3 - L2, запуск по DHCP, запросы релееить на внешний сервер, на vlan4 - L3, запуск по неклассифицированному пакету:

[ipoe]
mode=L2
shared=1
start=dhcpv4
ifcfg=0 или 1 (см. выше)
lua-file=/etc/accel-ppp.lua
username=lua:username
interface=vlan2,range=192.168.1.0/24
interface=vlan3,relay=172.16.7.8,giaddr=192.168.2.1
interface=vlan4,mode=L3,start=up

L4-redirect

L4-redirect может осуществляться тремя способами:
1. через Framed-Pool (либо выдачу адреса из сети для которой будет осуществляться перенаправление)
Для этого нужно в конфиге указать специальный пул адресов, например:

[ip-pool]
172.16.16.253/23,name=l4-redirect

Задать для этой сети правило

ip rule add from 172.16.16.253/24 table l4-redirect
ip route add default via л4_сервер table l4-redirect

либо

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination л4_сервер

Таки образом для клиентов которым нужно организовать перенаправление радиус должен прислать атрибут Framed-Pool=l4-redirect, либо Framed-IP-Address с адресом из этой сети.
Так-же, в случае DHCP, имеет смысл установить небольшое время жизни сессии с помощью атрибута Session-Timeout=300 чтобы обеспечить переавторизацию.
Если DHCP не используется, то адрес можно изменить с помощью CoA.

2. с помощью специального радиус атрибута
В этом случае если в кофиге указана l4-redirect-table для клиентов будут создаваться правила

ip rule add from адрес_клиента table таблица

если в уконфиге указано l4-redirect-ipset, то адреса клиентов будут добавляться в указаный ipset список.
Для этого нужно в конфиге указать атрибут через который будет приходить информация, а так-же номер таблицы или наименование ipset списка, например:

[ipoe]
attr-l4-redirect=L4-Redirect
l4-redirect-table=100
либо
l4-redirect-ipset=l4-redirect

Т.к. этот атрибут нестандартный его нужно добавить в словарь радиус атрибутов, например так:

ATTRIBUTE L4-Redirect              242 integer

Атрибут может быть integer или string.
Для integer любое значение больше нуля считается что нужно включить l4-redirect, 0 - выключить.
Для string любая строка начинающаяся на 0, либо пустая строка - выключить, иначе включить.

3. Access-Reject от радиуса
Что-бы включить этот режим нужно указать l4-redirect-on-reject= кол-во секунд

[ipoe]
l4-redirect-on-reject=300
l4-redirect-table=100
либо
l4-redirect-ipset=l4-redirect

В этом случае если радиус ответит запретом будет создано правило

ip rule add from адрес_клиента table 100

либо адрес будет добавлен в ipset список
и удалено по истечению 300 секунд, после чего будет осуществлена повторная попытка авторизации.


PROXY ARP

proxy-arp работает следующим образом:
1. при получении запроса accel-ppp проверяет пришел ли запрос от авторизованного ип или нет
2. если запрос пришел от неавторизованного ип, то accel-ppp не отвечает
3. если от авторизованного, то проверяется наличие сессии запрашиваемого ип на интерфейсе с которого пришел запрос
4. если сессия найдена (т.е. запрашиваемый клиент находится на том-же интерфейсе и он ответит сам), то accel-ppp не отвечает
5. иначе accel-ppp отвечает мак адресом интерфейса
для корректной работы proxy-arp необходимо отлючить ядерный proxy-arp на рабочих интерфейсах


Рекомендации

MTU

Поднимать MTU необходимо, только на qinq интерфейсе(bond и входящие в него eth).Так как используется лишний тег. На саб интерфейсах с одной меткой можно не поднимать, т.к. поле vlan id и так во фрейме есть и за счет тега не растет.

Таблица ARP

При количествах сессий более 700 и при режиме DHCP v4 необходимо тюнить sysctl, а именно расширять таблицу ARP, т.к. новые ядра не пишут ругань в dmesg и происходит аномалия при параметрах по умолчанию.
net.ipv4.neigh.default.gc_thresh1 = 4096
net.ipv4.neigh.default.gc_thresh2 = 8192
net.ipv4.neigh.default.gc_thresh3 = 12288

net.ipv6.neigh.default.gc_thresh1 = 4096
net.ipv6.neigh.default.gc_thresh2 = 8192
net.ipv6.neigh.default.gc_thresh3 = 12288

ru/ipoe.txt · Последние изменения: 2019/03/08 16:03 — dimka88