Skip to content

Instantly share code, notes, and snippets.

@itochan
Last active July 17, 2017 05:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save itochan/4b1f26ce0133d7592faaf1968408c36e to your computer and use it in GitHub Desktop.
Save itochan/4b1f26ce0133d7592faaf1968408c36e to your computer and use it in GitHub Desktop.
syspro17 final

ptrhost

DNSの正引きをして逆引きをするプログラムを書きました。 正引き→逆引きをすることで、逆引きホスト名から得られる情報によってどこでホスティングさ れているかといった情報を見ることができます。 (例: Amazon EC2のようなIaaSでは逆引きホストを設定している例は少なく、EC2でホストさ れていることがわかる) getaddrinfo(), getnameinfo() を使っているのでIPv4/v6両方に対応しています。

動作例

% ./ptrhost www.google.com
[v6] ::2404:6800:4004:807:0:0 -> not resolved
[v4] 172.217.27.68 -> nrt12s15-in-f68.1e100.net
% ./ptrhost yahoo.co.jp
[v4] 182.22.59.229 -> f1.top.vip.ssk.yahoo.co.jp
[v4] 183.79.135.206 -> f1.top.vip.kks.yahoo.co.jp
#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <stdlib.h>
#include <arpa/inet.h>
int main(int argc, char *argv[]) {
struct addrinfo hints;
struct addrinfo *result = NULL;
int err;
if (argc != 2) {
fprintf(stderr, "Usage: %s [hostname]\n", argv[0]);
exit(EXIT_FAILURE);
}
char *hostname = argv[1];
memset(&hints, 0, sizeof(hints));
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AF_UNSPEC;
if ((err = getaddrinfo(hostname, NULL, &hints, &result)) != 0) {
fprintf(stderr, "getaddrinfo(): %s\n", gai_strerror(err));
exit(EXIT_FAILURE);
};
struct addrinfo *rp;
int i;
for (rp = result, i = 0; rp != NULL; rp = rp->ai_next, i++) {
char resolve_addr[INET6_ADDRSTRLEN];
char reverse_addr[INET6_ADDRSTRLEN];
inet_ntop(rp->ai_family, &((struct sockaddr_in *) rp->ai_addr)->sin_addr, resolve_addr, sizeof(resolve_addr));
struct sockaddr *sa;
socklen_t len;
char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
struct sockaddr_in resolve_sockaddr;
resolve_sockaddr.sin_family = ((struct sockaddr_in *) rp->ai_addr)->sin_family;
resolve_sockaddr.sin_addr = ((struct sockaddr_in *) rp->ai_addr)->sin_addr;
if (getnameinfo((const struct sockaddr *) &resolve_sockaddr, len,
hbuf, sizeof(hbuf), NULL, 0, NI_NAMEREQD) == 0) {
strcpy(reverse_addr, hbuf);
} else {
strcpy(reverse_addr, "not resolved");
}
char *type;
switch (rp->ai_family) {
case AF_INET:
type = "v4";
break;
case AF_INET6:
type = "v6";
break;
default:
break;
}
printf("[%s] %s -> %s\n", type, resolve_addr, reverse_addr);
}
freeaddrinfo(result);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment