# -*- text -*-
##
## clients.conf -- client configuration directives
##
##	$Id: 9c1fa97f8e856275663d731216a65362f63fb29e $

#######################################################################
#
#  Define RADIUS clients (usually a NAS, Access Point, etc.).

#
#  There are a number of security practices which are critical in the
#  modern era.
#
#  * don't use RADIUS/UDP or RADIUS/TCP over the Internet.  Use RADIUS/TLS.
#
#  * If you do send RADIUS over UDP or TCP, don't send MS-CHAPv2.
#    Anyone who can see the MS-CHAPv2 data can crack it in milliseconds.
#
#  * use the "radsecret" program to generate secrets.  It uses Perl (sorry).
#    Every time you run it, it will generate a new strong secret.
#
#  * don't create shared secrets yourself.  Anything you create is likely to
#    be in a "cracking" dictionary, and will allow a hobbyist attacker
#    to crack the shared secret in a few minutes.
#
#  * Don't trust anyone who tells you to ignore the above recommendations.
#

#
#  Defines a RADIUS client.
#
#  '127.0.0.1' is another name for 'localhost'.  It is enabled by default,
#  to allow testing of the server after an initial installation.  If you
#  are not going to be permitting RADIUS queries from localhost, we suggest
#  that you delete, or comment out, this entry.
#
#

#
#  Each client has a "short name" that is used to distinguish it from
#  other clients.
#
#  In version 1.x, the string after the word "client" was the IP
#  address of the client.  In 2.0, the IP address is configured via
#  the "ipaddr" or "ipv6addr" fields.  For compatibility, the 1.x
#  format is still accepted.
#
client localhost {
	#  Only *one* of ipaddr, ipv4addr, ipv6addr may be specified for
	#  a client.
	#
	#  ipaddr will accept IPv4 or IPv6 addresses with optional CIDR
	#  notation '/<mask>' to specify ranges.
	#
	#  ipaddr will accept domain names e.g. example.org resolving
	#  them via DNS.
	#
	#  If both A and AAAA records are found, A records will be
	#  used in preference to AAAA.
	ipaddr = 127.0.0.1

	#  Same as ipaddr but allows v4 addresses only. Requires A
	#  record for domain names.
#	ipv4addr = *	# any.  127.0.0.1 == localhost

	#  Same as ipaddr but allows v6 addresses only. Requires AAAA
	#  record for domain names.
#	ipv6addr = ::	# any.  ::1 == localhost

	#
	#  A note on DNS:  We STRONGLY recommend using IP addresses
	#  rather than host names.  Using host names means that the
	#  server will do DNS lookups when it starts, making it
	#  dependent on DNS.  i.e. If anything goes wrong with DNS,
	#  the server won't start!
	#
	#  The server also looks up the IP address from DNS once, and
	#  only once, when it starts.  If the DNS record is later
	#  updated, the server WILL NOT see that update.
	#

	#
	#  The transport protocol.
	#
	#  If unspecified, defaults to "udp", which is the traditional
	#  RADIUS transport.  It may also be "tcp", in which case the
	#  server will accept connections from this client ONLY over TCP.
	#
	proto = *

	#
	#  The shared secret use to "encrypt" and "sign" packets between
	#  the NAS and FreeRADIUS.  You MUST change this secret from the
	#  default, otherwise it's not a secret any more!
	#
	#  The secret can be any string, up to 8k characters in length.
	#
	#  Control codes can be entered vi octal encoding,
	#	e.g. "\101\102" == "AB"
	#  Quotation marks can be entered by escaping them,
	#	e.g. "foo\"bar"
	#
	#  A note on security: The security of the RADIUS protocol
	#  depends COMPLETELY on this secret!  We recommend using a
	#  shared secret that at LEAST 16 characters long.  It should
	#  preferably be 32 characters in length.  The secret MUST be
	#  random, and should not be words, phrase, or anything else
	#  that is recognisable.
	#
	#  Computing power has increased enormously since RADIUS was
	#  first defined.  A hobbyist with a high-end GPU can try ALL
	#  of the 8-character shared secrets in about a day.  The
	#  security of shared secrets increases MUCH more with the
	#  length of the shared secret, than with number of different
	#  characters used in it.  So don't bother trying to use
	#  "special characters" or anything else in an attempt to get
	#  un-guessable secrets.  Instead, just get data from a secure
	#  random number generator, and use that.
	#
	#  You should create shared secrets using a method like this:
	#
	#	dd if=/dev/random bs=1 count=24 | base64
	#
	#  This process will give output which takes 24 random bytes,
	#  and converts them to 32 characters of ASCII.  The output
	#  should be accepted by all RADIUS clients.
	#
	#  You should NOT create shared secrets by hand.  They will
	#  not be random.  They will will be trivial to crack.
	#
	#  The default secret below is only for testing, and should
	#  not be used in any real environment.
	#
	secret = testing123

	#
	#  The global configuration "security.require_message_authenticator"
	#  flag sets the default for all clients.  That default can be
	#  over-ridden here, by setting it to a value.  If no value is set,
	#  then the default from the "radiusd.conf" file is used.
	#
	#  See that file for full documentation on the flag, along
	#  with allowed values and meanings.
	#
	#  This flag exists solely for legacy clients which do not send
	#  Message-Authenticator in all Access-Request packets.  We do not
	#  recommend setting it to "no".
	#
	#  The number one way to protect yourself from the BlastRADIUS
	#  attack is to update all RADIUS servers, and then set this
	#  flag to "yes".  If all RADIUS servers are updated, and if
	#  all of them have this flag set to "yes" for all clients,
	#  then your network is safe.  You can then upgrade the
	#  clients when it is convenient, instead of rushing the
	#  upgrades.
	#
	#  allowed values: yes, no, auto
	#
#	require_message_authenticator = no

	#
	#  The global configuration "security.limit_proxy_state"
	#  flag sets the default for all clients.  That default can be
	#  over-ridden here, by setting it to "no".
	#
	#  See that file for full documentation on the flag, along
	#  with allowed values,and meanings.
	#
	#  This flag exists solely for legacy clients which do not send
	#  Message-Authenticator in all Access-Request packets.  We do not
	#  recommend setting it to "no".
	#
	#  allowed values: yes, no, auto
	#
#	limit_proxy_state = yes

	#
	#  In many cases, the RFCs say that a RADIUS server needs to
	#  "silently discard" input packets.  However, discarding
	#  packets can often result in network instability, because
	#  the client has no idea what happened.
	#
	#  If this flag is set to "yes", then the server will send a
	#  Protocol-Error reply to the client.
	#
	#  This flag is not set to "yes" by default because some
	#  clients might misbehave when they receive a Protocol-Error
	#  reply.  If we find out that clients are fine with the
	#  Protocol-Error response, then this configuration flag will
	#  be removed in a future release.  Or, it will be set to
	#  "yes" by default.
	#
#	protocol_error = yes

	#
	#  The short name is used as an alias for the fully qualified
	#  domain name, or the IP address.
	#
	#  It is accepted for compatibility with 1.x, but it is no
	#  longer necessary in >= 2.0
	#
#	shortname = localhost

	#
	# the following three fields are optional, but may be used by
	# checkrad.pl for simultaneous use checks
	#

	#
	# The nas_type tells 'checkrad.pl' which NAS-specific method to
	#  use to query the NAS for simultaneous use.
	#
	#  Permitted NAS types are:
	#
	#	cisco
	#	computone
	#	livingston
	#	juniper
	#	max40xx
	#	multitech
	#	netserver
	#	pathras
	#	patton
	#	portslave
	#	tc
	#	usrhiper
	#	other		# for all other types

	#
	nas_type	 = other	# localhost isn't usually a NAS...

	#
	#  The following two configurations are for future use.
	#  The 'naspasswd' file is currently used to store the NAS
	#  login name and password, which is used by checkrad.pl
	#  when querying the NAS for simultaneous use.
	#
#	login	   = !root
#	password	= someadminpas

	#
	#  As of 2.0, clients can also be tied to a virtual server.
	#  This is done by setting the "virtual_server" configuration
	#  item, as in the example below.
	#
#	virtual_server = home1

	#
	#  A pointer to the "home_server_pool" OR a "home_server"
	#  section that contains the CoA configuration for this
	#  client.  For an example of a coa home server or pool,
	#  see raddb/sites-available/originate-coa
#	coa_server = coa

	#
	#  Response window for proxied packets.  If non-zero,
	#  then the lower of (home, client) response_window
	#  will be used.
	#
	#  i.e. it can be used to lower the response_window
	#  packets from one client to a home server.  It cannot
	#  be used to raise the response_window.
	#
#	response_window = 10.0

	#
	#  Connection limiting for clients using "proto = tcp".
	#
	#  This section is ignored for clients sending UDP traffic
	#
	limit {
		#
		#  Limit the number of simultaneous TCP connections from a client
		#
		#  The default is 16.
		#  Setting this to 0 means "no limit"
		max_connections = 16

		#  The per-socket "max_requests" option does not exist.

		#
		#  The lifetime, in seconds, of a TCP connection.  After
		#  this lifetime, the connection will be closed.
		#
		#  Setting this to 0 means "forever".
		lifetime = 0

		#
		#  The idle timeout, in seconds, of a TCP connection.
		#  If no packets have been received over the connection for
		#  this time, the connection will be closed.
		#
		#  In general, the client should close connections
		#  when they are idle.  This setting is here just to
		#  make sure that bad clients do not leave connections open for days.
		#
		#  If an idle timeout is set for only a "client" or a
		#  "listen" section, that timeout is used.
		#
		#  If an idle timeout is set for both a "client" and a
		#  "listen" section, then the smaller timeout is used.
		#
		#  Setting this to 0 means "no timeout".
		#
		#  We STRONGLY RECOMMEND that you set an idle timeout.
		#
		#  Systems with many incoming connections (500+) should
		#  set this value to a lower number.  There are only a
		#  limited number of usable file descriptors (usually
		#  1024) due to Posix API issues.  If many sockets are
		#  idle, it can prevent the server from opening new
		#  connections.
		#
		idle_timeout = 900
	}

	#
	#  TLS Configuration
	#
	#  A client can have TLS settings. The settings here are the
	#  settings used by the server when a client connects to it.
	#
	#  The TLS configuration for RADIUS/TLS clients is the same as
	#  the listener TLS configuration.  See sites-available/tls,
	#  and "listen { ... tls { ... } }" for examples of the server
	#  TLS configuration.
	#
#	tls {
#		...
#	}
}

# IPv6 Client
client localhost_ipv6 {
	ipv6addr	= ::1
	secret		= testing123
}

# All IPv6 Site-local clients
#client sitelocal_ipv6 {
#	ipv6addr	= fe80::/16
#	secret		= testing123
#}

#client example.org {
#	ipaddr		= radius.example.org
#	secret		= testing123
#}

#
#  You can now specify one secret for a network of clients.
#  When a client request comes in, the BEST match is chosen.
#  i.e. The entry from the smallest possible network.
#
#client private-network-1 {
#	ipaddr		= 192.0.2.0/24
#	secret		= testing123-1
#}

#client private-network-2 {
#	ipaddr		= 198.51.100.0/24
#	secret		= testing123-2
#}

#######################################################################
#
#  Per-socket client lists.  The configuration entries are exactly
#  the same as above, but they are nested inside of a section.
#
#  You can have as many per-socket client lists as you have "listen"
#  sections, or you can re-use a list among multiple "listen" sections.
#
#  Un-comment this section, and edit a "listen" section to add:
#  "clients = per_socket_clients".  That IP address/port combination
#  will then accept ONLY the clients listed in this section.
#
#  There are additional considerations when using clients from SQL.
#
#  A client can be link to a virtual server via modules such as SQL.
#  This link is done via the following process:
#
#  If there is no listener in a virtual server, SQL clients are added
#  to the global list for that virtual server.
#
#  If there is a listener, and the first listener does not have a
#  "clients=..." configuration item, SQL clients are added to the
#  global list.
#
#  If there is a listener, and the first one does have a "clients=..."
#  configuration item, SQL clients are added to that list.  The client
#  { ...} ` configured in that list are also added for that listener.
#
#  The only issue is if you have multiple listeners in a virtual
#  server, each with a different client list, then the SQL clients are
#  added only to the first listener.
#
#clients per_socket_clients {
#	client socket_client {
#		ipaddr = 192.0.2.4
#		secret = testing123
#	}
#}
