On Tue, 17 May 2005, Ralf [UTF-8] Lübben wrote:

> Hello,
> 
> I finished a C++class for the radius protocol. So I can send, receive and
> analyze authentication and accounting radius packets.
> 
> Now I will start to create the openvpn-plugin.
> 
> I have there still some quesitions:
> 
> When are called the funktions:
>         openvpn-plugin_open_v1
>         openvpn-plugin_func_v1
>         openvpn-plugin_close_v1
> 
> 
> Is this right?
>  - openvpn-plugin_open_v1: At the start of openvpn.
>  - openvpn-plugin_func_v1: When the event happens.
>  - openvpn-plugin_close_v1: When openvpn is closed.

Yes.  There's also an abort function that will be added 
in 2.0.1 (see CVS or http://openvpn.net/beta/ ).  The abort function gets 
called if there's a fatal error, so you should do a minimum cleaup such as 
sending a message to the worker process to close.

> To communicate between the functions I can create
> a user-defined struct, which can be shared between the functions
> over the openvpn_plugin_handle_t. Is that also right?

Yes.

> I want divide the hole plugin in two parts:
> 
> 1. Authorisation and Authentification
> This will work like the auth-pam-plugin (split privilege execution model)
> only with radius support. The plugin-process holds root rights, so
> routes from the radius server can be set.
> 
> I want to send following attribute:
> Username
> Password
> NAS-Port = number of the tun interface
> NAS-IP-Address = ip address of the openvpn server
> NAS-Identifier = user defined string
> 
> I want to analyze following attributes of the radius response:
> 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=
> 
> The Framed-Route and the Framed-IP-Address will be written to a file
> with the name of the enviroment variable envp[common-name].
> At the end of a connection the routes should be deleted. 
> 
> If a client disconnect, the iroutes in the OpenVpn-process are deleted
> automatically?

Yes.

> 2. Accounting
> Here I'm not sure, want is the best way to do it, maybe somebody have
> some ideas.
> One idea is to create for every openvpn-client who
> connects to the openvpn-server a own process with fork(). 
> So every process gets his own Acct-Interim-Interval and can send 
> the accounting data to the radius server. The data is read from
> the status file. This file must be accessible by the user (nobody)
> of the openvpn process. 
> If there are a lot of users, there are a lot of processes and every 
> process reads the status file.
> 
> The other idea is to create only one process which handles all
> accounting, this process will work like the auth-pam-plugin (split privilege
> execution model). This process must schedule the differnt
> Acct-Interim-Intervals of the clients. The data is read from
> the status file.

I would tend towards the latter (one process for all accounting).  This 
will be more scalable.

> Accounting 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: intenal counter or read from the status file
> 
> The accounting stop ticket can only be send by the disconnect plugin.
> Can I share informations between plugins? So the disconnect plugin can 
> send a disconnect signal to the accounting process, maybe over a socket?
> So the accounting for this users stopps and the ticket is generated.

Yes, all plugins are called via the openvpn_plugin_func_v1 function with 
the type parameter set to the actual plugin type such as 
OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY or OPENVPN_PLUGIN_CLIENT_CONNECT.

James

> > 
> >> 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
> 
> 
> 
> 
> -------------------------------------------------------
> This SF.Net email is sponsored by Oracle Space Sweepstakes
> Want to be the first software developer in space?
> Enter now for the Oracle Space Sweepstakes!
> http://ads.osdn.com/?ad_id=7412&alloc_id=16344&op=click
> _______________________________________________
> Openvpn-devel mailing list
> Openvpn-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/openvpn-devel
> 

Reply via email to