В Ubuntu мне нужно определить, является ли сетевой IP-адрес системой NAT (не нужен STUN)
Я подумал, проверить тип диапазона IP-класса следующим образом: Проверьте, находится ли IP-адрес в пространстве частной сети
Но я увидел другой способ, используя NETLINK_ROUTE, чтобы получить локальную IP-систему из таблицы маршрутов сетевого стека ядра.
Сравните этот IP-адрес с внешним IP-маршрутизатором, если они равны, сеть не является нат-системой
В Perl нашел модуль IO :: Socket :: Netlink :: Route, протестировал и работаю
https://metacpan.org/pod/release/PEVANS/Socket-Netlink-Route-0.05/lib/IO/Socket/Netlink/Route.pm
Но читая о маршруте / sbin / ip:
All operations with the ip route command are atomic, so each command will return either RTNETLINK answers
http://linux-ip.net/html/tools-ip-route.html
О Rtnetlink
Rtnetlink allows the kernel's routing tables to be read
https://man7.org/linux/man-pages/man7/rtnetlink.7.html
Я уже использую / sbin / ip route для получения основного ip активной сети, поэтому я хочу избежать установки другого модуля и просто использовал ip route для выполнения системы обнаружения NAT.
Верен ли мой подход?
Мне нравится использовать этот однострочник. Однако для этого требуется несколько стандартных утилит:
ip addr | awk -F"[ /]" '/inet/ {print $2}' | while read IP;do echo -n "$IP -> ";curl -s --interface $IP http://checkip.amazonaws.com || echo -n "curl-error";echo;done | column -t
Этот небольшой однострочный скрипт предназначен для копирования в ваш терминал (я использую TextExpander) и анализа человеком. Вам нужно будет настроить его, чтобы игнорировать localhost и т.д., если вы собираетесь использовать вывод программно.
Он работает, обнаруживая каждый IP-адрес, настроенный на сервере, затем сообщает curl о необходимости привязки к каждому IP-адресу и отправке исходящего запроса. Веб-сервер в AWS прочитает исходный IP-адрес и отправит его вам. Это позволяет сравнивать внутренне настроенный IP-адрес, к которому вы привязаны, с общедоступным IP-адресом, через который был маршрутизирован запрос при привязке к этому IP-адресу.
Если IP-адреса совпадают, это хороший признак того, что вы не используете NAT. (без IP-адресов, таких как localhost). Если IP-адреса не совпадают, это хороший признак того, что вы используете NAT.
Этот прием НЕ является надежным, но, как правило, надежен в зависимости от типов сетей, в которых вы обычно работаете.