Freeradius:根据Nas-IP地址将用户分配给用户

我想知道有没有人可以帮助我。

目标是根据他们连接的AP为不同的用户分配不同的IP地址。 我不能静态设置,因为用户将旅行,并通过不同的ap结束连接。

所以我想做一个检查,看看我是否可以匹配nas ip,然后将该用户分配给一个组,然后该组将分配正确的IP池。

我已经做了相当多的研究,它似乎像将其添加到radgroupcheck表一样简单。 像这样:

id | groupname | attribute | value | op ----+-----------+----------------+------------+---- 1 | Group1 | Nas-IP-Address | xxxx | == 4 | Group1 | Pool-Name | POOL1 | := 

然而在半径-X我甚至没有看到它试图检查组。

它似乎检查radusergroup表,但没有任何内容,因为我需要根据位置dynamic设置用户组。

任何帮助,将不胜感激。

谢谢

我想你应该可以使用NAS Huntgroups来做你想做的事情,

以下例子,创build表格:

 CREATE TABLE radhuntgroup ( id int(11) unsigned NOT NULL auto_increment, groupname varchar(64) NOT NULL default '', nasipaddress varchar(15) NOT NULL default '', nasportid varchar(15) default NULL, PRIMARY KEY (id), KEY nasipaddress (nasipaddress) ) ; 

添加您的NAS地址:

INSERT INTO radhuntgroup (groupname,nasipaddress)VALUES(“Nas_1”,“192.168.0.10”); INSERT INTO radhuntgroup (groupname,nasipaddress)VALUES(“Nas_2”,“192.168.1.10”);

然后在authorize {}部分中添加以下代码:

{Huntgroup-Name:=“%{sql:SELECT groupname FROM radhuntgroup WHERE nasipaddress ='%{NAS-IP-Address}'}”}

然后,您可以在radgroupcheck表中添加行来检查其他值(如果需要),或者只是在radgroupreply表中可以为其指定特定的池。

NickW的答案应该在理论上起作用。 然而,由于某种原因,它使用radtest工作,但失败时,我通过APauthentication。 我正在使用EAP,所以wpa2-enterpise带签名的证书。 (我遵循这个指南 ,请注意,即时通讯使用不是Ubuntu的Centos服务器)

我结束了进入我的网站启用/默认,在post-auth部分我在我的sqlippool之前添加这个。

 update control { Pool-Name := "%{sql:select value from radgroupcheck left join radhuntgroup on (radhuntgroup.groupname=radgroupcheck.groupname) where radhuntgroup.nasipaddress ='%{NAS-IP-Address}'}" } 

我的表格布局是标准的,我添加了radhuntgroup作为由NickW消化,然后匹配到我的radgroupcheck表,就像这样

radhuntgroup:

  id | groupname | nasipaddress | nasportid ----+--------------+--------------+----------- 1 | South Africa | 10.xx.xx.xx | 2 | Mozambique | 10.xx.xx.xx | 

radgroupcheck:

  id | groupname | attribute | op | value ----+--------------+-----------+----+------------ 4 | South Africa | Pool-Name | := | ZA_IP_POOL 7 | Mozambique | Pool-Name | := | MZ_IP_POOL 

所以在我的半径-X的结果如下

 # Executing section post-auth from file /etc/raddb/sites-enabled/default +- entering group post-auth {...} sql_xlat expand: %{User-Name} -> robert@test sql_set_user escaped user --> 'robert@test' expand: select value from radgroupcheck left join radhuntgroup on (radhuntgroup.groupname=radgroupcheck.groupname) where radhuntgroup.nasipaddress ='%{NAS-IP-Address}' -> select value from radgroupcheck left join radhuntgroup on (radhuntgroup.groupname=radgroupcheck.groupname) where radhuntgroup.nasipaddress ='10.53.0.7' expand: /var/log/radius/sqltrace.sql -> /var/log/radius/sqltrace.sql rlm_sql (sql): Reserving sql socket id: 4 rlm_sql_postgresql: query: select value from radgroupcheck left join radhuntgroup on (radhuntgroup.groupname=radgroupcheck.groupname) where radhuntgroup.nasipaddress ='10.53.0.7' rlm_sql_postgresql: Status: PGRES_TUPLES_OK rlm_sql_postgresql: query affected rows = 1 , fields = 1 sql_xlat finished rlm_sql (sql): Released sql socket id: 4 expand: %{sql:select value from radgroupcheck left join radhuntgroup on (radhuntgroup.groupname=radgroupcheck.groupname) where radhuntgroup.nasipaddress ='%{NAS-IP-Address}'} -> ZA_IP_POOL ++[control] returns noop rlm_sql (sql): Reserving sql socket id: 3 [sqlippool] expand: %{User-Name} -> robert@test [sqlippool] sql_set_user escaped user --> 'robert@test' [sqlippool] expand: START TRANSACTION -> START TRANSACTION rlm_sql_postgresql: query: START TRANSACTION rlm_sql_postgresql: Status: PGRES_COMMAND_OK rlm_sql_postgresql: query affected rows = 0 [sqlippool] expand: UPDATE radippool SET nasipaddress = '', pool_key = 0, callingstationid = '', expiry_time = 'now'::timestamp(0) - '1 second'::interval WHERE nasipaddress = '%{NAS-IP-Address}' AND pool_key = '%{NAS-Port}' -> UPDATE radippool SET nasipaddress = '', pool_key = 0, callingstationid = '', expiry_time = 'now'::timestamp(0) - '1 second'::interval WHERE nasipaddress = '10.53.0.7' AND pool_key = '' rlm_sql_postgresql: query: UPDATE radippool SET nasipaddress = '', pool_key = 0, callingstationid = '', expiry_time = 'now'::timestamp(0) - '1 second'::interval WHERE nasipaddress = '10.53.0.7' AND pool_key = '' rlm_sql_postgresql: Status: PGRES_COMMAND_OK rlm_sql_postgresql: query affected rows = 1 [sqlippool] expand: SELECT framedipaddress FROM radippool WHERE pool_name = '%{control:Pool-Name}' AND expiry_time < 'now'::timestamp(0) ORDER BY (username <> '%{SQL-User-Name}'), (callingstationid <> '%{Calling-Station-Id}'), expiry_time LIMIT 1 FOR UPDATE -> SELECT framedipaddress FROM radippool WHERE pool_name = 'ZA_IP_POOL' AND expiry_time < 'now'::timestamp(0) ORDER BY (username <> 'robert@test'), (callingstationid <> '38-AA-3C-5E-7E-40'), expiry_time LIMIT 1 FOR UPDATE rlm_sql_postgresql: query: SELECT framedipaddress FROM radippool WHERE pool_name = 'ZA_IP_POOL' AND expiry_time < 'now'::timestamp(0) ORDER BY (username <> 'robert@test'), (callingstationid <> '38-AA-3C-5E-7E-40'), expiry_time LIMIT 1 FOR UPDATE rlm_sql_postgresql: Status: PGRES_TUPLES_OK rlm_sql_postgresql: query affected rows = 1 , fields = 1 [sqlippool] expand: UPDATE radippool SET nasipaddress = '%{NAS-IP-Address}', pool_key = '%{NAS-Port}', callingstationid = '%{Calling-Station-Id}', username = '%{SQL-User-Name}', expiry_time = 'now'::timestamp(0) + '18000 second'::interval WHERE framedipaddress = '10.53.0.111' -> UPDATE radippool SET nasipaddress = '10.53.0.7', pool_key = '', callingstationid = '38-AA-3C-5E-7E-40', username = 'robert@test', expiry_time = 'now'::timestamp(0) + '18000 second'::interval WHERE framedipaddress = '10.53.0.111' rlm_sql_postgresql: query: UPDATE radippool SET nasipaddress = '10.53.0.7', pool_key = '', callingstationid = '38-AA-3C-5E-7E-40', username = 'robert@test', expiry_time = 'now'::timestamp(0) + '18000 second'::interval WHERE framedipaddress = '10.53.0.111' rlm_sql_postgresql: Status: PGRES_COMMAND_OK rlm_sql_postgresql: query affected rows = 1 [sqlippool] Allocated IP 10.53.0.111 [6f00350a] [sqlippool] expand: COMMIT -> COMMIT 

我希望这个信息可以帮助别人经历同样的斗争,我经历了。