Curtis Maurand:
> Feb 19 16:30:29 ispconfig postfix/smtpd[18437]: warning: hostname
> delivery.mailspamprotection.com does not resolve to address
> 108.163.243.188

The problem of testing with nslookup, dig, etc., is that they don't
use the getaddrinfo() system library function that Postfix uses to
look up the remote SMTP client IP address. This uses nsswitch, which
uses nscd or whatever it is called today.

You can test your getaddrinfo() system library function with the
attached test program.

But you will never be able to reproduce the conditions of Feb 19 16:30:29.

BTW This week there was a major bugfix for getaddrinfo() on Linux
systems. So yours has probably been updated.

        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);
}

Reply via email to