Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
parpd(8)		    System Manager's Manual		      parpd(8)

NAME
       parpd --	Proxy-ARP daemon

SYNOPSIS
       parpd configfile

DESCRIPTION
       The parpd utility provide the missing ARP packets in non-broadcast mul-
       tiple-access networks with overly strict	first-hop security filters.

   Problem
       Large  layer 2 networks are hard	to maintain.  Therefore, several secu-
       rity measurements should	be implemented at the satellite	locations with
       few clients.  Especially	DSLAMs are prone to broken first-hop  security
       implementation,	which effectively requires to disable those filters or
       to drop support of non-standard clients.

       Often first hop security	filters	do sniff the  communication  for  DHCP
       and  adjust  the	 filters  accordingly.	Clients	with static IPs	do not
       need to use DHCP	(and often have	 and  static  configuration  instead),
       which  causes  the filters to fail to learn the used IP address.	 Other
       clients do negotiate more than one IP address, or have full  ranges  of
       statically assigned IP addresses.  In all such cases, the DLSAM filters
       are too simple to cover with the	required setup.

       A  common  first	hop security filter simply drops all broadcast traffic
       not intended to the learned IP address.	The rationale behind this type
       of filter is, that clients, which already know the MAC of the  destina-
       tion  are  allowed  to  reach  this device.  The	canonical way to learn
       about the destination MAC is to broadcast an ARP	packet for desired  IP
       address.	  So if	the filter blocks the distribution of those ARP	broad-
       casts to	different clients, only	 valid	communication  can  be	estab-
       lished.

       Large  networks come with large numbers of visible MAC addresses.  Sev-
       eral devices (i.e. DSLAMs) behave strangely in such situations,	there-
       fore network operators try hard to prevent leakage of frames into other
       areas.	Blocking  traffic  from	 a  satellite  location	to a different
       satellite location is typically called split-horizon.  Clients in  dif-
       ferent parts of the network are unable to communicate with each other.

       Combining DHCP sniffing,	broadcast filters, and split-horizon creates a
       typical	xDSL  network, where each client can only communicate with the
       central router(s).  Advanced clients cannot communicate at all.

   Simple Solution
       If only a single	router is attached to such a network, enabling	local-
       proxy-arp  on this device solves	large parts of problem:	 For every ARP
       request from a client, the router responds with its  own	 MAC  address.
       So client-client	communication is hair pinned at	the router interface.

       Because a router	learns the client MAC from the ARP request for the de-
       fault  gateway,	it  may	not need to ask	for the	client itself. Several
       routers refresh expiring	ARP entries by sending unicast requests, hence
       the broadcast filter may	not cause notifiable trouble.

       If there	are more than one router or server in the network, the	situa-
       tion  becomes  complicated.  Local-proxy-arp can't be used anymore, be-
       cause each of the routers will quickly learn each other's  MAC  address
       for the client IPs, causing loops.

       On the other hand some services,	like DHCP, try to verify, that free IP
       addresses  are unused, by arping	for that IP.  Any generic local-proxy-
       arp response would cause	trouble	to such	applications.

       All these issues	exist for ARP using broadcast as well as for  IPv6  ND
       using multicast.	Beside the wording, both cases are quite similar.

   parpd Approach
       In  order  to  keep  the	 network running, parpd	provides the necessary
       ARP/ND replies.	Depending on configuration rules, the utility  respond
       to  ARP/ND  requests with the real MAC address of the device or the MAC
       address of a router (redirect).

       It does learn the real MAC-IP  pairs  by	 listening  to	broadcast  ARP
       queries,	 gratuitous  ARP requests, and ICMPv6 ND solicit messages.  Of
       course, it does not learn from ARP/ND probes or replies not  originated
       by  the device owning the IP.  parpd does refresh it's cache using uni-
       cast requests.  In order	to obtain MAC addresses	 for  a	 redirect  re-
       sponse, the request may be broadcasted or multicasted.

       It's possible to	respond	with a static MAC if there is no host respond-
       ing  to ARP for a given IP.  Heavy Traffic (especially dDoS) can	stop a
       host from working.  But the incoming  traffic  may  not	stop,  so  the
       router is unable	to forward the traffic due to missing ARP information.
       This can	cause a	high CPU load on the router itself.  I.e. Cisco	report
       such  cases  as "L3 Glean" events.  In order to protect the router, the
       parpd can hand out a fixed MAC after it unsucessfully tried  to	obtain
       the  MAC	 for  the IP itself using broadcast ARP.  It's strongly	recom-
       mended to ensure	that all traffic to this MAC is	 dropped  as  soon  as
       possible, otherwise all the traffic is broadcasted to every host	in the
       layer 2 domain in order to reach	the unknown destination.

       Responses  can  be  delayed, which effectively ignores the first	set of
       requests	over a (short) period.	This way, special services  can	 probe
       for  the	 non-existence of an IP, while obtaining necessary answers for
       real communication.

       Part of the bootstrap process of	IPv6 is	sending	router	advertisements
       to  the	all  nodes  using a link-local multicast. If this is filtered,
       parpd can resend	such router advertisements to the  unicast  MACs  col-
       lected by ARP sniffing.

       The  customizable set of	rules allows adapting the behaviour to complex
       scenarios.

CONFIGURATION FILE
       parpd reads its configuration from the file given as  the  first	 argu-
       ment.   Comments	starts with a '#' and reach up to the end of the line.
       There is	no quoting, so the directory  or  file	names  cannot  contain
       spaces.

       The  configuration  contains  outmost options as	well as	a cache	and an
       interface section. On the outer level, the following  options  are  de-
       fined:

       workdir directory
	     Change the	working	directory.  All	pathnames are relative to this
	     directory,	even the configuration file from the command line.  If
	     the option	is not specified, the working directory	is not changed
	     at	 all.	The  workdir can't be changed during configuration re-
	     load.

       logfile filename
	     Any output	after the start-up is appended to this file.   If  the
	     option is missing,	all output goes	to stdout.  The	file is	closed
	     and reopened quickly, so logfile rotation does not	need to	signal
	     anything.	On the other hand, the logfile is updated in near real
	     time  to ease debugging.  This option can be changed by reloading
	     the config.

       pidfile filename
	     Without this option, the program stays in foreground and does not
	     close the standard	file descriptors.  However, if the  option  is
	     specified,	 the  software	prevents duplicate startup by checking
	     the pid in	the file, daemonizes itself,  and  create/updates  the
	     pid  in the file.	The pidfile can't be changed during configura-
	     tion reload.  The file is removed during a	 clear	shutdown:  see
	     "SIGNALS".

       The  cache section starts with the cache	or the cache6 keyword and ter-
       minates with the	end keyword.  In this section, the  following  options
       are allowed:

       tablesize number
	     Sets  the	size  of  the hash table.  The value should be a prime
	     number between 10%	and 50%	of the expected	number	of  cache  en-
	     tries.   Defaults	to 251.	 If this option	is changed by a	config
	     reload, the hash table is recalculated.

       timeout number
	     Defines the number	of seconds, an	learned	 entry	is  considered
	     valid.   Default  value  is  300  (5 minutes).  If	this option is
	     changed by	a config reload, the timeouts for all  cached  entries
	     are recalculated.

       refresh m*t
	     Defines the refresh policy	for expired cache entries.  An unicast
	     request  is  send	to the cached MAC for the cached IP address at
	     most m-times, while waiting t seconds  for	 each  response.   De-
	     faults  to	 3*10, three requests with ten seconds timeout per re-
	     quest.  Cache entries in this refresh phase are still used.  This
	     option can	be changed by reloading	the config.

       delay m*t
	     Defines the delay policy.	A delayed request from a specific  MAC
	     for  a  specific  IP  is ignored until it occurs at least m times
	     during a t	seconds	interval.  Defaults to 2*10, responding	to the
	     second query within ten seconds.  A  typical  Linux  system  asks
	     three  queries with a single second timeout before	considering an
	     IP	unreachable.  FreeBSD defaults to five queries and three  sec-
	     onds  timeout  per	query to come to the same result.  This	option
	     can be changed by reloading the config.

       holddown	number
	     Defines the number	of seconds a freshly updates  cache  entry  is
	     protected from changes.  Erroneous	devices	may send their own MAC
	     in	 response to any request (i.e. local-proxy-arp).  Some of them
	     may broadcast this	erroneous response, too.  In order to overcome
	     such quick, erroneous changes, the	fresh entries are not  updated
	     too quickly.  Default value is 10.

       The interface section starts with the interface keyword followed	by the
       interface  name	and terminates with the	end keyword.  In this section,
       the following options are allowed:

       timeout float
	     Sets the number of	seconds	(as a floating-point number)  to  wait
	     for  ARP packets and signals before processing them.  Defaults to
	     1.0 seconds.  If a	large amount of	ARP packets is received,  pro-
	     cessing  may  start earlier depending on the kernel buffers.  Can
	     be	changed	by configuration reload.

       rule src	dst op
	     Customising the behaviour of the progam.  If the source IP	of ARP
	     request matches the CIDR value for	src and	the queried IP in this
	     ARP request matches the CIDR value	for dst, then the actions  de-
	     fined  by op are performed.  Rules	are processed first match.  If
	     no	match was found, the packet is ignored.

       rule6 src dst op
	     Customising the behaviour of the progam.  If the source IP	of  ND
	     request matches the CIDR value for	src and	the queried IP in this
	     ND	 request  matches the CIDR value for dst, then the actions de-
	     fined by op are performed.	 Rules are processed first match.   If
	     no	match was found, the packet is ignored.

	     If	the op ends with the keyword eui, a ND response	will be	synte-
	     sized  from  the querie EUI-64 IPv6 address.  If the queried IPv6
	     address is	not in the correct form, no response will be sent.

       rad src dst op
	     Customising the behaviour of the progam.  If  the	source	IP  of
	     router advertisement matches the CIDR value for src, then for all
	     IPs  in  the ARP cache matching the CIDR value for	dst the	action
	     defined by	op is performed.  Rules	are processed first match  for
	     each ARP cache entry.  If no match	was found, the ARP cache entry
	     is	ignored.

	     If	 any  rule  contains  the keyword verbose, a summary of	packet
	     processing	is logged, even	if the rule itself does	not match any-
	     thing.

       If the op contains the  keyword	verbose,  details  of  processing  the
       packet is logged.  If the op contains the keyword delay,	the request is
       only  processed,	 if  the  delay	 parameters from the cache section are
       matched.	 If the	op ends	with the keyword ignore, no response  will  be
       sent.  If the op	ends with an IP	address, a reply containing the	cached
       MAC  of	this specified IP will be send.	If the op ends with an MAC ad-
       dress, a	reply with this	MAC will be send.  If the  op  ends  with  the
       keyword tell, a reply containing	the cached MAC for the queries IP will
       be sent.	 The op	tell may be followed by	or and a MAC address, which is
       used in the case	that IP	is not online.

       In order	to keep	the cache small, only packets matching the CIDR	dst of
       a tell rule will	be learned.

       In   complex   situation	  the	CIDR   format	can   be  replaced  by
       a.b.c.d/e.f.g.h,	where a.b.c.d is an network address and	e.f.g.h	is  an
       arbitary	 netmask.   Such  non-continuous  netmask may ease the ruleset
       considerably.  This is not available for	IPv6.

EXIT CODE
       The parpd utility exits 0 on success, and >0 if an  error  occurs.   If
       the  mandatory argument is missing, -1 is returned.  If the config file
       can't be	parsed,	the exit code becomes 1.  An exit code of 2 is set, if
       the specified interface can't be	used.  The returned value of 3	means,
       that program failed to daemonize	itself.

SIGNALS
       The utility catch and respond to	the following signals:

       TERM  Terminate the process.  Final clean-up includes a last statistics
	     output as well as removal of the pidfile.

       HUP   Reload  the  configuration.   If  the new configuration cannot be
	     parsed, an	error message is written  (to  the  logfile)  and  the
	     change is ignored.

       INFO  Print usage statistics.  The counters are purged atomically after
	     each  report.  In order to	enable statistics the time between two
	     reports is	also mentioned.

       USR1  Print delayed queries.  The report	contains the querying MAC, the
	     queried IP	address, as well as the	number	of  received  queries,
	     and the age of the	entry.	See "BUGS".

       USR2  Print  the	 current  cache	 content.  The table contains the hash
	     slot, the IP and the MAC address, the remaining lifetime, and the
	     number of unanswered retries to refresh the entry.	 If  too  many
	     entries  per  hash	 slot exists, please increase the size of hash
	     table.

EXAMPLES
	# configration file

	logfile	/var/log/parpd.log
	pidfile	/var/run/parpd.pid
	workdir	/var/tmp

	cache
	 timeout       302     # seconds
	 tablesize     3499	# expecting about 10000	entries
	 refresh       3*5     # 3 retries a 5 seconds each
	 delay	       4*3     # respond at 4th	retry in 3 seconds
	end

	interface em0
	 timeout       1.011
	 # do not respond for queries to our own infrastructure
	 rule	       0.0.0.0/0	198.51.100.0/29	   ignore
	 # delay queries from the DHCP server
	 rule	       198.51.100.4/32	198.51.100.0/24	   delay tell
	 # help	the routers/servers to reach the clients
	 # or hand out a special MAC for unreachable IPs
	 rule		  198.51.100.0/29     198.51.100.0/24	    tell    or
       02:04:06:08:0a:0c
	 #  interclient	communication through hairpinning at the default gate-
       way
	 rule	       198.51.100.0/24	198.51.100.0/24	   198.51.100.1
	 # help	erroneous clients arping for everything
	 rule		   198.51.100.0/24	0.0.0.0/0	       verbose
       198.51.100.1
	 # multihomed server with weak host model
	 rule	       192.0.2.0/24	198.51.100.0/24	   tell
	 # show	missing	entries
	 rule	       0.0.0.0/0	0.0.0.0/0	   verbose ignore
	 # fake	responses for EUI-64 link-local	addresses for the router
	 rule6	       fe80::1234/128	fe80::/64	   eui
	 # respond to link-local queries
	 rule6	       fe80::/64	fe80::/64	   tell
	 # show	missing	entries
	 rule6	       ::/0		::/0   verbose ignore
	 # resend router advertisements	from the router	as unicasts
	 rad	       fe80::1234/128	198.51.100.0/24	   tell
	 # silently ignore other router	advertisements
	 rad	       ::/0		0.0.0.0/0	   ignore
	 # enable summary logging for router advertisements
	 rad	       ::/0		0.0.0.0/0	   ignore verbose ver-
       bose ignore end

	end

STANDARDS

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=parpd&sektion=8&manpath=FreeBSD+Ports+14.3.quarterly>

home | help