Archive for the Compile Postfix Category

Compiling SASL Packages with Postfix

Posted by Filed Under Compile Postfix with Comments Off

The environmental variables in CCARGS for instance, provide the options that Postfix needs.

AUXLIBS – If you build support for any additional applications you may need to tell the linker where to look for the additional libraries for those programs.  The standard location for system libraries is /usr/lib.  If you want the linker to look for additional libraries you must indicate that with the -L option.

CentOS Example
AUXLIBS=’-L/usr/lib’

However, that is not enough because you must also indicate the specific library to link to with the -l option.  Library files start with lib and will have an extension of .a for static libraries, .so for a shared object or .sl for a shared library.  If the -l is used the library is referred to without the lib and without the file extension.  So if you were going to add MySQL and mysqlclient it would look like this:

CentOS Example
AUXLIBS=’-L/usr/lib/mysql -L/usr/lib -lmysqlclient -lz -lm’

CC – Postfix will use the gcc compiler, If you want to use a different one you will need to indicate that specifically.  If you look in the makedefs file you will see this text indicating the default is gcc, “${CC-gcc}”.

CCARGS – This will supply any additional arguments you want to make to the compiler.  This is used to indicate files that you need that are not in default locations.

DEBUG – This will provide debugging levels that you may want to use.  Typically you will want to increase debugging levels when you initially build Postfix for testing and then eliminate it when you build the final version for your production server.

OPT – These are optimization levels that you can set if you need your Postfix Mail Server to function at higher levels.

The compiler options can be set up in using the CCARGS.  The standard location for the header files that you need are in /usr/include.  If you need to indicate an alternative location for header files you would use the CCARGS to indicate that.  The “I” options are used for each additional directory the compiler should use.

CCARGS=’-I/usr/local/include/’

The -D option gives you a method of defining a macro to include support for a particular program you want to include.  So that you could tell Postfix to include support for the MySQL macro, HAS_MYSQL like this:

CCARGS=’DHAS_MYSQL’

If you want to change the location of directories you will need to include the Macro Name and the location where you want to place the directory.

Make makefiles CCARGS=’-DEF_CONFIG_DIR=\”a/location\”’

Parameters whose defaults can be specified in this way are:

Macro name         default value for         typical default
DEF_COMMAND_DIR     command_directory     /usr/sbin
DEF_CONFIG_DIR     config_directory         /etc/postfix
DEF_DAEMON_DIR     daemon_directory         /usr/libexec/postfix
DEF_DATA_DIR         data_directory         /var/lib/postfix
DEF_MAILQ_PATH     mailq_path             /usr/bin/mailq
DEF_HTML_DIR         html_directory         no
DEF_MANPAGE_DIR     manpage_directory         /usr/local/man
DEF_NEWALIAS_PATH     newaliases_path         /usr/bin/newaliases
DEF_QUEUE_DIR         queue_directory         /var/spool/postfix
DEF_README_DIR     readme_directory         no
DEF_SENDMAIL_PATH     sendmail_path         /usr/sbin/sendmail

Parameter Changes for the Environment
When you want to make changes to the parameters you will need to execute the build with two steps so that you can modify the Makefile.  Here is an example of some changes you could make.

make makefiles CCARGS=’-DDEF_COMMAND_DIR=\”/usr/local/sbin\” \
-DDEF_DAEMON_DIR=\”/usr/local/libexec/postfix\” \
-DDEF_MAILQ_PATH=\”/usr/local/bin/mailq\” \
-DDEF_NEWALIAS_PATH=\”/usr/local/bin/newaliases\” \
-DHAS_MYSQL -I/usr/src/mysql/include/mysql’ \
AUXLIBS=’-L/usr/src/mysql/lib/mysql -lmysqlclient’

On any server that you are compiling Postfix on, you need to take into account where the additional programs are that you want to compile with Postfix.  These directories will be in different locations depending upon the distro that you are using.

One application you may want to compile with Postifx is SASL support.  The illustration using CentOS but you can see how you would change directories for Ubuntu or Debian and it can work that way also.   Use yum to find out information on your version as you may have to make changes based on version.  Here you can see cyrus-sasl is version 2.1.22.

yum info cyrus-sasl

Name       : cyrus-sasl
Arch       : i386
Version    : 2.1.22
Release    : 4
Size       : 4.6 M
Repo       : installed
Summary    : The Cyrus SASL library.
URL        : http://asg.web.cmu.edu/sasl/sasl-library.html
License    : Freely Distributable
Description: The cyrus-sasl package contains the Cyrus implementation of SASL. SASL is the Simple Authentication and Security Layer, a method for adding
: authentication support to connection-based protocols.

The following assumes that the Cyrus SASL include files are in /usr/local/
include, and that the Cyrus SASL libraries are in /usr/local/lib.

On some systems this generates the necessary Makefile definitions:

% make tidy # if you have left-over files from a previous build
% make makefiles CCARGS=”-DUSE_SASL_AUTH -DUSE_CYRUS_SASL \
-I/usr/local/include/sasl” AUXLIBS=”-L/usr/local/lib -lsasl2″

(for Cyrus SASL version 2.1.x):

% make tidy # if you have left-over files from a previous build
% make makefiles CCARGS=”-DUSE_SASL_AUTH -DUSE_CYRUS_SASL \
-I/usr/local/include/sasl” AUXLIBS=”-L/usr/local/lib \
-R/usr/local/lib -lsasl2″

Why this won’t work.
ls /usr/include/sasl
hmac-md5.h  md5global.h  md5.h  prop.h  sasl.h  saslplug.h  saslutil.h

Modified
make makefiles CCARGS=”-DUSE_SASL_AUTH -DUSE_CYRUS_SASL \
-I/usr/include/sasl” AUXLIBS=”-L/usr/lib -lsasl2″

make upgrade

ldd `postconf -h daemon_directory`/smtpd
linux-gate.so.1 =>  (0x00bfc000)
libsasl2.so.2 => /usr/lib/libsasl2.so.2 (0×00464000)
libdb-4.3.so => /lib/libdb-4.3.so (0×00110000)
libnsl.so.1 => /lib/libnsl.so.1 (0×00207000)
libresolv.so.2 => /lib/libresolv.so.2 (0x003fc000)
libc.so.6 => /lib/libc.so.6 (0x0021e000)
libdl.so.2 => /lib/libdl.so.2 (0x00d22000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0×00362000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00d28000)
/lib/ld-linux.so.2 (0x00bb9000)

Compile MySQL with Postfix on CentOS

Posted by Filed Under Compile Postfix with Comments Off

CentOs MySQL Support
You may want to use MySQL to store passwords of accounts, especially when you are working with virtual mailboxes.  One thing to note when you do compile Postfix is to make good use of the READMEs are they are very helpful. Be sure that the paths are correct for your distro.  Here you can see the changes necessary for CentOS.

This is in the README
make -f Makefile.init makefiles \
‘CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include’ \
‘AUXLIBS=-L/usr/local/mysql/lib -lmysqlclient -lz -lm’

Modified
make -f Makefile.init makefiles \
‘CCARGS=-DHAS_MYSQL -I/usr/include/mysql -I/usr/include’ \
‘AUXLIBS=-L/usr/lib/mysql -L/usr/lib -lmysqlclient -lz -lm’

ldd `postconf -h daemon_directory`/smtpd
linux-gate.so.1 =>  (0×00940000)
libmysqlclient.so.15 => /usr/lib/mysql/libmysqlclient.so.15 (0×00748000)
libz.so.1 => /usr/lib/libz.so.1 (0x00dd7000)
libm.so.6 => /lib/libm.so.6 (0x00d41000)
libdb-4.3.so => /lib/libdb-4.3.so (0×00411000)
libnsl.so.1 => /lib/libnsl.so.1 (0x001a1000)
libresolv.so.2 => /lib/libresolv.so.2 (0x003fc000)
libc.so.6 => /lib/libc.so.6 (0x00bdc000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x001ba000)
libssl.so.6 => /lib/libssl.so.6 (0×00110000)
libcrypto.so.6 => /lib/libcrypto.so.6 (0x0050a000)
/lib/ld-linux.so.2 (0x00bb9000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00d28000)
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x0064d000)
libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x006b0000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0×00157000)
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0×00688000)
libdl.so.2 => /lib/libdl.so.2 (0x00d22000)
libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x0067d000)
libkeyutils.so.1 => /lib/libkeyutils.so.1 (0x00df8000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00db2000)
libsepol.so.1 => /lib/libsepol.so.1 (0x00d6a000)

Build Postfix From Source on CentOS

Posted by Filed Under Compile Postfix with Comments Off

Building Postfix from source can be a rewarding experience with great results.  This tutorial will show you how to do a basic build and then following tutorials will show you how to build in additional features.
Download Source Code From Here:

http://www.postfix.org/download.html

postfix_source

When you download the source and unpack it you will find a README_FILES directory that contains instructions for the aspects of compiling Postfix.  This  is very valuable information that you must read.  All of the Postfix source files have their own manual page.

AAAREADME                                NFS_README
ADDRESS_CLASS_README                 OVERVIEW
ADDRESS_REWRITING_README         PACKAGE_README
ADDRESS_VERIFICATION_README      PCRE_README
BACKSCATTER_README                   PGSQL_README
BASIC_CONFIGURATION_README       QMQP_README
BUILTIN_FILTER_README                QSHAPE_README
CDB_README                               RELEASE_NOTES
CONNECTION_CACHE_README          RESTRICTION_CLASS_README
CONTENT_INSPECTION_README        SASL_README
CYRUS_README                         SCHEDULER_README
DATABASE_README                      SMTPD_ACCESS_README
DB_README                                SMTPD_POLICY_README
DEBUG_README                         SMTPD_PROXY_README
DSN_README                               SOHO_README
ETRN_README                              STANDARD_CONFIGURATION_README
FILTER_README                            STRESS_README
INSTALL                                  TLS_LEGACY_README
IPV6_README                              TLS_README
LDAP_README                              TUNING_README
LINUX_README                             ULTRIX_README
LOCAL_RECIPIENT_README               UUCP_README
MAILDROP_README                      VERP_README
MILTER_README                        VIRTUAL_README
MULTI_INSTANCE_README                XCLIENT_README
MYSQL_README                         XFORWARD_README

Compile a Basic Postfix
CentOS
Once you have downloaded the source code, move it into the /usr/src directory, other options are available.

mv postfix-2.6.5.tar.gz /usr/lsrc/

Untar the file which will create a directory.
tar zxvf postfix-2.6.5.tar.gz

Move into the new postfix directory.

cd postfix-2.6.5

Install the prerequisites

CentOS
yum install db*-devel

Postfix is built in C so you will be compiling C code.  Usually the options that you want to create for a project are contained in a Makefile.  The make utility creates this Makefile which is used to determine dependencies, any requirements needed or changes you want to create like adding programs or locations of files.  The compiler then takes this information and creates object files and links them together into executables.

However, since Postfix creates its own Makefile, you do not need to edit it at all.  In fact, the problem with editing the Makefile for Postfix is that your edits will get written over.  So, the way to make changes is to use the CCARGS.

Tools You will need

gcc
make

CentOS
yum install gcc make

When you start the dependencies will be located and installed for you.

Installing:
gcc                       i386        4.1.2-44.el5            base           5.2 M
Updating:
glibc                     i686        2.5-34.el5_3.1          updates        5.2 M
glibc-common         i386        2.5-34.el5_3.1          updates         16 M
nscd                      i386        2.5-34.el5_3.1          updates        159 k
Installing for dependencies:
cpp                       i386        4.1.2-44.el5              base           2.7 M
glibc-devel               i386        2.5-34.el5_3.1          updates        2.0 M
glibc-headers          i386        2.5-34.el5_3.1          updates        598 k
kernel-headers       i386        2.6.18-164.el5          updates        993 k
libgomp                   i386        4.3.2-7.el5             base            67 k

Since Postfix does not use  GNU autotools and so does not have the configure script that you may be used to.  Postfix will actually do this work for you by creating it’s own Makefile.   Run make as a normal user.

make

Once the compile is complete you will need to create the user and groups for Postfix.

groupadd postfix
groupadd postdrop

The user postfix needs to have an account that cannot log in and be a part of the postfix group that was created.

CentOS
useradd postfix -c postfix -d /tmp -s /bin/false
postfix:x:500:500:postfix:/tmp:/bin/false

Now run the final command which will allow you to choose directories and locations that you want to use with your installation.  Read each option closely so that when you run the command you have an idea on what you want to change, if anything.  You can take the default settings by choosing ENTER.  Note you will need to run this as root so you have permissions to write to these directories.

make install

Please specify the prefix for installed file names. Specify this ONLY if you are building ready-to-install packages for distribution to other machines.
install_root: [/]

Please specify a directory for scratch files while installing Postfix. You must have write permission in this directory.
tempdir: [/usr/local/src/postfix-2.5.5]

Please specify the final destination directory for installed Postfix configuration files.
config_directory: [/etc/postfix]

Please specify the final destination directory for installed Postfix administrative commands. This directory should be in the command search path of administrative users.
command_directory: [/usr/sbin]

Please specify the final destination directory for installed Postfix daemon programs. This directory should not be in the command search path of any users.
daemon_directory: [/usr/libexec/postfix]

Please specify the final destination directory for Postfix-writable data files such as caches or random numbers. This directory should not be shared with non-Postfix software.
data_directory: [/var/lib/postfix]

Please specify the destination directory for the Postfix HTML files. Specify “no” if you do not want to install these files.
html_directory: [no]

Please specify the owner of the Postfix queue. Specify an account with numerical user ID and group ID values that are not used by any other accounts on the system.
mail_owner: [postfix]

Please specify the final destination pathname for the installed Postfix mailq command. This is the Sendmail-compatible mail queue listing command.
mailq_path: [/usr/bin/mailq]

Please specify the destination directory for the Postfix on-line manual pages. You can no longer specify “no” here.
manpage_directory: [/usr/local/man]

Please specify the final destination pathname for the installed Postfix newaliases command. This is the Sendmail-compatible command to build alias databases for the Postfix local delivery agent.
newaliases_path: [/usr/bin/newaliases]

Please specify the final destination directory for Postfix queues.
queue_directory: [/var/spool/postfix]

Please specify the destination directory for the Postfix README files. Specify “no” if you do not want to install these files.
readme_directory: [no]

Please specify the final destination pathname for the installed Postfix sendmail command. This is the Sendmail-compatible mail posting interface.
sendmail_path: [/usr/sbin/sendmail]

Please specify the group for mail submission and for queue management commands. Specify a group name with a numerical group ID that is not shared with other accounts, not even with the Postfix mail_owner account. You can no longer specify “no” here.
setgid_group: [postdrop]

This should complete a basic setup for Postfix and you can then start postfix with:

/usr/sbin/postfix start

You should see port 25 listening when you run netstat.

netstat -aunt

Default Postfix Install
Here are the basic features compiled in the default Postfix.  You can see several features missing that you may want to compile into Postfix, SASL and MySQL are two that come up often.

ldd `postconf -h daemon_directory`/smtpd
linux-gate.so.1 =>  (0×00601000)
libdb-4.3.so => /lib/libdb-4.3.so (0×00411000)
libnsl.so.1 => /lib/libnsl.so.1 (0x001a1000)
libresolv.so.2 => /lib/libresolv.so.2 (0x003fc000)
libc.so.6 => /lib/libc.so.6 (0x00bdc000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00d28000)
/lib/ld-linux.so.2 (0x00bb9000)

Tools Needed for Building Postfix

Posted by Filed Under Compile Postfix with Comments Off

Postfix is built in C so you will be compiling C code.  Usually the options that you want to create for a project are contained in a Makefile.  The make utility creates this Makefile which is used to determine dependencies, any requirements needed or changes you want to create like adding programs or locations of files.  The compiler then takes this information and creates object files and links them together into executables.

However, since Postfix creates its own Makefile, you do not need to edit it at all.  In fact, the problem with editing the Makefile for Postfix is that your edits will get written over.  So, the way to make changes is to use the CCARGS.

Prerequsites to Install
apt-get install db*-devel
apt-get install libdb-dev

Tools You will need
Usually when you install these basic tools the requirements for those tools will be installed as well.

gcc
make

Debugging Postfix

Posted by Filed Under Compile Postfix with Comments Off

Using strace to Find Problems
The strace command allows you to view the activities of a process.  The first thing you will need to do is locate the process ID that you want to trace.

ps aux | grep postfix

Here is partiial output of what this command will provide:
root      5049  0.0  0.6   5396  1736 ?        Ss   06:25   0:00 /usr/lib/postfix/master
postfix   5050  0.0  0.6   5404  1652 ?        S    06:25   0:00 pickup -l -t fifo -u -c
postfix   5052  0.0  0.7   5444  1832 ?        S    06:25   0:00 qmgr -l -t fifo -u
postfix   5065  0.0  0.9   5772  2460 ?        S    06:30   0:00 tlsmgr -l -t unix -u -c
postfix   5092  0.0  0.9   5544  2316 ?        S    06:40   0:00 smtp -t unix -u -c

Now you can select a process ID, like 5050 and use strace on that PID.

Now as root, use strace.

strace -p 5050
Process 5050 attached – interrupt to quit
alarm(333)                              = 274
time(NULL)                              = 1222519411
epoll_wait(8, {{EPOLLIN, {u32=6, u64=577892986457686022}}}, 100, 41000) = 1
time(NULL)                              = 1222519412
write(5, “\272\23\0\0\1\0\0\0\0\0\0\0″, 12) = 12
read(6, “W”, 1024)                      = 1
open(“maildrop”, O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|0×80000) = 9
fstat64(9, {st_mode=S_IFDIR|S_ISVTX|0730, st_size=4096, …}) = 0
getdents64(9, /* 2 entries */, 4096)    = 48
getdents64(9, /* 0 entries */, 4096)    = 0
close(9)                                = 0
write(5, “\272\23\0\0\1\0\0\0\1\0\0\0″, 12) = 12
time(NULL)                              = 1222519412
alarm(333)                              = 332
time(NULL)                              = 1222519412

Running a Debugger for Postfix
If you are having continual problems with Postfix you can runs  the gdb debugger which does not require a graphical interface.  This is a non-interactive debugger that will print a stack trace if the process crashes.  Edit the main.cf file and add this information.

debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin; export PATH; (echo cont; echo
where; sleep 8640000) | gdb $daemon_directory/$process_name
$process_id 2>&1
>$config_directory/$process_name.$process_id.log & sleep 5

Now edit the master.cf and add the “-D” at the end of the line.  This will run each daemon under the control of the debugger as described in your main.cf file.

smtp      inet  n       -       -       -       -       smtpd -D

Save and restart Postfix.  Now when the process is started an output file will be created and named after the daemon and the process ID.  If the process crashes a stack trace will be written to the logfile.

Building Postfix from Source

Posted by Filed Under Compile Postfix with Comments Off

Before making the decision on whether to build from source or not, it may be best to review a few of the advantages and disadvantages.

Disadvantages
1. Time
It takes time and effort to compile from source.   There are things you will need to learn and problems you will need to fix.  It is just more work to compile from source.
2. Transfer of Knowledge
If your organization does not have a plan to transfer the information on how the compilation was done and a transfer of the skills needed to compile and to maintain Postfix, then do not go down this road.  Company after company starts the process but finds themselves with applications that no one on staff can manage, with no documentation and no staff to solve the problems of updates.  When you compile a program transfer the knowledge through clear documentation and training of subordinates.

Advantages
1. Specific Build Options
When you build from source you can specify each of the options that go into the build process, eliminating options you do not need and adding those options that are most important.  This provides a much smaller and more secure product.
2. Version Freedom
You can download and install any version of Postfix you want to use, you are not tied to the version that is in the repository.

Postfix Basic Build

Posted by Filed Under Compile Postfix with Comments Off

Compile a Basic Postfix
Once you have downloaded the source code, move it into the /usr/local/src directory, other options are available.

Download Source Code From Here:

http://www.postfix.org/download.html

mv postfix-2.5.5.tar.gz /usr/local/src/

Untar the file which will create a directory.
tar zxvf postfix-2.5.5.tar.gz

Move into the new postfix directory.

cd postfix-2.5.5

Install the prerequisites.  These were required on an Ubuntu 8.04 server.

apt-get install db*-devel

apt-get install libdb-dev

Since Postfix does not use  GNU autotools and so does not have the configure script that you may be used to.  Typically the make utility will use a Makefile that will determine the options you want, dependencies and prerequisites.  Postfix will actually do this work for you by creating it’s own Makefile.

make

Once the compile is complete you will need to create the user and groups for Postfix.

groupadd postfix
groupadd postdrop

The user postfix needs to have an account that cannot log in and be a part of the postfix group that was created.

useradd -c postfix -d /tmp -g postfix -s /bin/false postfix

Now run the final command which will allow you to choose directories and locations that you want to use with your installation.  Read each option closely so that when you run the command you have an idea on what you want to change, if anything.  You can take the default settings by choosing ENTER.

make install

Please specify the prefix for installed file names. Specify this ONLY if you are building ready-to-install packages for distribution to other machines.
install_root: [/]

Please specify a directory for scratch files while installing Postfix. You must have write permission in this directory.
tempdir: [/usr/local/src/postfix-2.5.5]

Please specify the final destination directory for installed Postfix configuration files.
config_directory: [/etc/postfix]

Please specify the final destination directory for installed Postfix administrative commands. This directory should be in the command search path of adminstrative users.
command_directory: [/usr/sbin]

Please specify the final destination directory for installed Postfix daemon programs. This directory should not be in the command search path of any users.
daemon_directory: [/usr/libexec/postfix]

Please specify the final destination directory for Postfix-writable data files such as caches or random numbers. This directory should not be shared with non-Postfix software.
data_directory: [/var/lib/postfix]

Please specify the destination directory for the Postfix HTML files. Specify “no” if you do not want to install these files.
html_directory: [no]

Please specify the owner of the Postfix queue. Specify an account with numerical user ID and group ID values that are not used by any other accounts on the system.
mail_owner: [postfix]

Please specify the final destination pathname for the installed Postfix mailq command. This is the Sendmail-compatible mail queue listing command.
mailq_path: [/usr/bin/mailq]

Please specify the destination directory for the Postfix on-line manual pages. You can no longer specify “no” here.
manpage_directory: [/usr/local/man]

Please specify the final destination pathname for the installed Postfix newaliases command. This is the Sendmail-compatible command to build alias databases for the Postfix local delivery agent.
newaliases_path: [/usr/bin/newaliases]

Please specify the final destination directory for Postfix queues.
queue_directory: [/var/spool/postfix]

Please specify the destination directory for the Postfix README files. Specify “no” if you do not want to install these files.
readme_directory: [no]

Please specify the final destination pathname for the installed Postfix sendmail command. This is the Sendmail-compatible mail posting interface.
sendmail_path: [/usr/sbin/sendmail]

Please specify the group for mail submission and for queue management commands. Specify a group name with a numerical group ID that is not shared with other accounts, not even with the Postfix mail_owner account. You can no longer specify “no” here.
setgid_group: [postdrop]

This should complete a basic setup for Postfix and you can then start postfix with:

/usr/sbin/postfix start

You should see port 25 listening when you run netstat.

netstat -aunt