我一直在使用lpcap并成功接收进出我的计算机的数据包。
但是,我只能获取每个数据包源的HostName和IP地址,而不一定是与之关联的URL。
例如,我将运行我的代码并查看源IP,然后谷歌例如我会看到74.125.226.163和lga15s45-in-f3.1e100.net而不是google.com。
我一直在接收TCP数据包并从IP头信息中获取先验信息。
我之前已经读过,HTTP标头中的AVP经常包含这些信息,但是我不知道如何从TCP信息中获取这些HTTP标头,或者是否有使用lpcap的方法。
底线是否有办法从我的数据包源自哪里读取网址?
包含一些代码供参考。 我的处理方法:
void processPacket(u_char *args, const struct pcap_pkthdr* header, const u_char *packet) {
const struct ip_hdr *ip;
const struct eth_hdr * eth;
char* src;
char* dst;
char src_host[NI_MAXHOST];
char dst_host[NI_MAXHOST];
eth = (struct eth_hdr*)(packet);
ip = (struct ip_hdr*)(packet+SIZE_ETHERNET);
src = inet_ntoa(ip->ip_src);
dst = inet_ntoa(ip->ip_dst);
memset(src_host, 0, NI_MAXHOST);
memset(dst_host, 0, NI_MAXHOST);
getDNS(inet_ntoa(ip->ip_src), src_host);
getDNS(inet_ntoa(ip->ip_dst), dst_host);
printf("Eth Dest Host: %s\n", eth->eth_destHost);
printf("Eth Send Host: %s\n", eth->eth_sendHost);
printf("Source: IP: %s Host: %s\n", inet_ntoa(ip->ip_src), src_host);
printf("Destination: IP: %s Host: %s\n", inet_ntoa(ip->ip_dst), dst_host);
}
这是我的收集方法
int collect(pcap_t *handler, char* device, char* conditions) {
struct pcap_pkthdr pkthdr;
const unsigned char *packet = NULL;
char* args = (char*)malloc(32);
int count = 0;
char errbuf[PCAP_ERRBUF_SIZE];
bpf_u_int32 netaddr = 0, mask=0;
//prepping conditions for collection
memset(errbuf, 0, PCAP_ERRBUF_SIZE);
if (device == NULL) {
printf("Error device not found exiting...");
return -1;
}
//stores network address and mask in netaddr and mask, exits if not found
if (pcap_lookupnet(device, &netaddr, &mask, errbuf) == -1) {
printf("Error net address and mask not found exiting...");
return -1;
}
//opens the session allowing all net traffic to be read, exits if it cannot
handler = pcap_open_live(device, MAXBYTES2CAPTURE, 1, 512, errbuf);
if (pcap_lookupnet(device, &netaddr, &mask, errbuf) == -1) {
printf("Error opening session exiting...");
return -1;
}
if (conditions != NULL) {
printf("Implementing Filter...\n");
if (startFilter(conditions, handler, mask) == -1) {
printf("Error initializing Filter");
return -1;
}
}
//executing collection
printf("Starting loop...\n");
pcap_loop(handler, -1, processPacket, (u_char*)&count);
return -1;
}
答案 0 :(得分:0)
例如,我将运行我的代码并查看源IP,然后谷歌例如我会看到74.125.226.163和lga15s45-in-f3.1e100.net而不是google.com。
你要求的是不可能的。没有任何说明IP地址的反向DNS查找必须与最初在正向DNS查找中使用的域名匹配才能获得有问题的IP地址:
这是因为google.com
可能会因为负载平衡和地理分布原因而解析为大量IP地址。因此,从域名到IP地址存在一对多的关系。
但是,这些IP地址中的每一个(与特定的网络服务器或负载均衡器相关联)在互联网上仍然具有唯一的身份,这可以通过反向查找来证明。因此,(通常)存在从IP地址到其反向DNS查找的一对一关系。
看看这个例子:
C:\Users\Jonathon>nslookup
Default Server: 192.168.1.1
Address: 192.168.1.1
> google.com
Server: 192.168.1.1
Address: 192.168.1.1
Non-authoritative answer:
Name: google.com
Addresses: 2607:f8b0:4009:800::1007
173.194.46.68
173.194.46.69
173.194.46.70
173.194.46.71
173.194.46.72
173.194.46.73
173.194.46.78
173.194.46.64
173.194.46.65
173.194.46.66
173.194.46.67
> 173.194.46.68
Server: 192.168.1.1
Address: 192.168.1.1
Name: ord08s11-in-f4.1e100.net
Address: 173.194.46.68
另一个例子是共享托管服务器,其中一台物理机(以及公共IP地址)用于为许多具有不同域名的网站提供服务。
一个例子:
Forward lookup of several domains:
example-01.com --\
example-02.com ------> 127.64.23.17
example-03.com --/
Reverse lookup:
127.64.23.17 ----> 23-17.www.some-isp.example.com