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

Эффективный способ обнаружения сети NAT внутри Linux

В 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
  • awk
  • пока
  • завиток
  • читать
  • эхо
  • столбец

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.

Этот прием НЕ является надежным, но, как правило, надежен в зависимости от типов сетей, в которых вы обычно работаете.