Для целей мониторинга я хотел бы узнать все общедоступные IPv4 и IPv6-адреса UNIX-бокса mobile-warrior.
Обратите внимание, что это отличается от Поиск общедоступного IP-адреса в сценарии оболочки из-за следующих дополнительных требований:
Мы можем определить публичный IP-адрес через DNS с участием dig
(утилита поиска DNS от BIND), это позволяет нам попробовать оба UDP (с +notcp
вариант) и TCP (+tcp
option), оставив позади только ICMP. Однако мы можем попробовать отправить все эти запросы на несколько независимых адресов назначения IPv4 и IPv6, что повысит вероятность того, что произойдет балансировка нагрузки соединения и будет возвращено больше уникальных ответов.
Казалось бы, позиционирование -4
и -6
варианты с dig
также могут обрабатываться по-разному в зависимости от порядка аргументов - если они расположены сразу после dig
перед @
спецификатор, то он применяется как жесткое требование; если расположен за @
спецификатор и / или как последний аргумент, тогда он применяется как мягкое требование (IPv4 будет использоваться, если подключение IPv6 отсутствует); приведенный ниже фрагмент использует это как мягкое требование, чтобы избежать реализации обработки ошибок.
Мы можем использовать 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
Вот тот же фрагмент в виде отдельной строки:
parallel -kj16 dig -t txt o-o.myaddr.l.google.com +short ::: @ns{1,2,3,4}.google.com ::: -4 -6 ::: +notcp +tcp
Вот тот же фрагмент SO inline:
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
%
Чтобы расширить наше решение, описанное выше, можно использовать следующее для выполнения поиска 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