为了监控目的,我想找出移动战士 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 上工作,可能必须指定-a
ARIN、-A
APNIC 或-r
RIPE 作为选项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