在 UNIX shell 脚本中查找所有公共 IPv4 和 IPv6 地址

cns*_*nst 5 ipv6 load-balancing ip-address xargs ipv4

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

请注意,这与在 shell 脚本中查找公共 IP 地址不同,因为有以下额外要求:

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

cns*_*nst 5

解释

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

似乎根据参数的顺序, the-4-6options with的定位dig也可能会有不同的处理——如果定位dig在说明@符之前,那么它被强制执行为硬性要求;如果定位在@说明符之后和/或作为最后一个参数,则它作为软要求强制执行(如果缺少 IPv6 连接,将使用 IPv4);下面的代码片段将其用作软要求,以避免必须实现错误处理。

我们可以使用GNU Parallel来混合和匹配这里有风险的几个命令和选项。

解决方案

这是完整的解决方案:

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

这是与单行相同的代码段:

parallel -kj16 dig -t txt o-o.myaddr.l.google.com +short ::: @ns{1,2,3,4}.google.com ::: -4 -6 ::: +notcp +tcp
Run Code Online (Sandbox Code Playgroud)

这是内联的相同片段:

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
%
Run Code Online (Sandbox Code Playgroud)

PS 更多 GNU Parallel

为了扩展我们上面的解决方案,以下内容可用于对所有找到的地址执行 whois 和 rDNS 查找;请注意,要在 BSD 和 macOS 上使用 IPv6 查找,可能必须指定-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