ติดตั้งและทดสอบ FreeRADIUS เบื้องต้น

FreeRADIUS เป็นโปรแกรมที่ทำหน้าที่ RADIUS แบบฟรี ที่คนใช้งานกันมากที่สุด โดยมีคุณสมบัติเทียบเท่ากับ commercial RADIUS หลายๆ ตัว

บทความนี้จะกล่าวถึงวิธีการติดตั้ง และทดสอบ FreeRADIUS ในเบื้องต้น เพื่อจะสามารถต่อยอด และคอนฟิกอื่นๆ เพิ่มเติมได้


ติดตั้งไฟล์ rpm

ในที่นี้จะทดสอบบน Fedora 11 (x86_64) โดยใช้ไฟล์ rpm ในส่วน updates เพื่อติดตั้งและใช้งาน

ใช้คำสั่ง rpm เพื่อติดตั้งไฟล์ ต่างๆ ดังนี้

[root@fc11-64a ~]# rpm -i freeradius-libs-2.1.7-1.fc11.x86_64.rpm
[root@fc11-64a ~]# rpm -i freeradius-2.1.7-1.fc11.x86_64.rpm
[root@fc11-64a ~]# rpm -i freeradius-utils-2.1.7-1.fc11.x86_64.rpm

หมายเหตุ การติดตั้ง freeradius-utils จำเป็นต้องมี perl(DBI) ติดตั้งอยู่ก่อนแล้ว

ตัวอย่าง error หากไม่มี perl(DBI) ติดตั้งอยู่

[root@fc11-64a ~]# rpm -i freeradius-utils-2.1.7-1.fc11.x86_64.rpm
error: Failed dependencies:
        perl(DBI) is needed by freeradius-utils-2.1.7-1.fc11.x86_64

วิธีการแก้ไขปัญหา

[root@fc11-64a ~]# rpm -i perl-DBI-1.607-2.fc11.x86_64.rpm

รันเซอร์วิส radiusd

หลังจากการติดตั้ง ใช้คำสั่ง service เพื่อรันเซอร์วิส radiusd

[root@fc11-64a ~]# service radiusd start
Starting RADIUS server:                                    [FAILED]

หากยังไม่แก้ไขไฟล์คอนฟิกเลย จะไม่สามารถรันเซอร์วิส radiusd ได้ ขึ้น [FAILED]

เมื่อเกิดปัญหาในการใช้งาน radiusd ไฟล์หนึ่งที่สามารถตรวจสอบปัญหาได้คือไฟล์ /var/log/radius/radius.log

[root@fc11-64a ~]# tail /var/log/radius/radius.log
Sat Nov 28 12:15:09 2009 : Error: rlm_eap: SSL error error:02001002:system library:fopen:No such file or directory
Sat Nov 28 12:15:09 2009 : Error: rlm_eap_tls: Error reading certificate file /etc/raddb/certs/server.pem
Sat Nov 28 12:15:09 2009 : Error: rlm_eap: Failed to initialize type tls
Sat Nov 28 12:15:09 2009 : Error: /etc/raddb/eap.conf[17]: Instantiation failed for module "eap"
Sat Nov 28 12:15:09 2009 : Error: /etc/raddb/sites-enabled/inner-tunnel[223]: Failed to find module "eap".
Sat Nov 28 12:15:09 2009 : Error: /etc/raddb/sites-enabled/inner-tunnel[176]: Errors parsing authenticate section.
Sat Nov 28 12:15:09 2009 : Error: Failed to load virtual server inner-tunnel

ปัญหานี้คือไม่มีไฟล์ /etc/raddb/certs/server.pem ซึ่งเป็น certificate สำหรับการทำ EAP

วิธีการแก้ไขคือสร้างไฟล์ server.pem โดยเข้าไปในไดเร็คทอรี /etc/raddb/certs/ แล้วรันคำสั่ง bootstrap ซึ่งจะสร้างไฟล์ certificate ขึ้นมา

หมายเหตุ เพื่อความง่าย ในที่นี้จะสร้าง certificate ไฟล์ เพื่อทดสอบการใช้งาน radiusd เท่านั้น ในการใช้งานจริงก่อนที่จะสร้าง ควรจะแก้ไขคอนฟิก เพื่อระบุ Certificate Details เพื่อแสดงชื่อหน่วยงานให้ถูกต้อง

[root@fc11-64a ~]# cd /etc/raddb/certs/
[root@fc11-64a certs]# ./bootstrap
openssl dhparam -out dh 1024
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
.................+......................................................................................................+...+.........+.....+.......................+...................................................................................................+......................................+........................................................................................................+.................................................................+....................+...................................................................................+...................+.......................................+............................................................................+..........................................+.............+....................................+..............................................+...+.....................+...+.....+...............+.............................+..................+...................................................+.....+.................+............................................+.......+................................................................................................+....+.....+............................................................................................................................................................................................................................................+......................+........................................................................................................................................................................................................................................+............+............................+..................+.............................................................................................................................+.....................................................++*++*++*
openssl req -new  -out server.csr -keyout server.key -config ./server.cnf
Generating a 2048 bit RSA private key
.......................+++
.....+++
writing new private key to 'server.key'
-----
openssl req -new -x509 -keyout ca.key -out ca.pem \
                -days `grep default_days ca.cnf | sed 's/.*=//;s/^ *//'` -config ./ca.cnf
Generating a 2048 bit RSA private key
....................................+++
........+++
writing new private key to 'ca.key'
-----
openssl ca -batch -keyfile ca.key -cert ca.pem -in server.csr  -key `grep output_password ca.cnf | sed 's/.*=//;s/^ *//'` -out server.crt -extensions xpserver_ext -extfile xpextensions -config ./server.cnf
Using configuration from ./server.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Nov 28 05:20:32 2009 GMT
            Not After : Nov 28 05:20:32 2010 GMT
        Subject:
            countryName               = FR
            stateOrProvinceName       = Radius
            organizationName          = Example Inc.
            commonName                = Example Server Certificate
            emailAddress              = admin@example.com
        X509v3 extensions:
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
Certificate is to be certified until Nov 28 05:20:32 2010 GMT (365 days)
Write out database with 1 new entries
Data Base Updated
openssl pkcs12 -export -in server.crt -inkey server.key -out server.p12  -passin pass:`grep output_password server.cnf | sed 's/.*=//;s/^ *//'` -passout pass:`grep output_password server.cnf | sed 's/.*=//;s/^ *//'`
openssl pkcs12 -in server.p12 -out server.pem -passin pass:`grep output_password server.cnf | sed 's/.*=//;s/^ *//'` -passout pass:`grep output_password server.cnf | sed 's/.*=//;s/^ *//'`
MAC verified OK
openssl x509 -inform PEM -outform DER -in ca.pem -out ca.der

หลังจากสร้างแล้ว ใช้คำสั่ง service เพื่อรันเซอร์วิส radiusd อีกครั้ง

[root@fc11-64a certs]# service radiusd start
Starting RADIUS server:                                    [FAILED]

รันครั้งนี้ ก็ยัง [FAILED] อยู่ ถ้าตรวจสอบดูไฟล์ radius.log มีข้อความ “Permission denied” ขึ้น ซึ่งหมายถึง radiusd ไม่สามารถอ่านไฟล์ server.pem ได้

[root@fc11-64a ~]# tail /var/log/radius/radius.log
...
Sat Nov 28 12:21:38 2009 : Error: rlm_eap: SSL error error:0200100D:system library:fopen:Permission denied
Sat Nov 28 12:21:38 2009 : Error: rlm_eap_tls: Error reading certificate file /etc/raddb/certs/server.pem
Sat Nov 28 12:21:38 2009 : Error: rlm_eap: Failed to initialize type tls
Sat Nov 28 12:21:38 2009 : Error: /etc/raddb/eap.conf[17]: Instantiation failed for module "eap"
Sat Nov 28 12:21:38 2009 : Error: /etc/raddb/sites-enabled/inner-tunnel[223]: Failed to find module "eap".
Sat Nov 28 12:21:38 2009 : Error: /etc/raddb/sites-enabled/inner-tunnel[176]: Errors parsing authenticate section.
Sat Nov 28 12:21:38 2009 : Error: Failed to load virtual server inner-tunnel

ปัญหานี้เกิดจากเราใช้ root เพื่อรันคำสั่ง bootstrap แล้วไฟล์ที่ถูกสร้างขึ้น owner, group จะเป็น root ทั้งหมด แต่ radiusd รันภายใต้ owner, group ที่ชื่อ radiusd ทำให้ไม่สามารถอ่านไฟล์ ที่ root สร้างขึ้นได้

ใช้คำสั่ง ls เพื่อตรวจสอบไฟล์ที่ root สร้างขึ้น

[root@fc11-64a certs]# ls -lrt
total 108
-rw-r----- 1 root radiusd  578 2009-09-15 22:29 xpextensions
-rw-r----- 1 root radiusd 1123 2009-09-15 22:29 server.cnf
-rw-r----- 1 root radiusd 7819 2009-09-15 22:29 README
-rw-r----- 1 root radiusd 4302 2009-09-15 22:29 Makefile
-rw-r----- 1 root radiusd 1109 2009-09-15 22:29 client.cnf
-rw-r----- 1 root radiusd 1288 2009-09-15 22:29 ca.cnf
-rwxr-x--- 1 root radiusd 2072 2009-09-15 22:29 bootstrap
-rw-r----- 1 root root     245 2009-11-28 12:20 dh
-rw-r----- 1 root root    5120 2009-11-28 12:20 random
-rw-r----- 1 root root    1751 2009-11-28 12:20 server.key
-rw-r----- 1 root root    1062 2009-11-28 12:20 server.csr
-rw-r----- 1 root root    1743 2009-11-28 12:20 ca.key
-rw-r----- 1 root root    1675 2009-11-28 12:20 ca.pem
-rw-r----- 1 root root       0 2009-11-28 12:20 index.txt.old
-rw-r----- 1 root root       3 2009-11-28 12:20 serial.old
-rw-r----- 1 root root       3 2009-11-28 12:20 serial
-rw-r----- 1 root root      21 2009-11-28 12:20 index.txt.attr
-rw-r----- 1 root root     120 2009-11-28 12:20 index.txt
-rw-r----- 1 root root    4210 2009-11-28 12:20 server.crt
-rw-r----- 1 root root    4210 2009-11-28 12:20 01.pem
-rw-r----- 1 root root    2533 2009-11-28 12:20 server.p12
-rw-r----- 1 root root    3503 2009-11-28 12:20 server.pem
-rw-r----- 1 root root    1195 2009-11-28 12:20 ca.der

การแก้ไขปัญหา ทำได้โดยการเปลี่ยน permission ของไฟล์ เพื่อให้ radiusd สามารถอ่านไฟล์ได้ ในที่นี้เปลี่ยนแค่ group ของไฟล์ก็เพียงพอแล้ว และเพื่อความปลอดภัยของระบบด้วย

ใช้คำสั่ง chgrp เพื่อเปลี่ยน group ของไฟล์

[root@fc11-64a certs]# chgrp radiusd *
[root@fc11-64a certs]# ls -lrt
total 108
-rw-r----- 1 root radiusd  578 2009-09-15 22:29 xpextensions
-rw-r----- 1 root radiusd 1123 2009-09-15 22:29 server.cnf
-rw-r----- 1 root radiusd 7819 2009-09-15 22:29 README
-rw-r----- 1 root radiusd 4302 2009-09-15 22:29 Makefile
-rw-r----- 1 root radiusd 1109 2009-09-15 22:29 client.cnf
-rw-r----- 1 root radiusd 1288 2009-09-15 22:29 ca.cnf
-rwxr-x--- 1 root radiusd 2072 2009-09-15 22:29 bootstrap
-rw-r----- 1 root radiusd  245 2009-11-28 12:20 dh
-rw-r----- 1 root radiusd 5120 2009-11-28 12:20 random
-rw-r----- 1 root radiusd 1751 2009-11-28 12:20 server.key
-rw-r----- 1 root radiusd 1062 2009-11-28 12:20 server.csr
-rw-r----- 1 root radiusd 1743 2009-11-28 12:20 ca.key
-rw-r----- 1 root radiusd 1675 2009-11-28 12:20 ca.pem
-rw-r----- 1 root radiusd    0 2009-11-28 12:20 index.txt.old
-rw-r----- 1 root radiusd    3 2009-11-28 12:20 serial.old
-rw-r----- 1 root radiusd    3 2009-11-28 12:20 serial
-rw-r----- 1 root radiusd   21 2009-11-28 12:20 index.txt.attr
-rw-r----- 1 root radiusd  120 2009-11-28 12:20 index.txt
-rw-r----- 1 root radiusd 4210 2009-11-28 12:20 server.crt
-rw-r----- 1 root radiusd 4210 2009-11-28 12:20 01.pem
-rw-r----- 1 root radiusd 2533 2009-11-28 12:20 server.p12
-rw-r----- 1 root radiusd 3503 2009-11-28 12:20 server.pem
-rw-r----- 1 root radiusd 1195 2009-11-28 12:20 ca.der

ใช้คำสั่ง service เพื่อรันเซอร์วิส radiusd อีกครั้ง

[root@fc11-64a certs]# service radiusd start
Starting RADIUS server:                                    [  OK  ]

ครั้งนี้จะสามารถรันได้ [ OK ] หากดูในไฟล์ radius.log จะมีข้อความดังนี้เกิดขึ้น

[root@fc11-64a ~]# tail /var/log/radius/radius.log
...
Sat Nov 28 12:23:10 2009 : Info: Loaded virtual server inner-tunnel
Sat Nov 28 12:23:11 2009 : Info: Loaded virtual server <default>
Sat Nov 28 12:23:11 2009 : Info: Ready to process requests.

ใช้คำสั่ง ps เพื่อ ตรวจสอบ process ของ radiusd

[root@fc11-64a certs]# ps -ef | grep radiusd
radiusd   1772     1  0 12:23 ?        00:00:00 /usr/sbin/radiusd
root      1783  1393  0 12:23 pts/0    00:00:00 grep radiusd

ใช้คำสั่ง netstat เพื่อตรวจสอบพอร์ตของ radiusd ที่ใช้

[root@fc11-64a raddb]# netstat -a | grep udp
...
udp        0      0 *:radius                    *:*
udp        0      0 *:radius-acct               *:*
udp        0      0 *:tdp-suite                 *:*

โดยดีฟอลต์ของ FreeRADIUS จะใช้พอร์ต UDP 1812, 1813, 1814 ในการทำงาน

ดูการ map ชื่อพอร์ตและเลขหมายของพอร์ตในไฟล์ /etc/services

[root@fc11-64a ~]# cat /etc/services
...
radius          1812/udp                        # Radius
radius-acct     1813/udp        radacct         # Radius Accounting
tdp-suite       1814/udp                # TDP Suite

ทดสอบด้วย radtest

จากการติดตั้ง freeradius-utils จะมีโปรแกรม radius client มาให้ด้วย คำสั่งหนึ่งที่ใช้ในการทดสอบอย่างง่ายๆ คือ radtest

[root@fc11-64a ~]# radtest
Usage: radtest user passwd radius-server[:port] nas-port-number secret [ppphint] [nasname]

พารามิเตอร์ที่ต้องระบุในการใช้คำสั่ง radtest คือ

  • user                              ชื่อ username ที่ต้องการ authenticate
  • passwd                        รหัสผ่าน password สำหรับ username
  • radius-server            เป็น IP Address ของเครื่องที่รัน radiusd ทำหน้าที่เป็น RADIUS Server
  • nas-port-number    ระบุหมายเลขพอร์ต สำหรับการทดสอบจะใช้เป็นตัวเลขอะไรก็ได้
  • secret                           เป็น shared secret เพื่อต้องระบุใน RADIUS Server เพื่อเป็นการอนุญาตว่า เครื่อง RADIUS Client ใดสามารถมา authenticate ได้บ้าง

ทดสอบการส่ง user, password ไปยัง radius server ที่ติดตั้ง ในที่นนี้ทดสอบบนเครื่องเดียวกัน ระบุเป็น 127.0.0.1

[root@fc11-64a ~]# radtest user1 password1 127.0.0.1 1 secret1
Sending Access-Request of id 207 to 127.0.0.1 port 1812
        User-Name = "user1"
        User-Password = "password1"
        NAS-IP-Address = 192.168.1.1
        NAS-Port = 1
rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=207, length=20
rad_verify: Received Access-Reject packet from client 127.0.0.1 port 1812 with invalid signature (err=2)!  (Shared secret is incorrect.)
Sending Access-Request of id 207 to 127.0.0.1 port 1812
        User-Name = "user1"
        User-Password = "password1"
        NAS-IP-Address = 192.168.1.1
        NAS-Port = 1
rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=207, length=20
rad_verify: Received Access-Reject packet from client 127.0.0.1 port 1812 with invalid signature (err=2)!  (Shared secret is incorrect.)
Sending Access-Request of id 207 to 127.0.0.1 port 1812
        User-Name = "user1"
        User-Password = "password1"
        NAS-IP-Address = 192.168.1.1
        NAS-Port = 1
rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=207, length=20
rad_verify: Received Access-Reject packet from client 127.0.0.1 port 1812 with invalid signature (err=2)!  (Shared secret is incorrect.)
radclient: no response from server for ID 207 socket 3

ผลจากการรันคำสั่ง radtest จะฟ้อง “Access-Reject” เนื่องจาก “Shared secret is incorrect”

การแก้ไข คือต้องระบุ shared secret ให้ถูกต้อง

ในไฟล์ /etc/raddb/clients.conf จะมีคอนฟิกระบุ เครื่อง client ที่สามารถส่งข้อมูลมา authenticate ได้ แต่ต้องระบุ shared secret ให้ถูกต้อง

หากตัดส่วน comment “#” ออก ดีฟอลต์จากการติดตั้ง จะมีคอนฟิกสำหรับเครื่อง localhost ดังนี้

client localhost {
    ipaddr = 127.0.0.1
    secret      = testing123
    require_message_authenticator = no
    nastype     = other
}

จากคอนฟิก แปลว่าหากมีการส่ง request จากเครื่อง localhost หรือ 127.0.01 ต้องระบุ shared secret เป็น testing123 จึงจะใช้ server ได้

ทดสอบคำสั่ง radtest ด้วย shared secret ที่ถูกต้อง

[root@fc11-64a ~]# radtest user1 password1 127.0.0.1 1 testing123
Sending Access-Request of id 58 to 127.0.0.1 port 1812
        User-Name = "user1"
        User-Password = "password1"
        NAS-IP-Address = 192.168.1.1
        NAS-Port = 1
rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=58, length=20

ผลการรันยังคงได้เป็น “Access-Reject” อยู่ เนื่องจาก ไม่มี username ที่ใช้ใน Server

ดีฟอลต์คอนฟิกเบื้องต้น จะเก็บไฟล์ username, password ไว้ในไฟล์ /etc/raddb/users โดยมีบรรทัดสุดท้ายอธิบายว่า ถ้าไม่ match หรือไม่มี username, password ที่คอนฟิกไว้ จะ denied การใช้งาน

# On no match, the user is denied access.

แก้ไขไฟล์ /etc/raddb/users โดยเพิ่ม username, password ที่ต้องการ

...
user1  Cleartext-Password := "password1"
       Reply-Message = "Hello, %{User-Name}"
# On no match, the user is denied access.

ใช้คำสั่ง service เพื่อรีโหลดคอนฟิกของ radius ใหม่

[root@fc11-64a ~]# service radiusd reload
Reloading RADIUS server:                                   [  OK  ]

ทดสอบคำสั่ง radtest โดยระบุ user, password ที่ถูกต้องจากไฟล์ /etc/raddb/users จะได้รับ “Access-Accept”

[root@fc11-64a raddb]# radtest user1 password1 127.0.0.1 1 testing123
Sending Access-Request of id 49 to 127.0.0.1 port 1812
        User-Name = "user1"
        User-Password = "password1"
        NAS-IP-Address = 192.168.1.1
        NAS-Port = 1
rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=49, length=34
        Reply-Message = "Hello, user1"

ทดสอบด้วย user ที่มีอยู่ในไฟล์ /etc/raddb/users แต่ระบุ password ผิด จะได้รับ “Access-Reject” แต่จะได้ “Reply-Message” ของ username นั้น กลับมาด้วย

[root@fc11-64a raddb]# radtest user1 password2 127.0.0.1 1 testing123
Sending Access-Request of id 76 to 127.0.0.1 port 1812
        User-Name = "user1"
        User-Password = "password2"
        NAS-IP-Address = 192.168.1.1
        NAS-Port = 1
rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=76, length=34
        Reply-Message = "Hello, user1"

ทดสอบด้วย user ที่ไม่มีอยู่ในไฟล์ /etc/raddb/users  จะได้รับ “Access-Reject”

[root@fc11-64a raddb]# radtest user2 password2 127.0.0.1 1 testing123
Sending Access-Request of id 91 to 127.0.0.1 port 1812
        User-Name = "user2"
        User-Password = "password2"
        NAS-IP-Address = 192.168.1.1
        NAS-Port = 1
rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=91, length=20

รัน radiusd ในโหมด debug

เมื่อเกิดปัญหาการคอนฟิกหรือการทำงานของ FreeRADIUS สิ่งหนึ่งที่ช่วยทำให้สามารถตรวจสอบรายละเอียดและแก้ไขปัญหาที่เกิดขึ้นได้ คือรัน radiusd ในโหมด debug ซึ่งหน้าจอจะแสดงขั้นตอนการทำงานของ radiusd อย่างละเอียด ทำให้เราสามารถทราบได้ว่า ปัญหาเกิดขึ้นที่จุดไหน

ใช้คำสั่ง service เพื่อหยุดรัน radiusd ในโหมดปกติ

[root@fc11-64a ~]# service radiusd stop
Stopping RADIUS server:                                    [  OK  ]

รันคำสั่ง radiusd ตามด้วย ออปชั่น ‘-X’ เพื่อรันในโหมด debug หน้าจอจะแสดงรายละเอียดในการทำงานของ radiusd สังเกตว่าเมื่อรันโหมด debug จะไม่กลับคืนสู่ prompt

หากต้องการหยุดรันในโหมด debug สามารถทำได้โดยกด [Ctrl-C]

ตัวอย่างการรัน radiusd ในโหมด debug

[root@fc11-64a ~]# radiusd -X
FreeRADIUS Version 2.1.7, for host x86_64-redhat-linux-gnu, built on Sep 15 2009 at 11:29:29
Copyright (C) 1999-2009 The FreeRADIUS server project and contributors.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
You may redistribute copies of FreeRADIUS under the terms of the
GNU General Public License v2.
Starting - reading configuration files ...
including configuration file /etc/raddb/radiusd.conf
including configuration file /etc/raddb/proxy.conf
including configuration file /etc/raddb/clients.conf
including files in directory /etc/raddb/modules/
including configuration file /etc/raddb/modules/acct_unique
including configuration file /etc/raddb/modules/always
including configuration file /etc/raddb/modules/attr_filter
including configuration file /etc/raddb/modules/attr_rewrite
including configuration file /etc/raddb/modules/chap
including configuration file /etc/raddb/modules/checkval
including configuration file /etc/raddb/modules/counter
including configuration file /etc/raddb/modules/cui
including configuration file /etc/raddb/modules/detail
including configuration file /etc/raddb/modules/detail.example.com
including configuration file /etc/raddb/modules/detail.log
including configuration file /etc/raddb/modules/digest
including configuration file /etc/raddb/modules/echo
including configuration file /etc/raddb/modules/etc_group
including configuration file /etc/raddb/modules/exec
including configuration file /etc/raddb/modules/expiration
including configuration file /etc/raddb/modules/expr
including configuration file /etc/raddb/modules/files
including configuration file /etc/raddb/modules/inner-eap
including configuration file /etc/raddb/modules/ippool
including configuration file /etc/raddb/modules/linelog
including configuration file /etc/raddb/modules/logintime
including configuration file /etc/raddb/modules/mac2ip
including configuration file /etc/raddb/modules/mac2vlan
including configuration file /etc/raddb/modules/mschap
including configuration file /etc/raddb/modules/otp
including configuration file /etc/raddb/modules/pam
including configuration file /etc/raddb/modules/pap
including configuration file /etc/raddb/modules/passwd
including configuration file /etc/raddb/modules/perl
including configuration file /etc/raddb/modules/policy
including configuration file /etc/raddb/modules/preprocess
including configuration file /etc/raddb/modules/radutmp
including configuration file /etc/raddb/modules/realm
including configuration file /etc/raddb/modules/smbpasswd
including configuration file /etc/raddb/modules/smsotp
including configuration file /etc/raddb/modules/sql_log
including configuration file /etc/raddb/modules/sqlcounter_expire_on_login
including configuration file /etc/raddb/modules/sradutmp
including configuration file /etc/raddb/modules/unix
including configuration file /etc/raddb/modules/wimax
including configuration file /etc/raddb/eap.conf
including configuration file /etc/raddb/policy.conf
including files in directory /etc/raddb/sites-enabled/
including configuration file /etc/raddb/sites-enabled/control-socket
including configuration file /etc/raddb/sites-enabled/default
including configuration file /etc/raddb/sites-enabled/inner-tunnel
group = radiusd
user = radiusd
including dictionary file /etc/raddb/dictionary
main {
        prefix = "/usr"
        localstatedir = "/var"
        logdir = "/var/log/radius"
        libdir = "/usr/lib64/freeradius"
        radacctdir = "/var/log/radius/radacct"
        hostname_lookups = no
        max_request_time = 30
        cleanup_delay = 5
        max_requests = 1024
        allow_core_dumps = no
        pidfile = "/var/run/radiusd/radiusd.pid"
        checkrad = "/usr/sbin/checkrad"
        debug_level = 0
        proxy_requests = yes
 log {
        stripped_names = no
        auth = no
        auth_badpass = no
        auth_goodpass = no
 }
 security {
        max_attributes = 200
        reject_delay = 1
        status_server = yes
 }
}
radiusd: #### Loading Realms and Home Servers ####
 proxy server {
        retry_delay = 5
        retry_count = 3
        default_fallback = no
        dead_time = 120
        wake_all_if_all_dead = no
 }
 home_server localhost {
        ipaddr = 127.0.0.1
        port = 1812
        type = "auth"
        secret = "testing123"
        response_window = 20
        max_outstanding = 65536
        require_message_authenticator = no
        zombie_period = 40
        status_check = "status-server"
        ping_interval = 30
        check_interval = 30
        num_answers_to_alive = 3
        num_pings_to_alive = 3
        revive_interval = 120
        status_check_timeout = 4
        irt = 2
        mrt = 16
        mrc = 5
        mrd = 30
 }
 home_server_pool my_auth_failover {
        type = fail-over
        home_server = localhost
 }
 realm example.com {
        auth_pool = my_auth_failover
 }
 realm LOCAL {
 }
radiusd: #### Loading Clients ####
 client localhost {
        ipaddr = 127.0.0.1
        require_message_authenticator = no
        secret = "testing123"
        nastype = "other"
 }
radiusd: #### Instantiating modules ####
 instantiate {
 Module: Linked to module rlm_exec
 Module: Instantiating exec
  exec {
        wait = no
        input_pairs = "request"
        shell_escape = yes
  }
 Module: Linked to module rlm_expr
 Module: Instantiating expr
 Module: Linked to module rlm_expiration
 Module: Instantiating expiration
  expiration {
        reply-message = "Password Has Expired  "
  }
 Module: Linked to module rlm_logintime
 Module: Instantiating logintime
  logintime {
        reply-message = "You are calling outside your allowed timespan  "
        minimum-timeout = 60
  }
 }
radiusd: #### Loading Virtual Servers ####
server inner-tunnel {
 modules {
 Module: Checking authenticate {...} for more modules to load
 Module: Linked to module rlm_pap
 Module: Instantiating pap
  pap {
        encryption_scheme = "auto"
        auto_header = no
  }
 Module: Linked to module rlm_chap
 Module: Instantiating chap
 Module: Linked to module rlm_mschap
 Module: Instantiating mschap
  mschap {
        use_mppe = yes
        require_encryption = no
        require_strong = no
        with_ntdomain_hack = no
  }
 Module: Linked to module rlm_unix
 Module: Instantiating unix
  unix {
        radwtmp = "/var/log/radius/radwtmp"
  }
 Module: Linked to module rlm_eap
 Module: Instantiating eap
  eap {
        default_eap_type = "md5"
        timer_expire = 60
        ignore_unknown_eap_types = no
        cisco_accounting_username_bug = no
        max_sessions = 2048
  }
 Module: Linked to sub-module rlm_eap_md5
 Module: Instantiating eap-md5
 Module: Linked to sub-module rlm_eap_leap
 Module: Instantiating eap-leap
 Module: Linked to sub-module rlm_eap_gtc
 Module: Instantiating eap-gtc
   gtc {
        challenge = "Password: "
        auth_type = "PAP"
   }
 Module: Linked to sub-module rlm_eap_tls
 Module: Instantiating eap-tls
   tls {
        rsa_key_exchange = no
        dh_key_exchange = yes
        rsa_key_length = 512
        dh_key_length = 512
        verify_depth = 0
        pem_file_type = yes
        private_key_file = "/etc/raddb/certs/server.pem"
        certificate_file = "/etc/raddb/certs/server.pem"
        CA_file = "/etc/raddb/certs/ca.pem"
        private_key_password = "whatever"
        dh_file = "/etc/raddb/certs/dh"
        random_file = "/etc/raddb/certs/random"
        fragment_size = 1024
        include_length = yes
        check_crl = no
        cipher_list = "DEFAULT"
        make_cert_command = "/etc/raddb/certs/bootstrap"
    cache {
        enable = no
        lifetime = 24
        max_entries = 255
    }
   }
 Module: Linked to sub-module rlm_eap_ttls
 Module: Instantiating eap-ttls
   ttls {
        default_eap_type = "md5"
        copy_request_to_tunnel = no
        use_tunneled_reply = no
        virtual_server = "inner-tunnel"
        include_length = yes
   }
 Module: Linked to sub-module rlm_eap_peap
 Module: Instantiating eap-peap
   peap {
        default_eap_type = "mschapv2"
        copy_request_to_tunnel = no
        use_tunneled_reply = no
        proxy_tunneled_request_as_eap = yes
        virtual_server = "inner-tunnel"
   }
 Module: Linked to sub-module rlm_eap_mschapv2
 Module: Instantiating eap-mschapv2
   mschapv2 {
        with_ntdomain_hack = no
   }
 Module: Checking authorize {...} for more modules to load
 Module: Linked to module rlm_realm
 Module: Instantiating suffix
  realm suffix {
        format = "suffix"
        delimiter = "@"
        ignore_default = no
        ignore_null = no
  }
 Module: Linked to module rlm_files
 Module: Instantiating files
  files {
        usersfile = "/etc/raddb/users"
        acctusersfile = "/etc/raddb/acct_users"
        preproxy_usersfile = "/etc/raddb/preproxy_users"
        compat = "no"
  }
 Module: Checking session {...} for more modules to load
 Module: Linked to module rlm_radutmp
 Module: Instantiating radutmp
  radutmp {
        filename = "/var/log/radius/radutmp"
        username = "%{User-Name}"
        case_sensitive = yes
        check_with_nas = yes
        perm = 384
        callerid = yes
  }
 Module: Checking post-proxy {...} for more modules to load
 Module: Checking post-auth {...} for more modules to load
 Module: Linked to module rlm_attr_filter
 Module: Instantiating attr_filter.access_reject
  attr_filter attr_filter.access_reject {
        attrsfile = "/etc/raddb/attrs.access_reject"
        key = "%{User-Name}"
  }
 } # modules
} # server
server {
 modules {
 Module: Checking authenticate {...} for more modules to load
 Module: Checking authorize {...} for more modules to load
 Module: Linked to module rlm_preprocess
 Module: Instantiating preprocess
  preprocess {
        huntgroups = "/etc/raddb/huntgroups"
        hints = "/etc/raddb/hints"
        with_ascend_hack = no
        ascend_channels_per_line = 23
        with_ntdomain_hack = no
        with_specialix_jetstream_hack = no
        with_cisco_vsa_hack = no
        with_alvarion_vsa_hack = no
  }
 Module: Checking preacct {...} for more modules to load
 Module: Linked to module rlm_acct_unique
 Module: Instantiating acct_unique
  acct_unique {
        key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port"
  }
 Module: Checking accounting {...} for more modules to load
 Module: Linked to module rlm_detail
 Module: Instantiating detail
  detail {
        detailfile = "/var/log/radius/radacct/%{Client-IP-Address}/detail-%Y%m%d"
        header = "%t"
        detailperm = 384
        dirperm = 493
        locking = no
        log_packet_header = no
  }
 Module: Instantiating attr_filter.accounting_response
  attr_filter attr_filter.accounting_response {
        attrsfile = "/etc/raddb/attrs.accounting_response"
        key = "%{User-Name}"
  }
 Module: Checking session {...} for more modules to load
 Module: Checking post-proxy {...} for more modules to load
 Module: Checking post-auth {...} for more modules to load
 } # modules
} # server
radiusd: #### Opening IP addresses and Ports ####
listen {
        type = "auth"
        ipaddr = *
        port = 0
}
listen {
        type = "acct"
        ipaddr = *
        port = 0
}
listen {
        type = "control"
 listen {
        socket = "/var/run/radiusd/radiusd.sock"
 }
}
Listening on authentication address * port 1812
Listening on accounting address * port 1813
Listening on command file /var/run/radiusd/radiusd.sock
Listening on proxy address * port 1814
Ready to process requests.

ตัวอย่างการรัน radtest และ ข้อความในหน้าจอโหมด debug ที่แสดง

[root@fc11-64a raddb]# radtest user1 password1 127.0.0.1 1 testing123
Sending Access-Request of id 118 to 127.0.0.1 port 1812
        User-Name = "user1"
        User-Password = "password1"
        NAS-IP-Address = 192.168.1.1
        NAS-Port = 1
rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=118, length=34
        Reply-Message = "Hello, user1"

หน้าจอโหมด debug ที่แสดง พร้อมเน้นข้อความที่เกี่ยวข้องกับการทำงานของ radiusd เมื่อได้รับการ request จากการรันคำสั่ง radtest แบบคร่าวๆ

rad_recv: Access-Request packet from host 127.0.0.1 port 53435, id=118, length=57
        User-Name = "user1"
        User-Password = "password1"
        NAS-IP-Address = 192.168.1.1
        NAS-Port = 1
+- entering group authorize {...}
++[preprocess] returns ok
++[chap] returns noop
++[mschap] returns noop
[suffix] No '@' in User-Name = "user1", looking up realm NULL
[suffix] No such realm "NULL"
++[suffix] returns noop
[eap] No EAP-Message, not doing EAP
++[eap] returns noop
++[unix] returns notfound
[files] users: Matched entry user1 at line 203
[files]         expand: Hello, %{User-Name} -> Hello, user1
++[files] returns ok
++[expiration] returns noop
++[logintime] returns noop
++[pap] returns updated
Found Auth-Type = PAP
+- entering group PAP {...}
[pap] login attempt with password "password1"
[pap] Using clear text password "password1"
[pap] User authenticated successfully
++[pap] returns ok
+- entering group post-auth {...}
++[exec] returns noop
Sending Access-Accept of id 118 to 127.0.0.1 port 53435
        Reply-Message = "Hello, user1"
Finished request 0.
Going to the next request
Waking up in 4.9 seconds.
Cleaning up request 0 ID 118 with timestamp +58
Ready to process requests.

ข้อมูลอ้างอิง

1 thought on “ติดตั้งและทดสอบ FreeRADIUS เบื้องต้น”

  1. คือผมเข้าโหมด debug แล้วขึ้นตามนี้แล้วครับ
    Listening on authentication address * port 1812
    Listening on accounting address * port 1813
    Listening on authentication address 127.0.0.1 port 18120 as server inner-tunnel
    Listening on proxy address * port 1814
    Ready to process requests.
    แต่ตอน radtest มันขึ้น
    radclient:: Failed to find IP address for Ubuntu
    radclient: Nothing to send.
    พอจะรู้สาเหตุมั้ยครับ

Leave a Reply