解释

解释

为了监控目的,我想找出移动战士 UNIX 盒的所有公共 IPv4 和 IPv6 地址。

请注意,这与在 shell 脚本中查找公共 IP 地址由于以下额外要求:

  • 移动战士本身可能根本没有任何公共 IPv4 地址;
  • 它可能有或可能没有 IPv6(但我们只对在实际传出连接中使用的活动 IPv6 感兴趣);
  • 底层互联网连接可能是负载平衡的,细节未知,其中 UDP、TCP、ICMP 和源/目标 IP 地址的组合可能决定将使用哪个上游;我们需要尽力找出所有这样的 IP 地址,以全面了解网关的底层互联网连接,而无需直接访问网关本身。

答案1

解释

我们可以确定通过 DNS 获取公有 IP 地址dig(BIND 的 DNS 查找实用程序),这让我们可以尝试 UDP(使用选项+notcp)和 TCP(+tcp选项),只留下 ICMP。但是,我们可以尝试将所有这些查询发送到多个独立的目标 IPv4 和 IPv6 地址,这样更有可能实现连接的负载平衡,从而返回更多独特的响应。

看起来,-4-6选项的定位与dig根据参数的顺序,也可能进行不同的处理 - 如果位于说明符之后dig@则将其作为硬性要求强制执行;如果位于说明@符之后和/或作为最后一个参数,则将其作为软性要求强制执行(如果缺少 IPv6 连接,则使用 IPv4);下面的代码片段将其用作软性要求,以避免必须实现错误处理。

我们可以用GNU 并行混合搭配这里所涉及的几个命令和选项。

解决方案

这是完整的解决方案:

parallel -kj16 dig -t txt o-o.myaddr.l.google.com +short \
::: @ns{1,2,3,4}.google.com ::: -4 -6 ::: +notcp +tcp

以下是单行的相同代码片段:

parallel -kj16 dig -t txt o-o.myaddr.l.google.com +short ::: @ns{1,2,3,4}.google.com ::: -4 -6 ::: +notcp +tcp

以下是内联的相同代码片段:

parallel -kj16 dig -t txt o-o.myaddr.l.google.com +short ::: @ns{1,2,3,4}.google.com ::: -4 -6 ::: +notcp +tcp


测试

以下是上述内容的演示parallel调用将完成以下任务:

% parallel -k echo dig -t txt o-o.myaddr.l.google.com +short \
? ::: @ns{1,2,3,4}.google.com ::: -4 -6 ::: +notcp +tcp
dig -t txt o-o.myaddr.l.google.com +short @ns1.google.com -4 +notcp
dig -t txt o-o.myaddr.l.google.com +short @ns1.google.com -4 +tcp
dig -t txt o-o.myaddr.l.google.com +short @ns1.google.com -6 +notcp
dig -t txt o-o.myaddr.l.google.com +short @ns1.google.com -6 +tcp
dig -t txt o-o.myaddr.l.google.com +short @ns2.google.com -4 +notcp
dig -t txt o-o.myaddr.l.google.com +short @ns2.google.com -4 +tcp
dig -t txt o-o.myaddr.l.google.com +short @ns2.google.com -6 +notcp
dig -t txt o-o.myaddr.l.google.com +short @ns2.google.com -6 +tcp
dig -t txt o-o.myaddr.l.google.com +short @ns3.google.com -4 +notcp
dig -t txt o-o.myaddr.l.google.com +short @ns3.google.com -4 +tcp
dig -t txt o-o.myaddr.l.google.com +short @ns3.google.com -6 +notcp
dig -t txt o-o.myaddr.l.google.com +short @ns3.google.com -6 +tcp
dig -t txt o-o.myaddr.l.google.com +short @ns4.google.com -4 +notcp
dig -t txt o-o.myaddr.l.google.com +short @ns4.google.com -4 +tcp
dig -t txt o-o.myaddr.l.google.com +short @ns4.google.com -6 +notcp
dig -t txt o-o.myaddr.l.google.com +short @ns4.google.com -6 +tcp
%

PS 更多 GNU Parallel

为了扩展上述解决方案,可以使用以下命令对所有找到的地址执行 whois 和 rDNS 查找;请注意,要使 IPv6 查找在 BSD 和 macOS 上工作,可能必须指定-aARIN、-AAPNIC 或-rRIPE 作为选项whois

parallel -kj16 dig -t txt o-o.myaddr.l.google.com +short ::: @ns{1,2,3,4}.google.com ::: -4 -6 ::: +notcp +tcp | sort -n | uniq | parallel -vk ::: "echo" "host" "whois -a" :::: /dev/stdin

相关内容