Ipv6 + Radius 3 Development: відмінності між версіями

Матеріал з NoDeny
Перейти до навігації Перейти до пошуку
 
(Не показано 6 проміжних версій цього користувача)
Рядок 1: Рядок 1:
==Это процесс разработки!==
==Это процесс разработки!==
==Цель==
На dhcp-запрос по мак-адресу должны получить ipv6. Настраиваем локально радиус. Микротик в докере. С консоли делаем dhcp-запрос на интерфейс, который "слушает" микротик


==Установка Radius==
==Установка Radius==
Рядок 82: Рядок 84:


     read_groups = no
     read_groups = no
     authorize_reply_query = "call radreply('%{User-Name}', '%{NAS-IP-Address}')"
     authorize_reply_query = "call radreply('%{User-Name}')"
    accounting {
        reference = "%{tolower:type.%{Acct-Status-Type}.query}"
        type {
            start {
                query = "call radupdate('%{ERX-Dhcp-Mac-Addr}','%{Framed-IP-Address}',\
                        'nas=%{NAS-IP-Address};ses=%{Acct-Session-Id}')"
            }
            interim-update {
                query = "${..start.query}"
            }
            stop {
                query = "call radstop('%{Framed-IP-Address}', '%{NAS-IP-Address}')"
            }
        }
    }
    post-auth {
        query = "call radupdate('%{ERX-Dhcp-Mac-Addr}','%{reply:Framed-IP-Address}',\
                'nas=%{NAS-IP-Address};ses=%{Acct-Session-Id};first_response=1')"
    }
     pool {
     pool {
       start = 5
       start = 5
Рядок 113: Рядок 96:
     }
     }
}
}
</pre>
===Mysql процедуры и функции===
<pre>
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 ;
</pre>
Проверяем:
<pre>
select ipv6_by_uid(150001);
</pre>
Получаем:
<pre>
+---------------------------+
| ipv6_by_uid(150001)      |
+---------------------------+
| ffff:bbbb:0:249:f100::/56 |
+---------------------------+
</pre>
</pre>


Рядок 147: Рядок 178:
</pre>
</pre>


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


Запускаем контейнер:
Запускаем контейнер:
Рядок 164: Рядок 195:


<pre>
<pre>
/ip dhcp-server
/ipv6 dhcp-server
add disabled=no interface=ether1 name=dhcp1 use-radius=yes
add address-pool="" interface=ether1 name=dhcp1 use-radius=yes
/radius
/radius
add address=172.17.0.1 secret=hardpass5 service=dhcp
add address=172.17.0.1 secret=hardpass5 service=dhcp
Рядок 193: Рядок 224:
/ip address/print
/ip address/print
</pre>
</pre>
==Тестируем==
<source lang="bash">
freeradius -X
</source>
любому абоненту добавляем подключение с мак-ом 00:11:22:33:44:55. Проверяем ответ радиуса
<source lang="bash">
radtest 00:11:22:33:44:55 '' 127.0.0.1 0 hardpass5
</source>
Делаем dhcp запрос
<source lang="bash">
dhcp6c -d -D -f br-4eebe7136ddb
</source>

Поточна версія на 20:09, 17 березня 2024

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

Цель

На 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

Тестируем

freeradius -X

любому абоненту добавляем подключение с мак-ом 00:11:22:33:44:55. Проверяем ответ радиуса

radtest 00:11:22:33:44:55 '' 127.0.0.1 0 hardpass5

Делаем dhcp запрос

dhcp6c -d -D -f br-4eebe7136ddb