Я не думаю, что на ваш вопрос есть окончательный правильный ответ. Вместо этого есть большой набор способов, как приблизиться к тому, что вы пожелаете. Поэтому я предоставлю несколько советов, как это сделать.
Если машина имеет более двух интерфейсов (lo
считается одной), у вас возникнут проблемы с автоматическим определением правильного интерфейса. Вот несколько рецептов о том, как это сделать.
Проблема, например, заключается в том, что хосты находятся в DMZ за брандмауэром NAT, который изменяет публичный IP-адрес на некоторый частный IP-адрес и пересылает запросы. Ваша машина может иметь 10 интерфейсов, но только одна соответствует общедоступной.
Даже автоопределение не работает, если вы находитесь на двойном NAT, где ваш брандмауэр даже переводит source-IP во что-то совершенно другое.Поэтому вы даже не можете быть уверены, что маршрут по умолчанию ведет к вашему интерфейсу с открытым интерфейсом.
Обнаружить его через маршрут по умолчанию
Это мой рекомендуемый способ AUTODETECT вещи
Что-то вроде ip r get 1.1.1.1
обычно говорит вам интерфейс, который имеет маршрут по умолчанию.
Если вы хотите заново создать это на своем любимом языке сценариев/программирования, используйте strace ip r get 1.1.1.1
и следуйте по дороге из желтого кирпича.
Установите его с /etc/hosts
Это моя рекомендация, если вы хотите, чтобы остаться в управлении
Вы можете создать запись в /etc/hosts
как
80.190.1.3 publicinterfaceip
Затем вы можете использовать этот псевдоним publicinterfaceip
, чтобы обратиться к вашему общему интерфейсу.
К сожалению haproxy
не обращал внимания на этот трюк с IPv6
Использование среды
Это хороший способ решения /etc/hosts
в случае, если вы не root
Same как /etc/hosts
. но для этого используйте среду. Вы можете попробовать /etc/profile
или ~/.profile
.
Таким образом, если ваша программа нуждается в переменной MYPUBLICIP
, то вы можете включить код, как (это C, не стесняйтесь создавать C++ из него):
#define MYPUBLICIPENVVAR "MYPUBLICIP"
const char *mypublicip = getenv(MYPUBLICIPENVVAR);
if (!mypublicip) { fprintf(stderr, "please set environment variable %s\n", MYPUBLICIPENVVAR); exit(3); }
Таким образом, вы можете позвонить скрипт/программу /path/to/your/script
как это
MYPUBLICIP=80.190.1.3 /path/to/your/script
это работает даже в crontab
.
Перечислите все интерфейсы и устранить те, которые вы не хотите
Отчаянная образом, если вы не можете использовать ip
Если вы знаете, что вы не хотите, вы можете перечислить все интерфейсы и игнорировать все ложные.
Здесь уже есть ответ https://stackoverflow.com/a/265978/490291 для этого подхода.
ли это как DLNA
Путь пьяного человека, который пытается утопиться в спирте
Вы можете попытаться перечислить все UPnP шлюзы в сети, и таким образом выяснить, правильный путь для некоторой «внешней» вещи. Это даже может быть на маршруте, на котором не указан маршрут по умолчанию.
Более подробно об этом, возможно, увидеть https://en.wikipedia.org/wiki/Internet_Gateway_Device_Protocol
Это дает вам хорошее впечатление, которое один ваш реальный публичный интерфейс, даже если ваши точки маршрута по умолчанию в другом месте.
Есть еще
Где гора встречает пророка
IPv6 маршрутизаторы рекламируют себя, чтобы дать вам правильный префикс IPv6. Глядя на префикс, вы получаете подсказку, если у него есть внутренний IP-адрес или глобальный.
Вы можете прослушивать кадры IGMP или IBGP, чтобы найти подходящий шлюз.
Существует менее 2^32 IP-адресов. Следовательно, LAN не требует много времени, чтобы просто пинговать их все. Это дает вам статистический намек на то, где большая часть Интернета находится с вашей точки зрения. Однако вы должны быть немного более разумными, чем знаменитые https://de.wikipedia.org/wiki/SQL_Slammer
ICMP и даже ARP являются хорошими источниками для информации о боковой полосе сети. Это тоже поможет вам.
Вы можете использовать Ethernet-широковещательный адрес для доступа ко всем устройствам сетевой инфраструктуры, которые часто помогают, например, DHCP (даже DHCPv6) и т. Д.
Этот дополнительный список, вероятно, бесконечен и всегда неполный, поскольку каждый производитель сетевых устройств активно изобретает новые дыры в безопасности, касающиеся автоматического обнаружения своих устройств. Это часто помогает в определении того, как обнаружить какой-то публичный интерфейс, где их не должно быть.
'Нафф сказал. Вне.
Зачем отмечать popen ifconfig? Это действительно правильно. Библиотеки меняются, но ifconfig и popen всегда будут там. – 2011-05-18 13:40:37
Нет, `ifconfig`,` route` и т. Д. Устарели для команды `ip`. Теперь вы должны использовать это вместо этого. – Anders 2014-09-12 22:58:14
ifconfig по-прежнему, работает над большим количеством архитектур, чем любой другой подход. Поэтому измените его на ip command.when/если это необходимо. popen все еще лучшее решение. – 2016-09-13 12:54:02