(RADIATOR) Radiator Proxy GNU Radius
Hugh Irvine
hugh at open.com.au
Tue Jun 8 14:29:31 CDT 2004
Hello Antonio -
I will need to see a trace 4 debug from Radiator showing what is
happening.
Also is the host that is running Radiator multi-homed? If so it may
simply be that the reply is being sent from a different interface than
that to which the initial request was sent. This is the most usual
cause of this problem. Another possiblity is that there is some address
translation occuring.
regards
Hugh
On 8 Jun 2004, at 20:19, Antonio Mórtigo wrote:
> Hello,
>
>
> I'm running Radiator 3.5 with Solaris 9 and perl 5.8.0 on a sparc box.
> Last week I tried to make "talk" GNU-radius (version 1.2) to my
> radiator in a radius proxy configuration. What I need is to make
> GNU-radius to pass radius access and accounting requests from an
> especific realm to my radiator. The radiator configuration has in the
> authorized clients clause the IP address and secret for that remote
> GNU server and also GNU-radius has configured realms, clients, and
> secrets as well... all configurations seems to be good. In fact I
> tried the GNU-radius configuration with a diferent radiator running on
> another ISP and it worked well but when my Radiator send back the
> authentication reply packet to the GNU-radius, GNU-radiator says:
>
>
> Jun 07 22:30:21 [15250]: Unrecognized proxy reply from server
> xxx.xxx.xxx.xxx, proxy ID XX
>
> The Trace of request packet in my Radiator says "No Reply"
>
> radpwtst -s xxx.xxx.xxx.xxx -user USER at DOMAIN -password XXX -trace
> Reading dictionary file '/etc/radiator/dictionary'
> sending Access-Request...
> Packet dump:
> *** Sending to xxx.xxx.xxx.xxx port 1645 ....
> Code: Access-Request
> Identifier: 229
> Authentic: 1234567890123456
> Attributes:
> User-Name = "USER at DOMAIN"
> Service-Type = Framed-User
> NAS-IP-Address = 208.221.129.201
> NAS-Port = 1234
> Called-Station-Id = "123456789"
> Calling-Station-Id = "987654321"
> NAS-Port-Type = Async
> User-Password =
> "B:<132><198><132>Q<167><194><4><30><251>0<131><245><203>O"
> No reply
>
>
> I thought it might be a problem with my Radiator version (too old?)
> so, as I said above, I ran a radius-proxy test "against" a Radiator
> 3.9 version with a simpler configuration (simpler than mine) and it
> worked. Then I ran the test with another radiator in another ISP and
> the radius-proxy worked also with an older version of (3.3 version)
> so I just saw the problem has nothing to do with the version.
>
>
> Any Ideas?... I attached my configuration file may be this is the
> problem.
>
> Regards,
>
> Antonio
>
> DbDir /etc/radiator
> LogDir /logs/radiator
> LogFile /logs/radiator/Radiator.log
> DictionaryFile /etc/radiator/dictionary
> UsernameCharset a-zA-Z0-9\/\.\_\@\-\^\+
>
> AuthPort 1645
> AcctPort 1646
>
>
> DefineFormattedGlobalVar CHKREJECT Auth-Type = Reject
>
> DefineFormattedGlobalVar REPLYNTSVR Filter-Id = mail,\
> Reply-Message = NAVEGACION
> RESTRINGIDA CDACCESS
>
> DefineFormattedGlobalVar REPLYLCENT Ascend-Route-IP =
> Route-IP-Yes,\
> Ascend-Data-Filter = ip in
> forward icmp,\
> Ascend-Data-Filter = ip in
> forward dstip xxx.xxx.xxx.xxx/0 udp dstport = 53,\
> Ascend-Data-Filter = ip in
> forward dstip xxx.xxx.xxx.xxx/32 tcp dstport = 80,\
> Reply-Message = NAVEGACION
> RESTRINGIDA CDACCESS
>
>
> DefineFormattedGlobalVar REPLYHIPER USR-IP-Input-Filter = 10
> ACCEPT udp-dst-port=53,\
> USR-IP-Input-Filter = 20 AND
> tcp-dst-port=80,\
> USR-IP-Input-Filter = 32
> ACCEPT dst-addr=xxx.xxx.xxx.xxx,\
> USR-IP-Input-Filter = 100
> DENY,\
> Reply-Message = NAVEGACION
> RESTRINGIDA CDACCESS
> <Client localhost>
> Identifier Lucent
> Secret XXXX
> IgnoreAcctSignature
> IdenticalClients xxx.xxx.xxx.xxx
> IdenticalClients xxx.xxx.xxx.xxx
> PreHandlerHook file:"test.pl"
> </Client>
>
> <Client xxx.xxx.xxx.xxx>
> Identifier Lucent
> Secret XXXX
> DupInterval 2
> IgnoreAcctSignature
>
> # BOG, BOG, BOG, CAL, CAL
> IdenticalClients xxx.xxx.xxx.xxx
>
> # CAR, CAR, MED, BAR
> IdenticalClients xxx.xxx.xxx.xxx
> IdenticalClients xxx.xxx.xxx.xxx
>
> # BAR, BAR, BUC, PER
> IdenticalClients xxx.xxx.xxx.xxx
> IdenticalClients xxx.xxx.xxx.xxx
>
> # BUC, MAN
> IdenticalClients xxx.xxx.xxx.xxx
> PreHandlerHook file:"test.pl"
> </Client>
>
> <Client xxx.xxx.xxx.xxx>
> Identifier Netserver
> Secret XXXX
> DupInterval 2
> IgnoreAcctSignature
> IdenticalClients xxx.xxx.xxx.xxx
> PreHandlerHook file:"test.pl"
> </Client>
>
> <Client xxx.xxx.xxx.xxx>
> Identifier HiperARC
> Secret XXXX
> DupInterval 2
> IgnoreAcctSignature
> IdenticalClients xxx.xxx.xxx.xxx
> IdenticalClients xxx.xxx.xxx.xxx
> PreHandlerHook file:"test.pl"
> </Client>
>
> <Client xxx.xxx.xxx.xxx>
> Secret XXXX
> IgnoreAcctSignature
> DefaultRealm andinetdsl.com
> IdenticalClients xxx.xxx.xxx.xxx
> </Client>
>
> <AuthBy SQL>
>
> Identifier authsql
> DBSource dbi:mysql:xxxxxx
> DBUsername xxx
> DBAuth xxx
>
> AddToReply Class=%{ClassDB}
> EncryptedPassword
> NoDefault
>
> AccountingStopsOnly
> AuthenticateAccounting
>
> AccountingTable %{ClassDB}.ACCT%v%Y
> AcctColumnDef USERNAME,%U,formatted
> AcctColumnDef TIMESTAMP,Timestamp,integer
> AcctColumnDef ACCTSESSIONID,Acct-Session-Id
> AcctColumnDef ACCTSESSIONTIME,Acct-Session-Time,integer
> AcctColumnDef NASIDENTIFIER,NAS-IP-Address
> AcctColumnDef FRAMEDIPADDRESS,Framed-IP-Address
> AcctColumnDef ACCTINPUTOCTETS,Acct-Input-Octets,integer
> AcctColumnDef ACCTOUTPUTOCTETS,Acct-Output-Octets,integer
> AcctColumnDef ACCTTERMINATECAUSE,Acct-Terminate-Cause
> AcctColumnDef NASPORTTYPE,NAS-Port-Type
> AcctColumnDef USRCONNECTSPEED,USR-Connect-Speed
> AcctColumnDef CALLEDID,Called-Station-Id
> AcctColumnDef CALLINGID,Calling-Station-Id
>
>
> AuthSelect SELECT ENCRYPTEDPASSWORD, CHECKATTR, \
>
>
> IF("%{Client-Type}"="Lucent",REPLYATTRLCENT,IF("%{Client-
> Type}"="Netserver",REPLYATTRNTSVR,REPLYATTRHIPER)) AS REPLYATTR \
> FROM %{ClassDB}.USER WHERE USERNAME = '%U'
>
> AddToReplyIfNotExist Service-Type=Framed-User,\
> Framed-Protocol=PPP,\
> Idle-Timeout=900,\
> Session-Timeout=86400,\
> Framed-Compression=Van-Jacobson-TCP-IP
>
> AcctSQLStatement UPDATE %{ClassDB}.USER SET
> TIMELEFT=TIMELEFT-IF(HORAS>0,0%{Acct-Session-Time},0) \
> WHERE USERNAME = '%U'
>
> </AuthBy>
>
> <AuthBy RADIUS>
> Identifier authroamserver
> Host xxx.xxx.xxx.xxx
> AuthPort 11812
> AcctPort 11813
> Secret XXXX
> AddToReply Class="externos"
> </AuthBy>
>
> <AuthBy RADIUS>
> Identifier express
> Host xxx.xxx.xxx.xxx
> AuthPort 1645
> AcctPort 1646
> Secret XXXX
> AddToReply Class="externos"
> </AuthBy>
>
> <AuthBy SQL>
> Identifier authipass
> DBSource dbi:mysql:xxxxxx
> DBUsername xxx
> DBAuth xxx
> EncryptedPassword
> NoDefault
> AuthSelect Select ENCRYPTEDPASSWORD from %{ClassDB}.USER where
> USERNAME = '%U' AND IPASS = 1
> </AuthBy>
>
> <AuthBy SQL>
> Identifier acctexternos
> DBSource dbi:mysql:xxxxxx
> DBUsername xxx
> DBAuth xxx
> AccountingStopsOnly
>
> AuthSelect
> AccountingTable ACCT%v%Y
> AcctColumnDef USERNAME,%n,formatted
> AcctColumnDef TIMESTAMP,Timestamp,integer
> AcctColumnDef ACCTSESSIONID,Acct-Session-Id
> AcctColumnDef ACCTSESSIONTIME,Acct-Session-Time,integer
> AcctColumnDef NASIDENTIFIER,NAS-IP-Address
> AcctColumnDef FRAMEDIPADDRESS,Framed-IP-Address
> AcctColumnDef ACCTINPUTOCTETS,Acct-Input-Octets,integer
> AcctColumnDef ACCTOUTPUTOCTETS,Acct-Output-Octets,integer
> AcctColumnDef ACCTTERMINATECAUSE,Acct-Terminate-Cause
> AcctColumnDef NASPORTTYPE,NAS-Port-Type
> AcctColumnDef USRCONNECTSPEED,USR-Connect-Speed
> AcctColumnDef CALLEDID,Called-Station-Id
> AcctColumnDef CALLINGID,Calling-Station-Id
> </AuthBy>
>
> <AuthBy SQL>
> Identifier virtualnet
> DBSource dbi:mysql:xxxxxx
> DBUsername xxx
> DBAuth xxx
>
> DefaultSimultaneousUse 1
> AccountingStopsOnly
>
> #AuthSelect SELECT EXPIRATION,TIMELEFT from PIN WHERE PIN = '%U'
> AND TIMELEFT>0 AND LOCKED=0
> AuthSelect SELECT
> EXPIRATION,TIMELEFT,IF(TIMELEFT>0,"","Auth-Type=Reject:Consumo
> Agotado") \
> FROM PIN WHERE PIN = '%U' AND LOCKED=0
>
> AuthColumnDef 0, Expiration, check
> AuthColumnDef 1, Session-Timeout, reply
> AuthColumnDef 2, GENERIC, check
>
> #AcctSQLStatement UPDATE PIN SET TIMELEFT=TIMELEFT-IF('%U'
> LIKE 'rep-%',0,0%{Acct-Session-Time}) \
> # WHERE PIN = '%n'
>
> AcctSQLStatement UPDATE PIN SET
> TIMELEFT=TIMELEFT-0%{Acct-Session-Time} WHERE PIN = '%n'
>
> AcctSQLStatement INSERT INTO ACCOUNTING VALUES ( '%U',
> '%{Timestamp}','%{Acct-Session-Id}', \
>
>
> '%{Acct-Session-Time}','%{NAS-IP-Address}','%{Framed-IP-
> Address}','%{Calling-Station-Id}' )
>
> </AuthBy>
>
> <AuthBy SQL>
> Identifier wirelnet
> DBSource dbi:mysql:xxxxx
> DBUsername xxx
> DBAuth xxx
>
> DefaultSimultaneousUse 1
> AccountingStopsOnly
>
> AuthSelect SELECT
> EXPIRATION,TIMELEFT,IF(TIMELEFT>0,"","Auth-Type=Reject:Consumo
> Agotado") \
> FROM PIN WHERE PIN = '%U' AND LOCKED=0
>
> AuthColumnDef 0, Expiration, check
> AuthColumnDef 1, Session-Timeout, reply
> AuthColumnDef 2, GENERIC, check
>
> AcctSQLStatement UPDATE PIN SET
> TIMELEFT=TIMELEFT-0%{Acct-Session-Time} WHERE PIN = '%n'
>
> AcctSQLStatement INSERT INTO ACCOUNTING VALUES ( '%U',
> '%{Timestamp}','%{Acct-Session-Id}', \
>
>
> '%{Acct-Session-Time}','%{NAS-IP-Address}','%{Framed-IP-
> Address}','%{Calling-Station-Id}' )
> </AuthBy>
>
> <AuthLog FILE>
> Identifier authlog
> Filename %L/authlogs/%{ClassDB}.log
> LogSuccess 1
> LogFailure 1
> FailureFormat %l: FAIL : Access rejected for %U: %1 :%P
> </AuthLog>
>
> <AuthLog SQL>
> Identifier authlogsql
> DBSource dbi:mysql:xxxxx
> DBUsername xxx
> DBAuth xxx
> LogFailure
> FailureQuery insert into %{ClassDB}.RADLOG%v%Y
> (USERNAME,TIMESTAMP,REASON,PASSWORD) values ('%U',%t,%1,'%P')
> </AuthLog>
>
> <Realm geo.net.co>
> SessionDatabase externos
> AuthByPolicy ContinueAlways
> AuthBy acctexternos
> <AuthBy RADIUS>
> Host xxx.xxx.xxx.xxx
> Secret xxx
> AddToReply Class="externos"
> </AuthBy>
> AcctLogFileName %L/GEONET.ACCT
> </Realm>
>
> <Realm ixp.net>
> SessionDatabase sqlsess
> AuthByPolicy ContinueAlways
> <AuthBy RADIUS>
> Host xxx.xxx.xxx.xxx
> Secret xxx
> AuthPort 1645
> AcctPort 1646
> </AuthBy>
> <AuthBy PORTLIMITCHECK>
> CountQuery SELECT COUNT(*) FROM ixp.RADONLINE
> LimitQuery SELECT MAXPORTS FROM gestion.VISP WHERE
> IDVISP='ixp'
> </AuthBy>
> AcctLogFileName %L/IXPNET.ACCT
> AuthLog authlog
> AuthLog authlogsql
> </Realm>
>
> <Realm coldecon.net.co>
> SessionDatabase sqlsess
> RewriteUsername s/^([^@]+).*/$1/
> AuthByPolicy ContinueAlways
> <AuthBy RADIUS>
> Host xxx.xxx.xxx.xxx
> Secret xxx
> AuthPort 1645
> AcctPort 1646
> </AuthBy>
> <AuthBy PORTLIMITCHECK>
> CountQuery SELECT COUNT(*) FROM coldecon.RADONLINE
> LimitQuery SELECT MAXPORTS FROM gestion.VISP WHERE
> IDVISP='coldecon'
> </AuthBy>
> AcctLogFileName %L/COLDECON.ACCT
> AuthLog authlog
> AuthLog authlogsql
> </Realm>
>
> <Realm andinetdsl.com>
> SessionDatabase externos
> RewriteUsername s/^([^@]+).*/$1/
> AddToReply Class="externos"
> AuthByPolicy ContinueAlways
> AuthBy acctexternos
> <AuthBy FILE>
> Filename /etc/radiator/users.emtelco
> </AuthBy>
> AcctLogFileName %L/EMTELCO.ACCT
> </Realm>
>
> <Realm cdaccess>
> SessionDatabase cdsess
> RewriteUsername s/^([^@]+).*/$1/
> AuthByPolicy ContinueAlways
> AddToReply Class="cdaccess"
>
> <AuthBy SQL>
>
> Identifier cdaccess
> DBSource dbi:mysql:xxxxx
> DBUsername xxx
> DBAuth xxx
>
> DefaultSimultaneousUse 1
> AccountingStopsOnly
>
> AuthSelect SELECT IF( UNIX_TIMESTAMP()-ACTIVATION -
> DAYS*86400>0 AND ACTIVATION<>0 , "%{GlobalVar:CHKREJECT}" , "" ) AS
> CHECKATTR, \
> IF( ACTIVATION<>0, "", \
>
>
> IF("%{Client-Type}"="Lucent","%{GlobalVar:REPLYLCENT}",IF("%{Client-
> Type}"="Netserver","%{GlobalVar:REPLYNTSVR}","%{GlobalVar:
> REPLYHIPER}"))) AS REPLYATTR \
> FROM CDKEY WHERE CDKEY = '%U'
>
> AuthColumnDef 0, GENERIC, check
> AuthColumnDef 1, GENERIC, reply
>
> AccountingTable ACCT%v%Y
> AcctColumnDef USERNAME,%n,formatted
> AcctColumnDef TIMESTAMP,Timestamp,integer
> AcctColumnDef ACCTSESSIONID,Acct-Session-Id
> AcctColumnDef ACCTSESSIONTIME,Acct-Session-Time,integer
> AcctColumnDef NASIDENTIFIER,NAS-IP-Address
> AcctColumnDef FRAMEDIPADDRESS,Framed-IP-Address
> AcctColumnDef ACCTINPUTOCTETS,Acct-Input-Octets,integer
> AcctColumnDef ACCTOUTPUTOCTETS,Acct-Output-Octets,integer
> AcctColumnDef ACCTTERMINATECAUSE,Acct-Terminate-Cause
> AcctColumnDef NASPORTTYPE,NAS-Port-Type
> AcctColumnDef USRCONNECTSPEED,USR-Connect-Speed
> AcctColumnDef CALLEDID,Called-Station-Id
> AcctColumnDef CALLINGID,Calling-Station-Id
>
> </AuthBy>
>
> AuthLog authlog
> AuthLog authlogsql
> </Realm>
>
> <Realm vispctl.com>
> PacketTrace
> <AuthBy SQL>
> DBSource dbi:mysql:xxxxx
> DBUsername xxx
> DBAuth xxx
> AuthSelect Select HASH FROM VISPCTL where CTLID = '%U'
> </AuthBy>
> </Realm>
>
> <Handler User-Name = /duplicated|unauthentica/>
> AuthByPolicy ContinueAlways
> <AuthBy SQL>
> AcctSQLStatement
> AuthSelect
> </AuthBy>
> AcctLogFileName %L/descartados.log
> </Handler>
> <Handler Request-Type= /Ascend-Access-Event/ >
> AuthByPolicy ContinueAlways
> <AuthBy SQL>
> AcctSQLStatement
> AuthSelect
> </AuthBy>
> AcctLogFileName %L/descartados.log
> </Handler>
>
> <Handler NAS-Identifier="i-Pass VNAS">
> RejectHasReason
> SessionDatabase sessnull
> AuthByPolicy ContinueAlways
> AuthBy acctexternos
> AuthBy authipass
> </Handler>
>
> <Handler ClassDB="externos">
> SessionDatabase externos
> AuthByPolicy ContinueAlways
> AuthBy acctexternos
> AuthBy authroamserver
> </Handler>
>
> <Handler Realm=virtualnet>
> RewriteUsername s/^([^@]+).*/$1/
> SessionDatabase sessvnet
> RejectHasReason
> AccountingHandled
> PreAuthHook file:"test2.pl"
> AuthBy virtualnet
> AuthLog authlog
> AuthLog authlogsql
> </Handler>
>
> <Handler Realm=wirelnet>
> RewriteUsername s/^([^@]+).*/$1/
> SessionDatabase sesswnet
> RejectHasReason
> AccountingHandled
> PreAuthHook file:"test3.pl"
> AuthBy wirelnet
> </Handler>
>
> <Handler>
> SessionDatabase sqlsess
> RejectHasReason
> PostAuthHook file:"test4.pl"
> AuthByPolicy ContinueUntilAccept
> AuthBy authsql
> AuthLog authlog
> AuthLog authlogsql
> </Handler>
>
> <SessionDatabase SQL>
>
> Identifier sessvnet
>
> DBSource dbi:mysql:xxxxx
> DBUsername xxx
> DBAuth xxx
>
> AddQuery INSERT INTO RADONLINE (USERNAME, NASIDENTIFIER,
> NASPORT, \
> ACCTSESSIONID, TIME_STAMP, FRAMEDIPADDRESS, NASPORTTYPE,
> CALLINGID, \
> SERVICETYPE) values ('%U', '%N' , 0%{NAS-Port},
> '%{Acct-Session-Id}',\
> %{Timestamp}, '%{Framed-IP-Address}', '%{NAS-Port-Type}',
> '%{Calling-Station-Id}', \
> '%{Service-Type}')
>
> </SessionDatabase>
>
> <SessionDatabase SQL>
>
> Identifier sesswnet
>
> DBSource dbi:mysql:xxxxx
> DBUsername xxx
> DBAuth xxx
>
> AddQuery INSERT INTO RADONLINE (USERNAME, NASIDENTIFIER,
> NASPORT, \
> ACCTSESSIONID, TIME_STAMP, FRAMEDIPADDRESS, NASPORTTYPE,
> CALLINGID, \
> SERVICETYPE) values ('%U', '%N' , 0%{NAS-Port},
> '%{Acct-Session-Id}',\
> %{Timestamp}, '%{Framed-IP-Address}', '%{NAS-Port-Type}',
> '%{Calling-Station-Id}', \
> '%{Service-Type}')
>
> </SessionDatabase>
>
> <SessionDatabase SQL>
>
> Identifier sqlsess
>
> DBSource dbi:mysql:xxxxx
> DBUsername xxx
> DBAuth xxx
>
> AddQuery INSERT INTO %{ClassDB}.RADONLINE (USERNAME,
> NASIDENTIFIER, NASPORT, \
> ACCTSESSIONID, TIME_STAMP, FRAMEDIPADDRESS,
> NASPORTTYPE,CALLINGID, \
> SERVICETYPE) values ('%U', '%N' , 0%{NAS-Port},
> '%{Acct-Session-Id}',\
> %{Timestamp}, '%{Framed-IP-Address}',
> '%{NAS-Port-Type}','%{Calling-Station-Id}', \
> '%{Service-Type}')
>
> DeleteQuery DELETE FROM %{ClassDB}.RADONLINE where
> NASIDENTIFIER='%1' and NASPORT='%2'
>
> CountQuery SELECT NASIDENTIFIER, NASPORT, ACCTSESSIONID,
> FRAMEDIPADDRESS \
> from %{ClassDB}.RADONLINE where USERNAME='%U'
>
> </SessionDatabase>
>
> <SessionDatabase SQL>
>
> Identifier cdsess
>
> DBSource dbi:mysql:xxxxx
> DBUsername xxx
> DBAuth xxx
>
> AddQuery INSERT INTO RADONLINE (USERNAME, NASIDENTIFIER,
> NASPORT, \
> ACCTSESSIONID, TIME_STAMP, FRAMEDIPADDRESS, NASPORTTYPE,
> CALLINGID, \
> SERVICETYPE) values ('%U', '%N' , 0%{NAS-Port},
> '%{Acct-Session-Id}',\
> %{Timestamp}, '%{Framed-IP-Address}', '%{NAS-Port-Type}',
> '%{Calling-Station-Id}', \
> '%{Service-Type}')
>
> </SessionDatabase>
>
> <SessionDatabase SQL>
>
> Identifier externos
>
> DBSource dbi:mysql:xxxxx
> DBUsername xxx
> DBAuth xxx
>
> AddQuery INSERT INTO RADONLINE (USERNAME, NASIDENTIFIER,
> NASPORT, \
> ACCTSESSIONID, TIME_STAMP, FRAMEDIPADDRESS,
> NASPORTTYPE,CALLINGID, \
> SERVICETYPE) values ('%{User-Name}', '%N' ,
> 0%{NAS-Port}, '%{Acct-Session-Id}',\
> %{Timestamp}, '%{Framed-IP-Address}',
> '%{NAS-Port-Type}','%{Calling-Station-Id}', \
> '%{Service-Type}')
>
> DeleteQuery DELETE FROM RADONLINE where NASIDENTIFIER='%1'
> and NASPORT='%2'
>
> CountQuery SELECT NASIDENTIFIER, NASPORT, ACCTSESSIONID,
> FRAMEDIPADDRESS \
> FROM RADONLINE where USERNAME='%n'
>
> </SessionDatabase>
>
> <SessionDatabase NULL>
> Identifier sessnull
> </SessionDatabase >
NB: have you included a copy of your configuration file (no secrets),
together with a trace 4 debug showing what is happening?
--
Radiator: the most portable, flexible and configurable RADIUS server
anywhere. Available on *NIX, *BSD, Windows, MacOS X.
-
Nets: internetwork inventory and management - graphical, extensible,
flexible with hardware, software, platform and database independence.
-
CATool: Private Certificate Authority for Unix and Unix-like systems.
--
Archive at http://www.open.com.au/archives/radiator/
Announcements on radiator-announce at open.com.au
To unsubscribe, email 'majordomo at open.com.au' with
'unsubscribe radiator' in the body of the message.
More information about the radiator
mailing list