Ipv6 + Radius 3 Development

Матеріал з NoDeny
Перейти до навігації Перейти до пошуку

Это процесс разработки!

Цель

На dhcp-запрос по мак-адресу должны получить ipv6. Настраиваем локально радиус. Микротик в докере. С консоли делаем dhcp-запрос на интерфейс, который "слушает" микротик

Установка Radius

apt install freeradius-mysql
rm /etc/freeradius/3.0/sites-enabled/default
cp /usr/local/nodeny/etc/raddb/clients.conf /etc/freeradius/3.0/

Конфигурирование

nano /etc/freeradius/3.0/sites-enabled/nodeny

Вставляем следующий текст:

server default {
    listen {
        type = auth
        ipaddr = *
        port = 1812
    }
    listen {
        type = acct
        ipaddr = *
        port = 0
    }
    authorize {
        sql
        update control {
          Auth-Type := Accept
        }
    }
    authenticate {
    }
    preacct {
        acct_unique
        preprocess
    }
    accounting {
        sql
    }
    session {
        radutmp
        sql
    }
    post-auth {
        sql
    }
    Post-Auth-Type ACCEPT {
        sql
    }
}

Sql конфиг

В консоли:

nano /etc/freeradius/3.0/mods-enabled/sql

Вставляем следующий текст:

sql {
    driver = "rlm_sql_mysql"
    mysql {
        warnings = auto
    }
    server = "localhost"
    port = 3306
    login = "nodeny"
    password = "hardpass"
    radius_db = "nodeny"

    read_groups = no
    authorize_reply_query = "call radreply('%{User-Name}')"
    pool {
      start = 5
      min = 5
      max = 130
      spare = 30
      uses = 0
      retry_delay = 30
      lifetime = 0
      idle_timeout = 60
    }
}

Mysql процедуры и функции

DROP FUNCTION IF EXISTS `ipv6_by_uid`;
DELIMITER $$
CREATE FUNCTION ipv6_by_uid(uid INT) RETURNS VARCHAR(32)
    DETERMINISTIC
BEGIN
    DECLARE netmask INT DEFAULT 56;
    RETURN CONCAT(INET6_NTOA(
        INET6_ATON('FFFF:BBBB::') | 
        (
          INET6_ATON(CONCAT('::', HEX(MOD(uid, 65536)))) |
         (INET6_ATON(CONCAT('::', HEX(ROUND(uid / 65536)))) << 16)
        ) << netmask
    ), '/', netmask);
END$$
DELIMITER ;


DROP PROCEDURE IF EXISTS `radreply`;
DELIMITER $$
CREATE PROCEDURE `radreply`(IN login VARCHAR(64))
BEGIN
    DECLARE usr_mac VARCHAR(12);
    DECLARE usr_ip VARCHAR(32);
    DECLARE usr_id INT;
    SELECT REPLACE(login, ':', '') INTO usr_mac;
    SELECT uid INTO usr_id FROM mac_uid WHERE mac=usr_mac;
    SELECT ipv6_by_uid(usr_id) INTO usr_ip;
    SELECT NULL, login, 'Framed-IPv6-Prefix', usr_ip, '=';
END$$
DELIMITER ;

Проверяем:

select ipv6_by_uid(150001);

Получаем:

+---------------------------+
| ipv6_by_uid(150001)       |
+---------------------------+
| ffff:bbbb:0:249:f100::/56 |
+---------------------------+

Докер Микротика

docker pull hossein3piol/mikrotik-routeros
nano docker-compose.yml

Вставляем:

version: '3.9'

services:
   routers:
       container_name: "mikrotik"
       image: hossein3piol/mikrotik-routeros:latest
       privileged: true
       ports:
           - "2222:22"    # ssh
           - "8888:80"    # http
           - "8291:8291"  # winbox
       cap_add:
           - NET_ADMIN
       devices:
           - /dev/net/tun
       extra_hosts:
           - "host.docker.internal:host-gateway"

В конфиге проброс на хостовую машину портов 22, 80 и 8291. host.docker.internal:host-gateway - добавдяем в днс хостовую машину (не сработало, придется по ip)

Запускаем контейнер:

docker-compose up

Первый запуск был очень долгим. Коннектимся:

ssh admin@172.17.0.1 -p 2222

По умолчанию пароль пустой

/ipv6 dhcp-server
add address-pool="" interface=ether1 name=dhcp1 use-radius=yes
/radius
add address=172.17.0.1 secret=hardpass5 service=dhcp

На хостовой машине добавим в радиус микротик:

nano /etc/freeradius/3.0/clients.conf
client 172.19.0.2 {
        secret      = hardpass5
        shortname   = NoDenyDB
        nastype     = cisco
}

172.19.0.2 - ip микротика, почему именно такой пока не знаю. Кстати, я его получил из лога freeradius:

Ignoring request to acct address * port 1813 bound to server default from unknown client 172.19.0.2 port 40012 proto udp

А в микротике:

/ip address/print