Dave Jones:
> >On 9/16/2013 5:41 PM, Dave Jones wrote:
> >>
> >> Received: from mail02.corp.ena.net (unknown [96.4.3.90])
> >>      by mr11.mail.ena.net (Postfix) with ESMTP id 57C091480688
> >>      for <redac...@domain.com>; Mon, 16 Sep 2013 16:04:46 -0500 (CDT)
> >>
> >> My forward DNS lookup for this host is an internal IP address that
> >> doesn't not match the public but it has been this way for years.
> 
> > You need to do your tests as the postfix user, possibly also
> > chrooted.  Turn off the chroot flag in master.cf for testing.
> 
> I don't have anything chrooted (all n's in that column of the master.cf).
> The dig as the postfix user returns the same result.

First, I can't fail to notice that the PTR record for 96.4.3.90
says "mail02.corp.ena.net.", but the A record for "mail02.corp.ena.net."
resolves to 172.27.0.25. Therefore, it is no surprise that Postfix
uses the name "unknown" instead of "mail02.corp.ena.net".

Second, Postfix does not query DNS to determine the SMTP client
hostname. Instead, Postfix uses the system library getnameinfo()
and getaddrinfo() routines. Attached are small programs that
you can run to see what result Postfix would get.

Again, if the address->name result is not consistent with the
name->address result, Postfix will use "unknown" instead.

        Wietse
 /*
  * getaddrinfo(3) (name->address lookup) tester.
  * 
  * Compile with:
  * 
  * cc -o getaddrinfo getaddrinfo.c (BSD, Linux)
  * 
  * cc -o getaddrinfo getaddrinfo.c -lsocket -lnsl (SunOS 5.x)
  * 
  * Run as: getaddrinfo hostname
  * 
  * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
  * 
  * Author: Wietse Venema, IBM T.J. Watson Research, USA.
  */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int     main(int argc, char **argv)
{
    char    hostbuf[NI_MAXHOST];        /* XXX */
    struct addrinfo hints;
    struct addrinfo *res0;
    struct addrinfo *res;
    const char *addr;
    int     err;

#define NO_SERVICE ((char *) 0)

    if (argc != 2) {
        fprintf(stderr, "usage: %s hostname\n", argv[0]);
        exit(1);
    }
    memset((char *) &hints, 0, sizeof(hints));
    hints.ai_family = PF_UNSPEC;
    hints.ai_flags = AI_CANONNAME;
    hints.ai_socktype = SOCK_STREAM;
    if ((err = getaddrinfo(argv[1], NO_SERVICE, &hints, &res0)) != 0) {
        fprintf(stderr, "host %s not found: %s\n", argv[1], gai_strerror(err));
        exit(1);
    }
    printf("Hostname:\t%s\n", res0->ai_canonname);
    printf("Addresses:\t");
    for (res = res0; res != 0; res = res->ai_next) {
        addr = (res->ai_family == AF_INET ?
                (char *) &((struct sockaddr_in *) res->ai_addr)->sin_addr :
                (char *) &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr);
        if (inet_ntop(res->ai_family, addr, hostbuf, sizeof(hostbuf)) == 0) {
            perror("inet_ntop:");
            exit(1);
        }
        printf("%s ", hostbuf);
    }
    printf("\n");
    freeaddrinfo(res0);
    exit(0);
}
 /*
  * getnameinfo(3) (address->name lookup) tester.
  * 
  * Compile with:
  * 
  * cc -o getnameinfo getnameinfo.c (BSD, Linux)
  * 
  * cc -o getnameinfo getnameinfo.c -lsocket -lnsl (SunOS 5.x)
  * 
  * Run as: getnameinfo address
  * 
  * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
  * 
  * Author: Wietse Venema, IBM T.J. Watson Research, USA.
  */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int     main(int argc, char **argv)
{
    char    hostbuf[NI_MAXHOST];        /* XXX */
    struct addrinfo hints;
    struct addrinfo *res0;
    struct addrinfo *res;
    const char *host;
    const char *addr;
    int     err;

#define NO_SERVICE ((char *) 0)

    if (argc != 2) {
        fprintf(stderr, "usage: %s ipaddres\n", argv[0]);
        exit(1);
    }

    /*
     * Convert address to internal form.
     */
    host = argv[1];
    memset((char *) &hints, 0, sizeof(hints));
    hints.ai_family = (strchr(host, ':') ? AF_INET6 : AF_INET);
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags |= AI_NUMERICHOST;
    if ((err = getaddrinfo(host, NO_SERVICE, &hints, &res0)) != 0) {
        fprintf(stderr, "getaddrinfo %s: %s\n", host, gai_strerror(err));
        exit(1);
    }

    /*
     * Convert host address to name.
     */
    for (res = res0; res != 0; res = res->ai_next) {
        err = getnameinfo(res->ai_addr, res->ai_addrlen,
                          hostbuf, sizeof(hostbuf),
                          NO_SERVICE, 0, NI_NAMEREQD);
        if (err) {
            fprintf(stderr, "getnameinfo %s: %s\n", host, gai_strerror(err));
            exit(1);
        }
        printf("Hostname:\t%s\n", hostbuf);
        addr = (res->ai_family == AF_INET ?
                (char *) &((struct sockaddr_in *) res->ai_addr)->sin_addr :
                (char *) &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr);
        if (inet_ntop(res->ai_family, addr, hostbuf, sizeof(hostbuf)) == 0) {
            perror("inet_ntop:");
            exit(1);
        }
        printf("Address:\t%s\n", hostbuf);
    }
    freeaddrinfo(res0);
    exit(0);
}

Reply via email to