Originally Published: Friday, 1 June 2001 Author: Earl Peters
Published to: learn_articles_firststep/General Page: 1/1 - [Std View]

Getting Started on Email Services with Linux

Linux.com volunteer Earl Peters delivers a comprehensive explanation of email services on Linux in a networked environment. This articles covers DNS and Sendmail in some detail, including their configuration files, and rounds out with a close look at setting up clients on Windows NT Workstation.

Project Purpose and Overview:

I started this project primarily to learn how to use the Linux operating system in a networked environment. The purpose of this project was to create an e-mail server on Linux, and to have workstations retrieve mail from that server. For the email server I used Slackware Linux 7.1. I used Windows NT Workstation for the workstations. I only set up two different workstations, but you can set up others in the same way I have explained below. The server was given an IP address of 10.5.16.14, while the two workstations were 10.5.16.12 and 10.5.16.15. The gateway system to the Internet had an address of 10.5.16.1.

This document will give you an idea of how to set up a DNS and configure most Windows clients to retrieve mail from a Linux based email server. I would recommend that you have a moderate skill level with the Linux operating system; otherwise some sections may get a little confusing.

Setting Up the DNS Services

First you need a way for your email clients to be able to see each other and more importantly see the mail server itself. There are a few methods you can use to do this, such as adding the correct static IP values to your hosts file in Microsoft Windows and Linux. I've decided to set up a DNS with Linux.

Before I went all-out with the DNS, I made a resolving, caching DNS to make sure I could get the DNS to see out to the Internet. Here's what the following files looked like (the names include the directory in which they should be located):


/etc/named.conf /*
* A simple BIND 8 configuration
*/

options {
directory "/var/named";
};

zone "." {
type hint;
file "root.hints";
};

zone "0.0.127.in-addr.arpa" {
type master;
file "127.0.0";
};

The directory /var/named line tells named where to look for the files specified in this configuration file. The zone "." has two lines. The first line is the type line, which is set to hint. Hint instructs the DNS, if you can't find the address for something, look in the file specified. The second is the file line, which specifies in which file to look. The root.hints> file contains the names and addresses of the primary name servers the Internet uses. The zone 0.0.127.in-addr.arpa has similar lines to the zone "." section, the difference being that it specifies the type as master, which means our DNS is the master DNS for the 127.0.0 IP numbers.


/var/named/root.hints ;
; There might be opening comments here if you already have this file.
; If not don't worry.
;
. 6D IN NS M.ROOT-SERVERS.NET.
. 6D IN NS I.ROOT-SERVERS.NET.
. 6D IN NS E.ROOT-SERVERS.NET.
. 6D IN NS D.ROOT-SERVERS.NET.
. 6D IN NS A.ROOT-SERVERS.NET.
. 6D IN NS H.ROOT-SERVERS.NET.
. 6D IN NS C.ROOT-SERVERS.NET.
. 6D IN NS G.ROOT-SERVERS.NET.
. 6D IN NS F.ROOT-SERVERS.NET.
. 6D IN NS B.ROOT-SERVERS.NET.
. 6D IN NS J.ROOT-SERVERS.NET.
. 6D IN NS K.ROOT-SERVERS.NET.
. 6D IN NS L.ROOT-SERVERS.NET.
;
M.ROOT-SERVERS.NET. 6D IN A 202.12.27.33
I.ROOT-SERVERS.NET. 6D IN A 192.36.148.17
E.ROOT-SERVERS.NET. 6D IN A 192.203.230.10
D.ROOT-SERVERS.NET. 6D IN A 128.8.10.90
A.ROOT-SERVERS.NET. 6D IN A 198.41.0.4
H.ROOT-SERVERS.NET. 6D IN A 128.63.2.53
C.ROOT-SERVERS.NET. 6D IN A 192.33.4.12
G.ROOT-SERVERS.NET. 6D IN A 192.112.36.4
F.ROOT-SERVERS.NET. 6D IN A 192.5.5.241
B.ROOT-SERVERS.NET. 6D IN A 128.9.0.107
J.ROOT-SERVERS.NET. 6D IN A 198.41.0.10
K.ROOT-SERVERS.NET. 6D IN A 193.0.14.129
L.ROOT-SERVERS.NET. 6D IN A 198.32.64.12

This is the root.hints file. You can cut and paste this one if you would like, but the file does need to be updated every once in while. I will explain updating the file in the maintenance section at the bottom of this article.


/var/named/127.0.0 @ IN SOA mail.peters.com. root.mail.peters.com. (
2000070402 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
NS mail.peters.com.

1 PTR localhost.

The explanation for this file is a lengthy one, so I'm going to shorten it and tell you where to get a full explanation. (If you would like to know more I would recommend that you read the DNS HOWTO from the Linux Documentation Project.)

The first line has the mail.peters.com. entry. This specifies what machine this zone comes from. The other part of the first line, root.mail.peters.com, specifies who to send all DNS related email to: root@mail.peters.com. You should have your own email address in here if you are not the super user. The next few lines explain how many seconds to refresh, retry, expire, etc. The NS line specifies what machine is the name server for this zone (the 127.0.0 numbers). The PTR line says that 127.0.0.1 is named localhost. Please note the periods at the end of the names of the machines; those are absolutely necessary! If they weren't there, the name would have peters.com added to the end of it (i.e. mail.peters.com.peters.com.), a mistake that will result in many different errors.

OK, there are only a few things left. Next we need to open the /etc/resolv.conf file. Make sure it looks something like this:


search peters.com
nameserver 127.0.0.1

These entries tell the machine to try to resolve names through itself. When it comes to setting up the other machines, you will want to put in the actual IP number of this machine in instead of the 127.0.0.1. Next, open your rc.inet2 file in the /etc/rc.d directory, scroll down until you see the section that is commented that would normally start "named". Uncomment those lines or add the following:


if [ -x ${NET}/named ]; then
echo -n " named"
${NET}/named
fi

Next, type "named" (without the quotes, of course). Now type in "tail /var/log/messages", and this will display the last few lines of the file. It should say something like "hint zone . loaded successfully", and "master zone "0.0.127.in-addr.arpa" loaded successfully". Basically, you don't want to see anything that remotely resembles an error message.

Testing

Now try pinging, lookups, and digging some addresses. I generally just do it with yahoo.com because I know what addresses I should get back. This is how the commands would look:

dig www.yahoo.com
nslookup www.yahoo.com
ping -c 10 www.yahoo.com

If it seems things are not working correctly, go and read the DNS HOWTO. There may have been updates to named since I've written this.

If this has all worked so far, congratulations! It's now time to make this a real DNS.

Add the following lines to your /etc/named.conf file:

zone "peters.com" {
type master;
file "peters.com";
};

zone "16.5.10.in-addr.arpa" {
type master;
file "10.5.16"
};

Now create the following files in the /var/named directory:

/var/named/peters.com $TTL 86400

@ IN SOA mail.peters.com. root.mail.peters.com. (
2000070603 ;serial
14400 ;refresh - 1 hours
3600 ;retry - 1 hour
864000 ;expire - 10 days
3600 ;minimum ttl - 1 hour
)

peters.com. A 10.5.16.14
; HINFO "Earl's DNS/Mail Server"
TXT "DNS/Mail Server"

mail A 10.5.16.14
MX 10 mail.peters.com.
TXT "Earl's DNS and Mail Server"
NS mail.peters.com.

ntclient1 A 10.5.16.12
TXT "NT 4.0 Workstation"
NS mail.peters.com.



/var/named/10.5.16 $TTL 86400
@ IN SOA peters.com. root.mail.peters.com. (
2000070601 ;serial
14400 ;refresh - 4 hours
3600 ;retry - 1 hour
864000 ;expire - 10 days
3600) ;minimum ttl - 1 hour


NS mail.peters.com.

12 PTR ntclient1.peters.com.
14 PTR mail.peters.com.

I'm going to try to explain this type of file a little more in depth. The first PTR line (12 PTR ntclient1.peters.com.) specifies that ntclient1.peters.com has an IP address of 10.5.16.12. This is how that address is figured out: the zone (16.5.10.in-addr.apra) + PTR. So essentially that mean 10.5.16 + 12 = 10.5.16.12. The address much match the one specified in the peters.com zone file.

Now that you've added those lines, and created the two files, you need to restart named. Do this by typing:

ps -aux | grep named

This will give you the process ID of named and the ps -aux command. Now you can restart the process with the following kill command:

kill -HUP Process ID of named

Now the full DNS should be up and running: Try doing an nslookup of mail.peters.com, you should get a response for it, not an error.

Configuring SENDMAIL

Sendmail is a program automatically installed when you install Linux onto a hard drive. With Slackware, Linux 7.1 the configuration files for sendmail is in the /etc/mail/ directory. If you would like to learn more on sendmail, please visit Sendmail.org. There are only a few files you need to edit.


/etc/mail/sendmail.cf
##################
# local info #
##################

Cwlocalhost
Fw/etc/mail/sendmail.cw

# my official domain name
# ... define this only if sendmail cannot automatically determine your domain
#Dj$w.foo.COM
Djpeters.com

CP.

I had to add the Cwlocalhost line, the Fw/etc/mail/sendmail.cw line, and the Djpeters.com line so that sendmail would accept emails to a person with @peters.com at the end of their address. The sendmail.cw line is a list of aliases that sendmail will accept mail to, and send mail from. The file looked like this:


/etc/mail/sendmail.cw mail
mail.peters.com
peters.com.
localhost

With this file being set up the way it is, if someone sends mail to user@peters.com, the user will get that mail.

I also had to create a file called relay domains. That file is set up so that sendmail will not deliver mail from unfamiliar machines or domains, essentially preventing spam. This is how the file looked:


/etc/mail/relay-domains localhost
127.
peters.com.
10.5.16.14.

There is also a file called aliases in the /etc/mail directory. This file allows you to set up aliases for a user, or a group of users. The syntax for the line is: alias_name: real-user1, real-user2, etc. For example, if you add the line Office: epeters, mweber, root and you then send mail to office@peters.com the message will be delivered to epeters, mweber, and root.

Now that the DNS has been created and sendmail has been configured you're done with the Linux System. The next step is to configure the clients.

Configuring NT 4.0 Workstation to Read and Send Mail Through Linux

First step is to get the machines to use the DNS on the Linux Machine. If you're doing a fresh installation, then you can just add the IP address of the Linux Machine under the DNS tab when you're configuring the NIC (Network Interface Card). When NT is already installed. Follow these steps:

Assuming it's all working so far, next we have to set up the email program to go and get mail from the Linux email server.

Setting up Windows Messaging

If all worked correctly you should be in Windows Messaging, with 1 email from Microsoft.

Configuring Microsoft Outlook Express

Once in Outlook Express:

The next time Outlook goes to get mail it will get it from the Linux server.

Maintenance

The only maintenance task you have to perform is updating you root.hints file (with the exception of adding new systems if you buy them). If you issue the dig command with no arguments, you will get a display of your current root.hints file. If you dig one of the nameservers, you will get an output that looks a lot like a root.hints file. So you can update your file by doing exactly that. This is the command to issue:

dig @e.root-servers.net . ns > root.hints.new

All you need to do is rename root.hints.new to root.hints and then restart your DNS server.

Closing Remarks

You may have found this tutorial is a little confusing. If so, the best suggestion I can give you is to read this a few times, then try implementing it. Developing this tutorial and learning Linux took me three months, and I know there is much more to be learned. This tutorial only scratches the surface of email, you can make an entire career out configuring email servers. If this is something you are serious about, I would definitely suggest learning as much as you can on it before thinking about starting.