Nie sądzę, aby istniała ostateczna prawidłowa odpowiedź na twoje pytanie. Zamiast tego istnieje wiele sposobów, jak zbliżyć się do tego, co chcesz. Dlatego podam kilka wskazówek, jak to zrobić.
Jeśli maszyna ma więcej niż 2 interfejsy ( lo
liczy się jako jeden), będziesz mieć problemy z łatwym automatycznym wykrywaniem właściwego interfejsu. Oto kilka przepisów, jak to zrobić.
Na przykład problem polega na tym, że hosty znajdują się w strefie DMZ za firewallem NAT, który zmienia publiczny adres IP na prywatny i przekazuje żądania. Twój komputer może mieć 10 interfejsów, ale tylko jeden odpowiada publicznemu.
Nawet autodetekcja nie działa w przypadku podwójnego NAT, w którym zapora sieciowa tłumaczy nawet źródłowy adres IP na coś zupełnie innego. Nie możesz więc być nawet pewien, że trasa domyślna prowadzi do twojego interfejsu z interfejsem publicznym.
Wykryj go domyślną trasą
To jest mój zalecany sposób automatycznego wykrywania rzeczy
Coś jak ip r get 1.1.1.1
zwykle mówi ci interfejs, który ma domyślną trasę.
Jeśli chcesz odtworzyć to w swoim ulubionym języku skryptów / programowania, użyj strace ip r get 1.1.1.1
żółtej cegły i postępuj zgodnie z nią.
Ustaw to za pomocą /etc/hosts
To jest moja rada, jeśli chcesz zachować kontrolę
Możesz utworzyć wpis w /etc/hosts
polubieniu
80.190.1.3 publicinterfaceip
Następnie możesz użyć tego aliasu, publicinterfaceip
aby odnieść się do swojego interfejsu publicznego.
Niestety haproxy
nie rozwiązuje tej sztuczki w przypadku IPv6
Korzystaj ze środowiska
To jest dobre obejście, /etc/hosts
jeśli tak nie jestroot
Tak samo jak /etc/hosts
. ale użyj do tego środowiska. Możesz spróbować /etc/profile
lub ~/.profile
do tego.
Dlatego jeśli twój program potrzebuje zmiennej MYPUBLICIP
, możesz dołączyć kod taki jak (to jest C, możesz stworzyć z niego C ++):
#define MYPUBLICIPENVVAR "MYPUBLICIP"
const char *mypublicip = getenv(MYPUBLICIPENVVAR);
if (!mypublicip) { fprintf(stderr, "please set environment variable %s\n", MYPUBLICIPENVVAR); exit(3); }
Możesz więc wywołać swój skrypt / program w /path/to/your/script
ten sposób
MYPUBLICIP=80.190.1.3 /path/to/your/script
to działa nawet w crontab
.
Wylicz wszystkie interfejsy i wyeliminuj te, których nie chcesz
Desperacki sposób, jeśli nie możesz użyć ip
Jeśli wiesz, czego nie chcesz, możesz wyliczyć wszystkie interfejsy i zignorować wszystkie fałszywe.
Tutaj wydaje się już odpowiedź https://stackoverflow.com/a/265978/490291 dla tego podejścia.
Zrób to jak DLNA
Droga pijaka, który próbuje utopić się w alkoholu
Możesz spróbować wyliczyć wszystkie bramy UPnP w Twojej sieci iw ten sposób znaleźć właściwą trasę dla jakiejś „zewnętrznej” rzeczy. Może to być nawet na trasie, na którą nie wskazuje Twoja domyślna trasa.
Więcej na ten temat można znaleźć na stronie https://en.wikipedia.org/wiki/Internet_Gateway_Device_Protocol
Daje to dobre wrażenie, który z nich jest Twoim prawdziwym publicznym interfejsem, nawet jeśli domyślna trasa prowadzi gdzie indziej.
Jest ich jeszcze więcej
Gdzie góra spotyka proroka
Routery IPv6 ogłaszają się, podając właściwy prefiks IPv6. Spojrzenie na prefiks daje wskazówkę, czy ma jakiś wewnętrzny adres IP, czy globalny.
Możesz nasłuchiwać ramek IGMP lub IBGP, aby znaleźć odpowiednią bramę.
Istnieje mniej niż 2 ^ 32 adresów IP. Dlatego w sieci LAN po prostu pingowanie ich wszystkich nie zajmuje dużo czasu. To daje Ci statystyczną wskazówkę, gdzie z Twojego punktu widzenia znajduje się większość Internetu. Jednak powinieneś być nieco bardziej rozsądny niż słynny https://de.wikipedia.org/wiki/SQL_Slammer
ICMP, a nawet ARP są dobrymi źródłami informacji o paśmie bocznym sieci. To też może ci pomóc.
Możesz użyć adresu rozgłoszeniowego Ethernet, aby skontaktować się ze wszystkimi urządzeniami infrastruktury sieciowej, które często pomagają, jak DHCP (nawet DHCPv6) i tak dalej.
Ta dodatkowa lista jest prawdopodobnie nieskończona i zawsze niekompletna, ponieważ każdy producent urządzeń sieciowych zajmuje się wymyślaniem nowych luk w zabezpieczeniach dotyczących automatycznego wykrywania własnych urządzeń. Co często bardzo pomaga w wykrywaniu publicznego interfejsu, którego nie powinno być.
- powiedział Nuff. Na zewnątrz.