Hello.
Thank you for all the ideas.
I think I will do the radius plugin in the following way:
1. Authentication:
split privilege execution model
plugin: OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY
- Attributes ACCECP-REQUEST:
- Username
- Password
- NAS-Port = unique for each user, increment if a user connects,
decrement if a user disconnects
- NAS-IP-Address = ip address of the openvpn server
- NAS-Identifier = user defined string
- Service Type = "Framed" (for framed ip address assignment)
So I will manage the number of the NAS-Port, I think this is the
easiest way.
Or are there great advantages if every user gets his own tun
interface?
To Torge Szczepanek: Which radius server do you use?
I use freeradius and I think I can only set
a static IP addres as "Framed IP Address".
I don't know how dynamic ip assigment works
on a radius server. But I will implement the
radius attributes NAS-Port, NAS-IP-Adress, NAS_Identifier
and Service-Type="Framed" in the ACCEPT-REQUEST.
Are these all attributes?
- Analyzed Attributes of the ACCESS-ACCEPT (no changes):
Framed-Route = set to the server routing table and
write to the client file in client-config-dir
with the iroute directive
Framed-IP-Address = write to the client file in the client-config-dir
with the (ifconfig Framed-IP IP2) directive,
the other point (IP2)
must be create maybe by (IP2+1).
Acct-Interim-Interval = the accounting interval
(Maybe later a vendor specific attributs for routes which can be pushed to
the client.)
2. Accounting:
- split privilege execution model, only one process with a scheduler
for the differnt Acct-Interim-Intervals of the user.
plugin: OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY
plugin: PLUGIN_CLIENT_DISCONNECT (for stop ticket)
Attributes:
Acct-Status-Type:
start - at the beginning of the connection
update - during the connection
stop - at the end
NAS-Session-ID: unique for a connection
NAS-Identidier: user-defined value
Acct-Input-Octets: read from the status file
Acct-Output-Octets: read from the status file
Acct-Session-Time: internal counter or read from the status file
Framed-IP-Address: if the client get one
I will do the reading of the status file in a seperate function,
so it can be changed easy if the plugin OPENVPN_PLUGIN_STATS
is finished.
One more question to the plugin PLUGIN_CLIENT_DISCONNECT:
Does every plugin which is called, gets the pointer to thesame
struct openvpn_plugin_handle_t, so I can save here the socket to
the background processes and the plugin PLUGIN_CLIENT_DISCONNECT
can send data to these socket numbers?
The openvpn-plugin_abort_v1 function will I add maybe later.
Are there some more ideas or hints?
Ralf
James Yonan wrote:
> On Tue, 3 May 2005, Ralf [iso-8859-1] Lübben wrote:
>
>> Hello,
>>
>> I tried to create a concept for the RADIUS-Plugin.
>> Maybe someone have some additional ideas or can answer me some questions
>> I wrote down in the following text.
>>
>>
-------------------------------------------------------------------------------------------------------------
>> Start of the connection:
>>
>> The plugin sends a "access-request-radius-ticket" with the username and a
>> hash(MD5-hash over the password and the shared-secret) to the radius
>> server. If the server sends a "access-reject-ticket" or
>> "access-challenge-ticket" the authorization fails.
>>
>> If the server sends a "access-accept-ticket" the authorization is ok, in
>> the ticket can be some attributes:
>>
>> - Framed-IP-Address: The IP-address which is pushed to the client.
>>
>> - Framed-Route: These routes have to pushed to the servers routing table.
>> This
>> attribut can occur several times in the "access-accept-ticket".
>
> You might need a split privilege model here, because adding routes
> requires root privileges, and for security reasons, we don't want to run
> the main OpenVPN process as root. The OpenVPN plugin model supports split
> privileges, i.e. where the plugin process holds onto root while the main
> OpenVPN process drops privileges (see auth-pam or down-root for examples
> of this), so you'd probably need to have the plugin fork a process to
> handle route additions.
>
>> - Acct-Interim-Interval: The interval in which the accounting data is
>> sent to the radius server.
>>
>> Maybe these attributes are not important :
>> - Session-Timeout: The maximum time for a connection.
>
> OpenVPN doesn't support this right now.
>
>> - Idle-Timeout: The connection is disconnected, if there is no traffic
>
> This is tricky, because how do you define traffic?
>
>> Maybe it is possible to create a vendor specific attribut for routes
>> which are pushed to the client. There is no attribut for that in the
>> radius protocol.
>
> Good idea.
>
>> After the authorization is done:
>> The plugin has to start another process/thread for the accounting data
>> with the parameter value of the attribut "Acct-Interim-Interval".
>> This process has to sent an "accounting-request-ticket" to the radius
>> server with the attribut "acct-status-type"=1 (start). (There must be
>> included some more attributes for the radius server (NAS-IP-address
>> (=openvpn-ip-address) or NAS-identifier, real ip address of the user as
>> framed-ip-address-attribut, NAS-Port or NAS-port-type)
>> The process has to wait for a "accounting-response-ticket" from the
>> server, if he gets no response he has to send the ticket again
>> (interval=?).
>>
>> The plugin must return 0 if everything is ok, otherwise 1.
>>
>> Questions:
>>
>> Which is the best plugin to use? I need the username and the password
>> before the ip address and the routes are sent to the client?
>
> Use OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY (called first) to authorize
> username/password and OPENVPN_PLUGIN_CLIENT_CONNECT (called next) to push
> IP address and routes to client.
>
>> Do the openvpn process waits until the plugin is finished? So I can write
>> the conf-files without getting a IO-error.
>
> With 2.0.x, OpenVPN is running in a single thread, so plugin callbacks
> will stall the whole process.
>
> For 2.1, there will be multithread support (two threads actually), so
> calls to plugins will occur from a different thread than the main packet
> forwarding thread. There will only be a single thread for calling
> plugins, so you won't need to make the plugin callbacks themselves
> reentrant.
>
>>
------------------------------------------------------------------------------------------------------------
>> During the connection:
>>
>> The separate process/thread which is started at the beginning of the
>> connection sends
>> with the interval time of the attribut "Acct-Interim-Interval"
>> accounting data to the radius server.
>> The process reads the information out of the status file which is
>> generated by the openvpn process every second. The status file must be
>> generated every second because the attribut "Acct-Interim-Interval" is in
>> seconds and so nobody knows, when ths process reads the status file.
>
> This would work, but it might be cleaner for OpenVPN 2.1 to add a new
> callback for passing accounting data to the plugin.
>
> The problem with polling the status file is that there's no guarantee of
> change atomicity, i.e. an entry could be added and then deleted from the
> file between pollings.
>
>> The attribut "acct-status-type" must be set to 3 (interim-Update).
>>
>> The process has to wait for a "accounting-response-ticket" from the
>> server, if he gets no response he has to send the ticket again
>> (interval=?).
>>
>> Attributes in the accounting-request-ticket:
>> - NAS ip address and NAS identifier
>> - Framed ip address (=real ip address of the client)
>> - NAS-port or NAS-port-type
>> - Acct-Input-Octets
>> - Acct-Output-Octets
>> - Acct-Input-Packets
>> - Acct-Output-Packets
>> - Acct-Session-Time
>>
>>
>> Questions:
>> Is it possible to generate the status file every second?
>
> Yes, however if the OpenVPN event loop is not actively forwarding packets,
> the status file update interval could be as long as 10 seconds.
>
>> Is the accounting information in the status file separate for every user?
>
> Yes.
>
>> Which information can I get from the status file?
>
> For each client:
>
> Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
>
> For each internal routing table entry:
>
> Virtual Address,Common Name,Real Address,Last Reference
>
>>
------------------------------------------------------------------------------------------------------
>> End of the connection:
>> At the end a "accounting-request-ticket" with the "acct-status-type"=2
>> (stop) must be sent to the radius server.
>> With the following attributes:
>> - NAS ip address and NAS identifier
>> - Framed ip address (=real ip address of the client)
>> - NAS-port or NAS-port-type
>> - Acct-Input-Octets
>> - Acct-Output-Octets
>> - Acct-Input-Packets
>> - Acct-Output-Packets
>> - Acct-Session-Time
>> (- Acct-Terminate-Cause)
>>
>> Also the accouting process must be killed.
>>
>> I think the "PLUGIN_CLIENT_DISCONNECT"-type will be fit for this.
>>
>> Questions:
>> Is the "PLUGIN_CLIENT_DISCONNECT"-type called at every disconnect?
>
> Yes, but sometimes there is a delay on UDP disconnects, since UDP is
> connectionless, so the call to PLUGIN_CLIENT_DISCONNECT might occur more
> than 1 minute after the actual disconnection. Also, with UDP, if a client
> disconnects and immediately reconnects using the same port number (if
> nobind isn't used on the client), the server will see both the original
> connection and the reconnect as being part of the same connection, so
> there won't be a call to PLUGIN_CLIENT_DISCONNECT then
> PLUGIN_CLIENT_CONNECT.
>
> James
>
>
>
> -------------------------------------------------------
> This SF.Net email is sponsored by: NEC IT Guy Games.
> Get your fingers limbered up and give it your best shot. 4 great events, 4
> opportunities to win big! Highest score wins.NEC IT Guy Games. Play to
> win an NEC 61 plasma display. Visit http://www.necitguy.com/?r