我希望能够通过以下方式获取我使用 PC 访问的网站的公共 IP:
www.google.es - public IP1
www.cdn.facebook.com - public IP2
等等。我认为这应该通过记录 DNS 流量来完成,所以我尝试使用wireshark作为我在另一个答案中找到的解决方案的一部分:
tshark -f "udp port 53" -Y "dns.qry.type == A and dns.flags.response == 0"
然而,这似乎只显示我的路由器和我的机器之间的连接,该列表充满了诸如以下的对:
192.168.200.250 -> 192.168.200.1
192.168.200.1 -> 192.168.200.250`
答案1
您可以在本地安装 DNSmasq 并将此选项添加到 conf 文件中,log-facility=/var/log/dnsmasq.log
log-queries
然后将您的系统设置为使用127.0.0.1
或::1
作为 DNS 解析器,它对我有用。
然后将数据提取为您想要的任何格式,并用它做您想做的事情
或在本地安装 Bind。大多数发行版默认安装的 Bind 将是非自动缓存,并添加一个logging {}
配置块(如 Bind 9 中所述)配置参考)。
答案2
这个小脚本可能会提供您正在寻找的结果。我避免了 DNS 查找,而是更喜欢使用实际的 HTTP 请求(端口 80/http 和 443/https)。
tshark -nlp -f '(port 80 or port 443) and (tcp[tcpflags] & (tcp-syn|tcp-ack)) == (tcp-syn|tcp-ack)' 2>/dev/null |
stdbuf -oL awk '{print $3}' |
while IFS= read -r ip
do
name=$(dig +short -x "$ip")
printf "%-16s%s\n" "$ip" "${name:-$ip}"
done |
uniq
输出示例
212.58.244.27 bbc-vip146.telhc.bbc.co.uk.
78.129.164.123 free.hands.com.
195.20.242.89 195.20.242.89
此代码将仅生成 HTTP 请求的结果,而搜索 DNS 查询将找到任何内容。但是,请注意,它是通过对 IP 地址进行 rDNS 查找来生成名称的,因此您访问的 HTTP 主机名与结果中返回的名称之间并不总是存在直接对应关系。