Назад | Перейти на главную страницу

Поиск всех общедоступных адресов IPv4 и IPv6 в сценарии оболочки UNIX

Для целей мониторинга я хотел бы узнать все общедоступные 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
%

P.S. Больше о 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