Гид по технологиям

Как узнать внешний IP в Linux с помощью curl и dig

7 min read Сеть Обновлено 23 Dec 2025
Внешний IP в Linux: curl и dig
Внешний IP в Linux: curl и dig

Ноутбук на синем фоне с открытой командной строкой Linux.

  • Быстрый способ проверить внешний IP вручную: выполнить в терминале команду curl ifconfig.me или curl ifconfig.me/ip.
  • Более надёжный и скрипт‑дружественный вариант: использовать dig с публичным DNS, например dig @resolver1.opendns.com myip.opendns.com +short.
  • В статье есть рабочие скрипты, варианты с wget, рекомендации по автоматизации, обработке IPv6, отладке и безопасному использованию результата.

Коротко о терминах

  • Внешний IP — адрес, который видит интернет и который назначает провайдер вашему маршрутизатору.
  • Внутренний IP — адрес устройства внутри вашей локальной сети (LAN).
  • NAT — трансляция сетевых адресов, механизм, дающий множеству устройств один внешний IP.

Важно: если ваш провайдер не выдал статический IP, внешний адрес может меняться. Автоматизация и уведомления решают эту проблему.


Быстрая навигация

  • Внутренние и внешние IP-адреса
  • Как найти внешний IP вручную
  • Использование браузера
  • Команда curl
  • Команда dig
  • Применение в скриптах и автоматизация
  • Альтернативные методы и сервисы
  • Отладка и частые ошибки
  • Безопасность и приватность
  • Чек-листы и готовые сниппеты
  • Критерии приёмки и тесты

Внутренние и внешние IP-адреса

IP-адреса идентифицируют устройства в сети. В локальной сети у устройств обычно приватные адреса (например, 192.168.x.x, 10.x.x.x). Ваш роутер/модем получает внешний (публичный) IP от провайдера — именно этот адрес виден серверам в интернете.

Если вы хотите подключиться к домашнему компьютеру извне, вам нужен внешний IP и правильно настроенный проброс портов (port forwarding) на роутере. Если провайдер выдаёт динамический IP, адрес может поменяться при перезагрузке модема.

Скриптовая задача: изнутри сети определить, какой внешний IP видит интернет. Это делается двумя основными путями: опрашивая веб‑сервис или спрашивая DNS‑сервер.


Как найти внешний IP вручную

Нужно обратится к сущности вне вашей сети и спросить: «какой IP я использую?»

Два подхода:

  1. Веб‑сервисы, чей вывод можно получить через браузер или curl/wget.
  2. DNS‑запросы к сервисам, специально предоставляющим ваш адрес (устойчивее для сценариев автоматизации).

Использование браузера

Проще всего — открыть страницу сервиса, который показывает ваш IP, например ifconfig.me, ipinfo.io, icanhazip.com, ipify.org и т. п. Но браузерный способ неудобен для автоматизации и зависит от доступности сайта.

Сайт ifconfig.me с показом внешнего IP.

Некоторые сайты предлагают примеры команд curl/wget прямо на странице.

Пример набора команд curl на сайте ifconfig.me.

Преимущества и недостатки веб‑сервисов

  • Плюсы: просто, часто возвращают и дополнительную информацию (геолокация, ASN).
  • Минусы: сайту может измениться формат вывода, он может уйти в офлайн, или начать требовать JavaScript/авторизацию, что сломает скрипт.

Команда curl

curl — удобный инструмент для запросов HTTP(S). На Fedora/Ubuntu он часто уже установлен, на некоторых дистрибутивах его нужно установить вручную.

Установка:

# Ubuntu/Debian
sudo apt install curl

# Manjaro/Arch
sudo pacman -S curl

Простейшая команда для получения IP:

curl ifconfig.me

Лучше запрашивать явно поле ip:

curl ifconfig.me/ip

Или использовать тихий режим, чтобы curl не выводил прогресс:

curl -s ifconfig.me

curl возвращает текстовую строку с IP. Если формат изменится, ваш скрипт может начать обрабатывать неверный вывод, поэтому curl удобен, но менее стабилен, чем запрос к DNS‑сервису.


Команда dig (рекомендуется для надёжности)

dig опрашивает DNS‑сервер и может вернуть ваш внешний IP через специально настроенные DNS‑записи. Для таких задач используют публичные DNS‑сервисы с именами типа myip.opendns.com.

Установка на Arch/Manjaro:

sudo pacman -S bind-tools

Пример команды:

dig @resolver1.opendns.com myip.opendns.com +short

Здесь:

  • @resolver1.opendns.com — DNS‑сервер OpenDNS (CISCO).
  • myip.opendns.com — специальное имя, которое возвращает IP вызывающего клиента.
  • +short — выводит только короткую строку с ответом (без дополнительной информации).

dig обычно надёжнее для автоматизации, поскольку DNS‑ответы более стабильны по формату, чем HTML‑страницы.


Использование в скриптах

Частая задача — сохранить внешний IP в переменную и использовать её дальше. Примеры на Bash.

С curl:

#!/bin/bash

extaddr=$(curl -s ifconfig.me)

echo "Внешний IP: $extaddr (через curl)"

С dig:

#!/bin/bash

extaddr=$(dig @resolver1.opendns.com myip.opendns.com +short)

echo "Внешний IP: $extaddr (через dig)"

Скрипты сохраняют строку IP без лишних символов. В переменной не будет лишней новой строки при правильном использовании command substitution.

Пример удобной функции в скрипте, которая пробует несколько методов и выбирает первый успешный:

get_external_ip() {
  # Попытка 1: dig
  ip=$(dig @resolver1.opendns.com myip.opendns.com +short 2>/dev/null | tr -d '\n')
  if [[ -n "$ip" ]]; then
    echo "$ip"
    return 0
  fi

  # Попытка 2: curl
  ip=$(curl -s --connect-timeout 5 ifconfig.me 2>/dev/null | tr -d '\n')
  if [[ -n "$ip" ]]; then
    echo "$ip"
    return 0
  fi

  # Попытка 3: альтернативный сайт
  ip=$(curl -s --connect-timeout 5 https://api.ipify.org 2>/dev/null | tr -d '\n')
  if [[ -n "$ip" ]]; then
    echo "$ip"
    return 0
  fi

  return 1
}

extip=$(get_external_ip)
if [[ $? -ne 0 ]]; then
  echo "Не удалось определить внешний IP" >&2
  exit 1
fi

echo "Найден внешний IP: $extip"

Эта функция последовательно пробует несколько источников и возвращает первый рабочий.


Автоматизация и нотификации

Если внешний адрес важен (например, для удалённого доступа или динамического DNS), автоматизируйте проверку и отправку уведомлений при смене IP.

Варианты выкладки:

  • Скрипт + cron: периодически проверять IP и при изменении записывать в файл и отправлять email/телеграм/Slack.
  • systemd timer вместо cron для более точного управления в современных системах.
  • Использовать готовые клиенты динамического DNS у провайдера или сторонних сервисов.

Пример простого cron‑скрипта, отправляющего письмо при изменении IP:

#!/bin/bash
statefile=/var/tmp/current_external_ip
new=$(get_external_ip) || exit 1
old=$(cat "$statefile" 2>/dev/null || echo "")
if [[ "$new" != "$old" ]]; then
  echo "$new" > "$statefile"
  echo "IP changed to $new" | mail -s "IP changed" admin@example.com
fi

Внимание: для отправки почты на сервере должен быть настроен MTA или использовать внешние API.


Альтернативные методы и сервисы

Если dig и ifconfig.me вам не подходят, есть и другие способы:

  • curl https://api.ipify.org
  • curl https://ifconfig.co/ip
  • curl https://icanhazip.com
  • wget -qO- https://api.ipify.org
  • Использование STUN (протокол для обнаружения публичного адреса в P2P) — для специфичных сценариев VoIP/RTC.
  • DNS‑запросы к google: dig TXT +short o-o.myaddr.l.google.com @ns1.google.com — устаревшие и неофициальные приёмы; не все DNS это поддерживают.

Каждый сервис имеет свои преимущества и ограничениия: скорость, политика логирования, лимиты запросов.


Проблемы и отладка

Частые проблемы и как их диагностировать:

  • Пустой вывод или ошибка подключения: проверьте сетевое соединение, DNS и наличие утилит.
  • Не тот адрес: если у вас несколько провайдеров или VPN, внешний IP будет адресом интерфейса, через который ушёл запрос.
  • Возврат IPv6 вместо IPv4: некоторые сервисы и dig могут возвращать IPv6; уточните, нужен ли вам конкретный стек.
  • Формат вывода изменился: парсите аккуратно, применяйте регулярные выражения для проверки корректности IP.

Отладка:

  • Выполните команды вручную с опцией verbose: curl -v, dig +trace.
  • Посмотрите, какой интерфейс используется для исходящих соединений: ip route get 1.1.1.1
  • Проверяйте вывод через head/xxd, чтобы увидеть невидимые символы.

IPv6: что менять

Если вам нужен внешний IPv6, некоторые сервисы возвращают его по умолчанию. Для dig убедитесь, что вы делаете запрос по UDP/IPv6 или используете сервис, который сообщает IPv6 адрес.

Пример с ipify для IPv6:

curl -6 -s https://api6.ipify.org

Безопасность и приватность

  • Любой сервис, к которому вы обращаетесь, фиксирует ваш IP и время запроса. Учитывайте это при конфиденциальных задачах.
  • Используйте HTTPS, чтобы избежать MitM при запросе сайтов. Для dig используйте доверенный DNS‑сервер.
  • Не публикуйте постоянный лог с вашим внешним IP в открытом доступе — это может облегчить нежелательные подключения.

Примечание: некоторые провайдеры предоставляют API для получения текущего IP и управления динамическим DNS — это более приватный и контролируемый путь.


Чек-лист для ролей

  • Администратор:

    • Убедиться в стабильности источника (dig + публичный DNS).
    • Настроить мониторинг и оповещения.
    • Задокументировать процедуру восстановления доступа при смене IP.
  • Разработчик/DevOps:

    • Включить функцию get_external_ip в CI/скрипты развертывания.
    • Тестировать поведение при отсутствии сети.
    • Логировать только хеши IP, если нужно снижение риска утечки.
  • Домашний пользователь:

    • Использовать curl/ifconfig.me для быстрого просмотра.
    • Настроить DDNS, если нужен удалённый доступ без ручного отслеживания IP.

Сниппеты и готовые шаблоны

  1. Быстрый однострочник с wget:
wget -qO- https://api.ipify.org
  1. systemd timer и unit для периодической проверки IP — краткий план:
  • unit service: /etc/systemd/system/check-ip.service — запускает скрипт check-ip.sh
  • timer: /etc/systemd/system/check-ip.timer — запускает каждый 30 минут
  1. Шаблон уведомления в Telegram через бот (использовать токен и chat_id):
notify_telegram() {
  local token=""
  local chat_id=""
  local msg="$1"
  curl -s -X POST "https://api.telegram.org/bot${token}/sendMessage" -d chat_id="$chat_id" -d text="$msg"
}

Критерии приёмки

  1. Скрипт возвращает валидный IPv4 или IPv6 адрес в 95% случаев при наличии интернета.
  2. Скрипт завершает работу за приемлемое время (обычно < 10 секунд) или корректно сообщает таймаут.
  3. При смене IP генерируется уведомление или обновляется DDNS запись.
  4. Логи не содержат чувствительных данных пользователя в открытом виде.

Тесты и случаи использования

  • Тест 1: Без интернета — скрипт должен завершиться с ошибкой и сообщением.
  • Тест 2: Через VPN — должен вернуть IP VPN сервера.
  • Тест 3: Сочетание IPv4/IPv6 — вернуть нужный стек при заданном флагe.
  • Тест 4: Изменение формата вывода стороннего сайта — скрипт должен использовать резервный источник.

Модель принятия решения (Mermaid)

flowchart TD
  A[Нужно узнать внешний IP?] --> B{Есть dig и доступ к DNS?}
  B -- Да --> C[dig @resolver1.opendns.com myip.opendns.com +short]
  B -- Нет --> D{Есть curl/wget?}
  D -- Да --> E[curl -s ifconfig.me/ip или api.ipify.org]
  D -- Нет --> F[Использовать web-браузер]
  C --> G[Проверить формат и использовать в скрипте]
  E --> G
  F --> G

Резюме

  • Для автоматизации и надёжности используйте dig и публичный DNS (OpenDNS, др.).
  • curl и wget подходят для быстрых ручных проверок и простых скриптов, но зависят от доступности сайтов.
  • Для постоянного удалённого доступа лучше настроить DDNS и оповещения при смене IP.

Если нужно, могу подготовить готовый systemd unit, cron правило или подробную инструкцию по настройке уведомлений (почта/Telegram/Slack) для вашей конкретной системы.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Форма ввода данных в LibreOffice Base
Инструкции

Форма ввода данных в LibreOffice Base

Изменить дату и время на iPhone — ручная настройка
Инструкции

Изменить дату и время на iPhone — ручная настройка

Как скачать Amazon Prime Video и смотреть офлайн
Видео

Как скачать Amazon Prime Video и смотреть офлайн

Фоны и 3D для портретов в Midjourney
Фотография

Фоны и 3D для портретов в Midjourney

Как безопасно очистить Nintendo Switch
Gaming

Как безопасно очистить Nintendo Switch

Как продлить время работы батареи iPhone и iPad
Батарея

Как продлить время работы батареи iPhone и iPad