163 lines
7.8 KiB
HTML
163 lines
7.8 KiB
HTML
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||
|
<html>
|
||
|
<head>
|
||
|
<title>hapoliy - HA and LB for policy servers</title>
|
||
|
<link rel="stylesheet" type="text/css" href="http://www.jpkessler.de/css/postfwd.css">
|
||
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
|
||
|
<meta name="description" content="hapolicy loadbalancing and high availability for postfix policy servers">
|
||
|
<meta name="author" content="jpk">
|
||
|
<meta name="keywords" content="hapolicy, policy server loadbalancing, policy server high availability, policy server failure, policy delegation, postfix, Jan, Peter, Kessler">
|
||
|
</head>
|
||
|
|
||
|
<body>
|
||
|
|
||
|
<p><a name="__index__"></a></p>
|
||
|
<!-- INDEX BEGIN -->
|
||
|
|
||
|
<ul>
|
||
|
|
||
|
<li><a href="#name">NAME</a></li>
|
||
|
<li><a href="#synopsis">SYNOPSIS</a></li>
|
||
|
<li><a href="#description">DESCRIPTION</a></li>
|
||
|
<ul>
|
||
|
|
||
|
<li><a href="#introduction">INTRODUCTION</a></li>
|
||
|
<li><a href="#configuration">CONFIGURATION</a></li>
|
||
|
<li><a href="#integration">INTEGRATION</a></li>
|
||
|
</ul>
|
||
|
|
||
|
<li><a href="#links">LINKS</a></li>
|
||
|
<li><a href="#license">LICENSE</a></li>
|
||
|
<li><a href="#author">AUTHOR</a></li>
|
||
|
</ul>
|
||
|
<!-- INDEX END -->
|
||
|
|
||
|
<hr />
|
||
|
<p>
|
||
|
</p>
|
||
|
<h1><a name="name">NAME</a></h1>
|
||
|
<p>hapolicy - policy delegation high availability script</p>
|
||
|
<p>
|
||
|
</p>
|
||
|
<hr />
|
||
|
<h1><a name="synopsis">SYNOPSIS</a></h1>
|
||
|
<p><strong>hapolicy</strong> [OPTIONS] --service=SERVICE1 [--service=SERVICE2 ...]</p>
|
||
|
<pre>
|
||
|
Services:
|
||
|
-s, --service <name>=<address>:<port>[:<prio>:<weight>:<timeout>]</pre>
|
||
|
<pre>
|
||
|
Options:
|
||
|
-d, --default <action> returns <action> if no service was available (default: 'dunno')
|
||
|
-l, --logging log requests
|
||
|
-v, --verbose increase logging verbosity
|
||
|
-L, --stdout log to stdout, for debugging, do NOT use with postfix</pre>
|
||
|
<p>
|
||
|
</p>
|
||
|
<hr />
|
||
|
<h1><a name="description">DESCRIPTION</a></h1>
|
||
|
<p>
|
||
|
</p>
|
||
|
<h2><a name="introduction">INTRODUCTION</a></h2>
|
||
|
<p><strong>hapolicy</strong> enables high availability, weighted loadbalancing and a fallback action for postfix policy delegation services. Invoked via postfix spawn it acts as a wrapper that queries
|
||
|
other policy servers via tcp connection. The order of the service queries can be influenced by assigning a specific priority and weight to each service. A service is considered 'failing',
|
||
|
if the connection is refused or the specified service timeout is reached. If all of the configured policy services were failing, <strong>hapolicy</strong> returns a default action (e.g. dunno) to postfix.</p>
|
||
|
<p>With version 1.00 <strong>hapolicy</strong> has less than 200 lines of perl code using only standard perl modules. It does not require any disk access nor configuration files and runs under an unpriviledged
|
||
|
user account. This should allow fast and reliable operation.</p>
|
||
|
<p>
|
||
|
</p>
|
||
|
<h2><a name="configuration">CONFIGURATION</a></h2>
|
||
|
<p>A service has the following attributes</p>
|
||
|
<pre>
|
||
|
"servicename" => {
|
||
|
ip => '127.0.0.1', # ip address
|
||
|
port => '10040', # tcp port
|
||
|
prio => '10', # optional, lower wins
|
||
|
weight => '1', # optional, for items with same prio (weighted round-robin), higher is better
|
||
|
timeout => '30', # optional, query timeout in seconds
|
||
|
},</pre>
|
||
|
<p>You may define multiple services at the command line. Which means that</p>
|
||
|
<pre>
|
||
|
hapolicy -s "grey1=10.0.0.1:10031:10" -s "grey2=10.0.0.2:10031:20"</pre>
|
||
|
<p>will always try first service <em>grey1</em> at ip 10.0.0.1 port 10031 and if that service is not available or
|
||
|
does not answer within the default of 30 seconds the next service <em>grey2</em> at ip 10.0.0.2 port 10031 will
|
||
|
be queried.<br><br>
|
||
|
<img src="hapolicy01.png"><br>
|
||
|
</p>
|
||
|
<p>If you want to load balance connections you may define</p>
|
||
|
<pre>
|
||
|
hapolicy -s "polw1=10.0.0.1:12525:10:2" -s "polw2=10.0.0.2:12525:10:1"</pre>
|
||
|
<p>which queries service <em>polw1</em> at ip 10.0.0.1 twice as much as service <em>polw2</em> at ip 10.0.0.2.<br><br>
|
||
|
<img src="hapolicy02.png">
|
||
|
<br><br>
|
||
|
Note that this
|
||
|
setup also ensures high availability for both services. If <em>polw1</em> is not available or does not answer
|
||
|
within the default of 30 seconds <em>polw2</em> will be queried and vice versa. There is no reason to define a service twice.</p>
|
||
|
<p>
|
||
|
</p>
|
||
|
<h2><a name="integration">INTEGRATION</a></h2>
|
||
|
<p>Enter the following at the bottom of your postfix master.cf (usually located at /etc/postfix):</p>
|
||
|
<pre>
|
||
|
# service description, note the leading blanks at the second line
|
||
|
127.0.0.1:10061 inet n n n - 0 spawn
|
||
|
user=nobody argv=/usr/local/bin/hapolicy -l -s GREY1=10.0.0.1:10031:10 -s GREY2=10.0.0.2:10031:10</pre>
|
||
|
<p>save the file and open postfix main.cf. Modify it as follows:</p>
|
||
|
<pre>
|
||
|
127.0.0.1:10061_time_limit = 3600</pre>
|
||
|
<pre>
|
||
|
smtpd_recipient_restrictions =
|
||
|
permit_mynetworks,
|
||
|
... other authed permits ...
|
||
|
reject_unauth_destination,
|
||
|
... other restrictions ...
|
||
|
check_policy_service inet:127.0.0.1:10061 # <- hapolicy query</pre>
|
||
|
<p>Now issue 'postfix reload' at the command line. Of course you can have more enhanced setups
|
||
|
using postfix restriction classes. Please see <a href="#links">LINKS</a> for further options.</p>
|
||
|
<p>
|
||
|
</p>
|
||
|
<hr />
|
||
|
<h1><a name="links">LINKS</a></h1>
|
||
|
<p>[1] Get hapolicy<br>
|
||
|
<a href="http://www.postfwd.org/hapolicy/hapolicy">http://www.postfwd.org/hapolicy/hapolicy</a></p>
|
||
|
<p>[2] Postfix SMTP Access Policy Delegation<br>
|
||
|
<a href="http://www.postfix.org/SMTPD_POLICY_README.html">http://www.postfix.org/SMTPD_POLICY_README.html</a></p>
|
||
|
<p>[3] Postfix Per-Client/User/etc. Access Control<br>
|
||
|
<a href="http://www.postfix.org/RESTRICTION_CLASS_README.html">http://www.postfix.org/RESTRICTION_CLASS_README.html</a></p>
|
||
|
<p>
|
||
|
</p>
|
||
|
<hr />
|
||
|
<h1><a name="license">LICENSE</a></h1>
|
||
|
<p>hapolicy is free software and released under BSD license, which basically means
|
||
|
that you can do what you want as long as you keep the copyright notice:</p>
|
||
|
<p>Copyright (c) 2008, Jan Peter Kessler
|
||
|
All rights reserved.</p>
|
||
|
<p>Redistribution and use in source and binary forms, with or without modification,
|
||
|
are permitted provided that the following conditions are met:</p>
|
||
|
<pre>
|
||
|
* Redistributions of source code must retain the above copyright
|
||
|
notice, this list of conditions and the following disclaimer.
|
||
|
* Redistributions in binary form must reproduce the above copyright
|
||
|
notice, this list of conditions and the following disclaimer in
|
||
|
the documentation and/or other materials provided with the
|
||
|
distribution.
|
||
|
* Neither the name of the authors nor the names of his contributors
|
||
|
may be used to endorse or promote products derived from this
|
||
|
software without specific prior written permission.</pre>
|
||
|
<p>THIS SOFTWARE IS PROVIDED BY ME ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||
|
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT,
|
||
|
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||
|
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||
|
POSSIBILITY OF SUCH DAMAGE.</p>
|
||
|
<p>
|
||
|
</p>
|
||
|
<hr />
|
||
|
<h1><a name="author">AUTHOR</a></h1>
|
||
|
<p>Jan Peter Kessler <info (AT) postfwd (DOT) org>. Let me know, if you have any suggestions.</p>
|
||
|
|
||
|
</body>
|
||
|
|
||
|
</html>
|