@(#) README.NIS 1.2 96/02/11 17:24:52

> Problem: I have several [machines] with multiple IP addresses, and
> when they try to connect to a daemon with tcp wrapper, they are often
> rejected.  I assume this is due to the -DPARANOID option, and depends
> on which IP address is returned first from the nameserver for a given
> name.   This behavior seems to be random, may depend on ordering in
> the YP host map?

[Note: the situation described below no longer exists. Presently, my
internet gateway uses the same IP address on all interfaces.  To avoid
confusion I have removed the old name wzv-gw.win.tue.nl from the DNS. I
have kept the discussion below for educational reasons].

NIS was not designed to handle multi-homed hosts.  With NIS, each
address should have its own hostname. For example, wzv-gw is my
gateway. It has two interfaces: one connected to the local ethernet,
the other to a serial link. In the NIS it is registered as:

        131.155.210.23  wzv-gw-ether
        131.155.12.78   wzv-gw-slip

In principle, wzv-gw could be the official name of one of these
interfaces, or it could be an alias for both.

The DNS was designed to handle multi-homed hosts. In the DNS my gateway
is registered in zone win.tue.nl, with one name that has two A records:

        wzv-gw  IN      A       131.155.210.23
                IN      A       131.155.12.78

And of course there are PTR records in zones 210.155.131.in-addr.arpa
and 12.155.131.in-addr.arpa that point to wzv-gw.win.tue.nl.

This setup does not cause any problems. You can test your name service
with the two programs below. This is what they say on a local NIS client
(both client and server running SunOS 4.1.3_U1):

        % gethostbyname wzv-gw
        Hostname:       wzv-gw.win.tue.nl
        Aliases:        
        Addresses:      131.155.210.23 131.155.12.78 

        % gethostbyaddr 131.155.210.23
        Hostname:       wzv-gw-ether
        Aliases:        
        Addresses:      131.155.210.23 

        % gethostbyaddr 131.155.12.78
        Hostname:       wzv-gw-slip
        Aliases:        
        Addresses:      131.155.12.78 

Things seem less confusing when seen by a NIS client in a different
domain (both client and server running SunOS 4.1.3_U1):

        % gethostbyname wzv-gw.win.tue.nl
        Hostname:       wzv-gw.win.tue.nl
        Aliases:        
        Addresses:      131.155.210.23 131.155.12.78 

        % gethostbyaddr 131.155.210.23
        Hostname:       wzv-gw.win.tue.nl
        Aliases:        
        Addresses:      131.155.12.78 131.155.210.23

        % gethostbyaddr 131.155.12.78
        Hostname:       wzv-gw.win.tue.nl
        Aliases:        
        Addresses:      131.155.210.23 131.155.12.78

Alas, Solaris 2.4 still has problems. This is what I get on a Solaris
2.4 NIS client, with a SunOS 4.1.3_U1 NIS server:

	% gethostbyname wzv-gw.win.tue.nl
	Hostname:       wzv-gw.win.tue.nl
	Aliases:        131.155.210.23 wzv-gw.win.tue.nl 
	Addresses:      131.155.12.78 

The tcpd source comes with a workaround for this problem. The
workaround is ugly and is not part of the programs attached below.


#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  gethostbyaddr.c gethostbyname.c
# Wrapped by wietse@wzv on Sun Jan  8 17:08:48 1995
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f gethostbyaddr.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"gethostbyaddr.c\"
else
echo shar: Extracting \"gethostbyaddr.c\" \(1073 characters\)
sed "s/^X//" >gethostbyaddr.c <<'END_OF_gethostbyaddr.c'
X /*
X  * gethostbyaddr tester. compile with:
X  * 
X  * cc -o gethostbyaddr gethostbyaddr.c (SunOS 4.x)
X  * 
X  * cc -o gethostbyaddr gethostbyaddr.c -lnsl (SunOS 5.x)
X  * 
X  * run as: gethostbyaddr address
X  * 
X  * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
X  */
X
X#include <sys/types.h>
X#include <sys/socket.h>
X#include <netinet/in.h>
X#include <arpa/inet.h>
X#include <netdb.h>
X#include <stdio.h>
X
Xmain(argc, argv)
Xint     argc;
Xchar  **argv;
X{
X    struct hostent *hp;
X    long    addr;
X
X    if (argc != 2) {
X	fprintf(stderr, "usage: %s i.p.addres\n", argv[0]);
X	exit(1);
X    }
X    addr = inet_addr(argv[1]);
X    if (hp = gethostbyaddr((char *) &addr, sizeof(addr), AF_INET)) {
X	printf("Hostname:\t%s\n", hp->h_name);
X	printf("Aliases:\t");
X	while (hp->h_aliases[0])
X	    printf("%s ", *hp->h_aliases++);
X	printf("\n");
X	printf("Addresses:\t");
X	while (hp->h_addr_list[0])
X	    printf("%s ", inet_ntoa(*(struct in_addr *) * hp->h_addr_list++));
X	printf("\n");
X	exit(0);
X    }
X    fprintf(stderr, "host %s not found\n", argv[1]);
X    exit(1);
X}
END_OF_gethostbyaddr.c
if test 1073 -ne `wc -c <gethostbyaddr.c`; then
    echo shar: \"gethostbyaddr.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f gethostbyname.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"gethostbyname.c\"
else
echo shar: Extracting \"gethostbyname.c\" \(999 characters\)
sed "s/^X//" >gethostbyname.c <<'END_OF_gethostbyname.c'
X /*
X  * gethostbyname tester. compile with:
X  * 
X  * cc -o gethostbyname gethostbyname.c (SunOS 4.x)
X  * 
X  * cc -o gethostbyname gethostbyname.c -lnsl (SunOS 5.x)
X  * 
X  * run as: gethostbyname hostname
X  * 
X  * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
X  */
X#include <sys/types.h>
X#include <sys/socket.h>
X#include <netinet/in.h>
X#include <arpa/inet.h>
X#include <netdb.h>
X#include <stdio.h>
X
Xmain(argc, argv)
Xint     argc;
Xchar  **argv;
X{
X    struct hostent *hp;
X
X    if (argc != 2) {
X	fprintf(stderr, "usage: %s hostname\n", argv[0]);
X	exit(1);
X    }
X    if (hp = gethostbyname(argv[1])) {
X	printf("Hostname:\t%s\n", hp->h_name);
X	printf("Aliases:\t");
X	while (hp->h_aliases[0])
X	    printf("%s ", *hp->h_aliases++);
X	printf("\n");
X	printf("Addresses:\t");
X	while (hp->h_addr_list[0])
X	    printf("%s ", inet_ntoa(*(struct in_addr *) * hp->h_addr_list++));
X	printf("\n");
X	exit(0);
X    } else {
X	fprintf(stderr, "host %s not found\n", argv[1]);
X	exit(1);
X    }
X}
END_OF_gethostbyname.c
if test 999 -ne `wc -c <gethostbyname.c`; then
    echo shar: \"gethostbyname.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of shell archive.
exit 0
