default.conf

# 指出这是FreeRADIUS 2.0.0版本开始支持的虚拟主机配置文件。
# 虚拟主机配置应放置在sites-available目录中,并通过软链接放置在sites-enabled目录中,以便正常安装。
# 如果使用802.1X (EAP)认证,还需编辑inner-tunnel虚拟服务器。
# 强调在编辑此文件前应阅读man radiusd和man unlang文档,了解调试方法和配置文件格式。
# 此配置旨在在最广泛的环境下工作,使用最广泛的认证方法,因此通常不需要对此文件进行大量修改。
# 建议管理员仔细编辑此文件,大量修改可能会导致服务器故障。应小规模修改并使用radiusd -X测试服务器。
# 有许多模块(如ldap、sql等)的引用被注释掉了,它们作为占位符。如果需要这些模块的功能,则应在radiusd.conf中配置它们,并取消此文件中对应引用的注释。

server default {
    # 如果服务器需要监听额外的地址或端口,可以使用多个"listen"部分。
    # 每个部分只让服务器监听一种数据包类型,因此认证和计费需要在不同的部分中配置。
    # 如果在命令行中使用'-i'和'-p',则服务器将忽略所有"listen"部分。
listen {
        #  要监听的数据包类型:
        #   auth    监听认证数据包
        #   acct    监听计费数据包
        #   auth+acct    同时监听认证和计费数据包
        #   proxy    用于发送代理数据包的IP
        #   detail    从detail文件读取。示例见raddb/sites-available/copy-acct-to-home-server
        #   status    监听Status-Server数据包。示例见raddb/sites-available/status
        #   coa    监听CoA-Request和Disconnect-Request数据包。示例见raddb/sites-available/coa
        type = auth

        # 要监听的IP地址。
        # ipv4addr = *
        # ipv6addr = *
        ipaddr = *

        #  要监听的端口。例如:1812
        #  0 表示 "使用/etc/services中的适当端口"
        port = 0

        # 有的系统除了支持IP地址外,还支持绑定到接口
#       interface = eth0

        # 里的名称是对radiusd.conf或clients.conf中其他部分的引用。如果使用此配置,则会忽略此“侦听”部分的全局客户端列表。有关“per_socket_clients”的配置,请参阅clients.conf。
#       clients = per_socket_clients

        # 设置默认的UDP接收缓冲区大小,一般不需要,内核设置的默认值已经满足大多数场景,特殊情况下可以设置。
#       recv_buff = 65536

        # 连接数限制,仅适用于TCP场景
        limit {
              #  限制socket上最大tcp连接数为16,若设置为0则为不限制。
              max_connections = 16

              #  TCP链接的生命周期,单位s,设置为0则是永远。
              lifetime = 0

              # TCP连接的空闲超时,以秒为单位。0表示不超时。
              idle_timeout = 30
        }
}

# 第二个listen用于监听计费
listen {
        ipaddr = *
#       ipv6addr = ::
        port = 0
        type = acct
#       interface = eth0
#       clients = per_socket_clients

        limit {
                # 计费数据包的最大速率,当超过最大速率的时候将计费报文将被丢弃。推荐将其设置为比正常计费负载多50%。0表示不限制。
#               max_pps = 0

                # 仅适用于"proto = tcp"。对于"udp"套接字,这些将被忽略。
#               idle_timeout = 0
#               lifetime = 0
#               max_connections = 0
        }
}

# IPv6的认证监听
listen {
        type = auth
        ipv6addr = ::   # any.  ::1 == localhost
        port = 0
#       interface = eth0
#       clients = per_socket_clients
        limit {
              max_connections = 16
              lifetime = 0
              idle_timeout = 30
        }
}

# IPv6的计费监听
listen {
        ipv6addr = ::
        port = 0
        type = acct
#       interface = eth0
#       clients = per_socket_clients

        limit {
#               max_pps = 0
#               idle_timeout = 0
#               lifetime = 0
#               max_connections = 0
        }
}

#  授权
#首先预处理 (hints and huntgroups files),然后是 realms, 最后在 "users" 文件中查找。
#  在这里做的任何更改也应该应用于“inner-tunnel”虚拟服务器。
#
#   realm模块的顺序将决定我们尝试找到匹配 realm的顺序。
#
#  如果需要为远程RADIUS服务器设置提示,则'preprocess'在任何realm之前加载。
authorize {
        # 检查用户名是有有效,无效将被拒绝,参见policy.d/filter中filter_username策略的定义。
        filter_username

        # 检查密码,一些nas将发送格式不标准的密码,例如User-Password = "password\000\000",将被转换为User-Password = "password"
#       filter_password

        # preprocess模块负责清理请求中的一些奇怪的属性,并将其转换为更标准属性。
        # 它负责处理'raddb/mods-config/preprocess/hints'和'raddb/mods-config/preprocess/huntgroups'文件。
        preprocess

        # 如果您打算使用CUI(客户端唯一标识),并且需要为CUI生成设置Operator-Name,并且您想为本地客户端也生成CUI,则取消下面operator-name的注释,并在clients.conf中为您的客户端设置operator-name
#       operator-name

        #
        #  If you want to generate CUI for some clients that do not
        #  send proper CUI requests, then uncomment the
        #  如果您想为一些不发送适当CUI请求的客户端生成CUI,那么取消下面cui的注释,并在clients.conf中为这些客户端设置"add_cui = yes"
#       cui

        #  如果您想记录认证请求,取消下面一行的注释。
#       auth_log

        #  chap模块将设置'Auth-Type := CHAP'
        chap

        #  mschap模块将设置'Auth-Type := MSCHAP',这将导致服务器随后使用mschap模块进行认证。
        mschap

        #  Cisco SIP服务器对接FreeRADIUS进行认证,取消下面一行的注释,以及在'authenticate'部分的'digest'行。
        digest

        #  WiMAX规范称Calling-Station-Id是6个八位位组的MAC。如果您正在使用WiMAX 2.1(LTE),取消注释将允许模块处理SQN重新同步。
#       wimax

        #  查找IPASS风格的'realm/',如果没有找到,查找'@realm',并根据此决定是否代理。
#       IPASS

        #
        # Look for realms in user@domain format
        suffix
        ntdomain

        # EAP模块:在FreeRADIUS中负责处理EAP认证的模块,支持多种EAP方法,如EAP-MD5、EAP-TLS和EAP-LEAP。
        # EAP-Type属性:EAP模块会在请求的属性列表中设置EAP-Type属性,这个属性指示了数据包中的EAP类型。
        # 返回值"ok"或"updated":EAP模块在不同情况下会返回不同的值。如果模块还没有准备好进行用户认证,它会返回"ok"或"updated"。在这种情况下,"ok"表示EAP交换尚未完成,而"updated"表示EAP交换已经更新了请求但还没有完成。
        # 停止处理"authorize"部分:如果EAP模块返回"ok",配置文件中的指令会停止进一步处理"authorize"部分。这意味着在EAP认证过程完成之前,不会执行任何后续的授权检查。
        # 不查询LDAP和/或SQL服务器:在TTLS(隧道传输层安全)或PEAP(受保护的EAP)的初始设置阶段,不会对LDAP(轻量级目录访问协议)和/或SQL(结构化查询语言)服务器进行查询。
        # 注释掉的"updated"检查:原始配置中"updated = return"这一行被注释掉了,这是为了与旧版本的配置兼容。如果取消注释,当EAP模块返回"updated"时,也会停止处理"authorize"部分。这可以减少在TTLS或PEAP认证过程中对LDAP和/或SQL服务器的查询次数。
        eap {
                ok = return
#               updated = return
        }

        # 使用存储在/etc/passwd或/etc/shadow中的加密密码
#       unix

        #  读取'users'文件。在v3中,它位于raddb/mods-config/files/authorize文件中
#       files

        # 从数据库中查询用户,参见mods-available/sql中的"Authorization Queries"
        sql

        #  如果您正在使用/etc/smbpasswd,并且还正在进行mschap认证,取消下面一行的注释,并配置'smbpasswd'模块。
#       smbpasswd

        # ldap模块从LDAP数据库中读取密码。
        -ldap

        # 如果您正在使用活动目录和PAP,则取消下面几行的注释,这将允许您对AD进行PAP认证。
#       if ((ok || updated) && User-Password && !control:Auth-Type) {
#               update control {
#                       &Auth-Type := ldap
#               }
#       }

        #
        #  强制执行每天登录时间的限制。
#       daily

        #
        expiration
        logintime

        # 如果没有其他模块声称负责认证,则尝试使用PAP。这个模块应该列在最后,以便其他模块有机会为自己设置Auth-Type。
        pap

        # 如果"status_server = yes",则Status-Server消息将通过以下部分传递,并且仅通过以下部分传递。
#       Autz-Type Status-Server {
#
#       }

        # RADIUS/TLS(或RadSec)连接通过本节处理。有关更多信息,请参见sites-available/tls和配置项"check_client_connections"。如果本节返回"ok"或"updated",则接受连接。否则,终止连接。
        Autz-Type New-TLS-Connection {
                  ok
        }
}

# 通常,您不应设置Auth-Type属性。服务器将自行弄清楚,并会做正确的事情。手动设置Auth-Type属性的常见原因是强制拒绝用户(Auth-Type := Reject),或强制接受用户(Auth-Type := Accept)。
authenticate {
        #  当'authorize'部分中列出的后端数据库提供密码时,进行PAP认证。
        Auth-Type PAP {
                pap
        }

        #  大多数人想要CHAP认证
        #  'authorize'部分中列出的后端数据库必须提供明文密码。加密密码不会起作用。
        Auth-Type CHAP {
                chap
        }

        #
        #  MSCHAP authentication.
        Auth-Type MS-CHAP {
                mschap
        }

        #  对于旧名称也是如此。
        mschap

        #  Cisco SIP服务器对接FreeRADIUS进行认证,取消下面一行的注释,以及在'authenticate'部分的'digest'行。
        digest

        #
        #  可插拔认证模块。
#       pam

        # 如果您想使用ldap进行认证,请取消下面一行的注释。
#       Auth-Type LDAP {
#               ldap
#       }

        #  允许EAP认证。
        eap

        # 旧的配置在Access-Challenge数据包中发送了一些属性,这在严格意义上是不正确的。如果您想过滤掉这些属性,请取消下面几行的注释。
#       Auth-Type eap {
#               eap {
#                       handled = 1
#               }
#               if (handled && (Response-Packet-Type == Access-Challenge)) {
#                       attr_filter.access_challenge.post-auth
#                       handled  # override the "updated" code from attr_filter
#               }
#       }
}


#  预计费。决定使用哪种计费类型。
preacct {
        preprocess

        #将Acct-[Input|Output]-Gigawords和Acct-[Input-Output]-Octets合并为单个64位计数器Acct-[Input|Output]-Octets64。
#       acct_counters64

        # NAS从不发送"开始时间"。相反,它发送一个开始数据包,*可能*带有Acct-Delay-Time。服务器应该得出结论,开始时间是"Acct-Delay-Time"秒前。开始时间是:NOW - delay - session_length
#       update request {
#               &FreeRADIUS-Acct-Session-Start-Time = "%{expr: %l - %{%{Acct-Session-Time}:-0} - %{%{Acct-Delay-Time}:-0}}"
#       }

        #  确保会话的唯一性
        acct_unique

        #  查找IPASS风格的'realm/',如果没有找到,查找'@realm',并根据此决定是否代理。
#       IPASS
        suffix
#       ntdomain

        #
        # 读取'acct_users'文件
        files
}

#
#  计费,记录计费数据
#
accounting {
        #  通过添加CUI属性更新计费数据包,仅在NAS本身不支持CUI时使用
#       cui

        #   创建数据包的"详细"日志。代理的计费请求也记录在详细文件中。
        detail
#       daily

        #  更新wtmp文件,如果您不使用"radlast",则可以删除此行。
        unix

        # FreeRADIUS提供了用于跟踪用户会话以防止同时登录的模块,但是由于网络中可能发生的数据包丢失,这些跟踪数据可能不完全准确。如果你想要启用会话跟踪功能,你需要去掉radutmp或sradutmp前面的注释符号#
#       radutmp  # 是一个传统的会话跟踪模块。
#       sradutmp  # 是一个会话跟踪模块,它使用更安全的方法来存储会话状态,以抵抗某些类型的网络攻击。

        #  sqlippool是FreeRADIUS中的一个模块,用于管理SQL数据库中的IP地址池。它负责在会话开始时分配IP地址,以及在会话结束时将IP地址返还回池中。
#       sqlippool

        # 使用sql模块将流量记录到SQL数据库中。如果你想查看或修改用于记录流量的SQL查询语句,你应该参考mods-available/sql目录下的相应模块配置文件。
        -sql

        # 如果您收到具有零会话长度的停止数据包,它们将不会被记录在数据库中。SQL模块将打印一条消息(仅在调试模式下),并将返回"noop"。
        # 您可以通过取消下面三行注释来忽略这些数据包。否则,服务器将不会响应会计请求,NAS将重新传输。
#       if (noop) {
#               ok
#       }

        #  Cisco VoIP特定的批量会计
#       pgsql-voip

        # For Exec-Program and Exec-Program-Wait
        exec

        #  从计费响应中过滤属性。
        attr_filter.accounting_response

        #  参见"Autz-Type Status-Server"了解此功能的工作原理。
#       Acct-Type Status-Server {
#
#       }
}


# FreeRADIUS提供了两种不同的模块来处理会话数据库和同时使用检查:radutmp和rlm_sql。注释中提到rlm_sql模块在性能上要快得多,因此推荐使用rlm_sql模块而不是radutmp。
session {
#       radutmp

        #  See "Simultaneous Use Checking Queries" in mods-available/sql
#       sql
}


#  认证后
post-auth {
        # 如果您的网络策略需要在后续的CoA-Request中使用State属性,或者您想要设置Service-Type为Authorize-Only,您可以取消注释并启用下面的配置块。这样做将会在回复消息中添加一个随机生成的State属性,该属性随后可以被用来标识特定的会话,以便进行动态授权更改
#       if (!&reply:State) {
#               update reply {
#                       State := "0x%{randstr:16h}"
#               }
#       }

        #  通常User-Name == EAP Identity == TLS-Client-Cert-Common-Name
        # 拒绝User-Name != TLS-Client-Cert-Common-Name的数据包,如果启用了verify_tls_client_common_name模块,FreeRADIUS服务器将检查传入的RADIUS请求中的User-Name属性,确保它与客户端TLS证书中的Common Name一致。如果不一致,服务器将拒绝该请求。
#       verify_tls_client_common_name

        # 如果用户认证的radius报文中缺少Stripped-User-Name,将使用证书中的名称作为Stripped-User-Name,服务器还将创建一个包含多个属性值的MD5哈希的Class属性,并将其添加到回复消息中。这些属性包括客户端证书的详细信息和NAS(网络访问服务器)的信息。
#       if (&EAP-Message && !&Stripped-User-Name && &TLS-Client-Cert-Serial) {
#               update request {
#                       &Stripped-User-Name := "%{%{TLS-Client-Cert-Subject-Alt-Name-Email}:-%{%{TLS-Client-Cert-Common-Name}:-%{TLS-Client-Cert-Serial}}}"
#               }
#
#               update reply {
#                       Class += "%{md5:%{Calling-Station-Id}%{Called-Station-Id}%{TLS-Client-Cert-Subject-Alt-Name-Email}%{TLS-Client-Cert-Common-Name}%{TLS-Client-Cert-Serial}%{NAS-IPv6-Address}%{NAS-IP-Address}%{NAS-Identifier}%{NAS-Port}"
#               }
#
#       }

        # 在EAP-TTLS或PEAP认证过程中,会缓存部分数据,等认证完成之后就会自动删除,为了避免在回复消息中重复包含User-Name属性,配置中包含了一个条件语句,它会检查reply和request中是否有相同的User-Name属性,如果有,它会从reply中移除这个属性。最后,使用update指令将session-state中的所有属性追加到回复消息中

        if (session-state:User-Name && reply:User-Name && request:User-Name && (reply:User-Name == request:User-Name)) {
                update reply {
                        &User-Name !* ANY
                }
        }
        update {
                &reply: += &session-state:
        }

        #  当收到开始或者更新报文的时候将会刷新地址租约,收到停止报文的时候就回收地址,若启用就取消掉下面的注释
#       sqlippool

        #  创建CUI值并将属性添加到Access-Accept。
#       cui

        #  在用户认证成功后,但在实际网络计费开始之前,创建一个不包含任何网络使用数据的计费会话记录。这可以用于初始化会话跟踪,同时确保在网络会话的整个生命周期中,计费信息的记录是连续和完整的。
#       sql_session_start

        #  如果您想记录认证回复日志,取消下面一行的注释,并启用'detail reply_log'模块。
#       reply_log

        #  用户认证之后,再执行一次SQL查询。参见mods-available/sql中的"Authentication Logging Queries"
        -sql

        # 在成功登录后修改用户在LDAP中的对象。
#       ldap

        # For Exec-Program and Exec-Program-Wait
        exec

        # 启用wimax
#       wimax

        # 在处理EAP-TLS、PEAP和TTLS认证时,服务器可以在证书验证后更新一系列与证书相关的属性,并将这些属性添加到回复消息中
#       update reply {
#              Reply-Message += "%{TLS-Cert-Serial}"
#              Reply-Message += "%{TLS-Cert-Expiration}"
#              Reply-Message += "%{TLS-Cert-Subject}"
#              Reply-Message += "%{TLS-Cert-Issuer}"
#              Reply-Message += "%{TLS-Cert-Common-Name}"
#              Reply-Message += "%{TLS-Cert-Subject-Alt-Name-Email}"
#
#              Reply-Message += "%{TLS-Client-Cert-Serial}"
#              Reply-Message += "%{TLS-Client-Cert-Expiration}"
#              Reply-Message += "%{TLS-Client-Cert-Subject}"
#              Reply-Message += "%{TLS-Client-Cert-Issuer}"
#              Reply-Message += "%{TLS-Client-Cert-Common-Name}"
#              Reply-Message += "%{TLS-Client-Cert-Subject-Alt-Name-Email}"
#       }

        #  启用该指令,FreeRADIUS服务器将在每次认证响应中插入一个包含唯一值的Class属性,这有助于确保Acct-Session-Id的唯一性,并提高会话匹配的准确性。不过,为了使这个功能正常工作,你的NAS设备需要支持RFC 2865中定义的Class属性行为,并且能够处理长类属性。
#       insert_acct_class

        #  MacSEC需要使用EAP-Key-Name。EAP模块将所需数据放入EAP-Session-Id属性中。这个属性从不放入请求或响应数据包中。取消下面几行注释可以将所需数据复制到EAP-Key-Name属性中
#       if (&reply:EAP-Session-Id) {
#               update reply {
#                       EAP-Key-Name := &reply:EAP-Session-Id
#               }
#       }

        #  如果你希望FreeRADIUS服务器在发送包含EAP-Message属性的响应时不包含任何额外的文本消息,你可以通过取消注释来启用remove_reply_message_if_eap指令。这样做可以确保在EAP认证过程中,只有EAP相关的信息被传输,而不会有额外的文本消息干扰。
        remove_reply_message_if_eap

        # 在处理被拒绝的认证请求时,服务器会通过REJECT子部分定义的逻辑来构造Access-Reject响应。在这个过程中,服务器可能会记录失败的认证尝试到SQL数据库,应用属性过滤器,插入EAP-Failure消息,并在必要时移除Reply-Message属性。这些操作有助于提供更多关于认证失败的信息,同时保持响应的整洁和清晰。
        Post-Auth-Type REJECT {
                -sql
                attr_filter.access_reject
                eap
                remove_reply_message_if_eap
        }

        # 处理Access-Challenge响应时,可以通过特定的配置来过滤包含在响应中的属性
        Post-Auth-Type Challenge {
#               remove_reply_message_if_eap
#               attr_filter.access_challenge.post-auth
        }

        #当客户端在EAP协商过程中停止响应时,FreeRADIUS服务器将执行Client-Lost部分的配置。这可以用于记录和调试EAP协商问题,尤其是当客户端因为某些原因(如证书不可接受)而停止响应时。在这种情况下,只有会话状态列表中的属性是可用的,因为原始的请求属性已经不可用。如果你想要调试信息,你需要取消注释并启用相关的调试指令。此外,如果客户端请求中包含了EAP-Key-Name,FreeRADIUS可以将其值回显到回复中。
        Post-Auth-Type Client-Lost {
                # 调试EAP协商期间执行的所有TLS状态变化。
#               %{debug_attr:&session-state:TLS-Session-Information[*]}

                # 调试EAP协商期间执行的最后一个TLS状态变化。对于错误,这通常是来自客户端的TLS警报
#               %{debug_attr:&session-state:TLS-Session-Information[n]}

                # 调试最后一次模块失败消息。
#               %{debug_attr:&session-state:Module-Failure-Message}
        }

        # 如果客户端在请求中发送了EAP-Key-Name,那么在回复中回显实际值。
        if (EAP-Key-Name && &reply:EAP-Session-Id) {
                update reply {
                        &EAP-Key-Name := &reply:EAP-Session-Id
                }
        }
}

# 当服务器决定将请求代理到主服务器时,被代理的请求首先通过预代理阶段。在这个阶段可以重写请求,或决定取消代理。
pre-proxy {
        # 在代理请求之前添加一个Operator-Name属性,以标识是否为此客户端找到了operator-name。如果您已经在authorize部分启用了此功能,则无需取消注释。
#       operator-name

        #   客户端通过发送包含一个零字节的CUI属性来请求CUI。
#       cui

        #  如果您想根据preproxy_users文件中定义的规则更改属性,请取消下面一行的注释。
#       files

        #  如果您想根据'attrs.pre-proxy'文件中定义的规则过滤发送到远程服务器的请求,请取消下面一行的注释。
#       attr_filter.pre-proxy

        #  如果您想记录代理到主服务器的数据包,请取消下面一行的注释,并取消上面'detail pre_proxy_log'部分的注释。
#       pre_proxy_log
}

# 当服务器接收到它代理到主服务器的请求的回复时,请求可能在后代理阶段这里被处理。
post-proxy {
        #  如果您想记录来自主服务器的回复,请取消下面一行的注释,并取消上面'post_proxy_log'部分的注释。
#       post_proxy_log

        #  如果您想根据'attrs'文件中定义的规则过滤来自远程代理的回复,请取消下面一行的注释。
#       attr_filter.post-proxy

        # 如果您正在代理LEAP,您必须配置EAP模块,并且必须在后代理阶段列出它。您还必须在'realm'配置中使用'nostrip'选项。
        # 否则,代理请求中的User-Name属性将不匹配隐藏在EAP数据包中的用户名,并且最终服务器将拒绝EAP请求。
        eap

        # 如果FreeRADIUS服务器在尝试代理会计数据包时失败,服务器将启用一系列备用处理措施。这些措施包括将会计数据包记录到本地的detail文件中,以便在主服务器恢复后可以重新发送这些数据包。同时,服务器会向NAS发送响应,以确保网络的连续性。
#       Post-Proxy-Type Fail-Accounting {
#               detail.example.com
                # 确保现在向NAS发送响应,因为数据包已被写入detail文件。 
#               acct_response
#       }
}
}

  

posted on 2024-04-29 21:11  torotoise512  阅读(23)  评论(0)    收藏  举报