Почему в Ubuntu нет маршрута для localhost?

12
$ sudo docker run --rm ubuntu:14.04 route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.17.42.1     0.0.0.0         UG    0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0

Не означает ли это, что 127.0.0.0/8 направляется к шлюзу 172.17.42.1, а не к устройству обратной связи?

Балаз Рау
источник
Я имел в виду: почему в Ubuntu нет маршрута для обратной связи?
Балаз Рау
Я предполагаю, что явные маршруты для петлевой сети были из прошлого. Увидев ваш вопрос, я посмотрю на некоторые из наших серверов, и в таблице маршрутизации нет маршрутов для обратной связи. Это также справедливо для Solaris 10, а не для Solaris 8 (да, у нас все еще есть несколько коробок с Solaris 8).
alphamikevictor

Ответы:

25

Команда routeустарела и больше не должна использоваться.

Новый способ - использовать набор команд iproute, которые все вызываются с ipпоследующим объектом. Например:

$ ip route show
default via 192.168.1.254 dev eth0 
192.168.0.0/23 dev eth0  proto kernel  scope link  src 192.168.1.27 

Теперь, я слышу, вы говорите, это в основном та же информация! Да, но это еще не все. Перед таблицами маршрутизации (да, множественное число) следует таблица правил:

$ ip rule show
    0:  from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

Таблица маршрутизации, которую мы рассматривали ранее, является mainтаблицей маршрутизации. Ваш вопрос касается localтаблицы маршрутизации, которая содержит все маршруты, относящиеся к локальным соединениям. Эта таблица может быть показана следующим образом:

$ ip ro sh table local
broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1 
local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1 
local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1 
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1 
broadcast 192.168.0.0 dev eth0  proto kernel  scope link  src 192.168.1.27 
local 192.168.1.27 dev eth0  proto kernel  scope host  src 192.168.1.27 
broadcast 192.168.1.255 dev eth0  proto kernel  scope link  src 192.168.1.27

(Вы можете сокращать ipпараметры / параметры, если они все еще уникальны, следовательно, ip ro shсовпадают с ip route show.)

Здесь вы можете увидеть петлевые маршруты.

С помощью этой маршрутизации на основе политик вы можете делать все что угодно, я рекомендую вам прочитать « Маршрутизация политик с Linux » Мэтью Г. Марша, чтобы получить всю необходимую информацию.

wurtel
источник
1
Просто беспокойство по поводу вашей формулировки: его вопрос был на самом деле о маршрутизации для локальных адресов (127.0.0.0/8). table localэто ответ, но не вопрос. Это ответ, потому что трафик на любой адрес 127. * преобразуется в адрес источника 127.0.0.1, и я думаю, что также вынужден использовать dev lo.
Питер Кордес
1
Таким образом, реальный ответ на вопрос «потому что петля особенная и не нужна», это реальный ответ. Ни одна из этих записей таблицы маршрутизации не говорит, например, о том, как маршрутизировать к 127.1.1.1, но это все еще работает (как вы можете сказать из времени пинга). Предположительно, сетевой код в особых случаях использует локальные адреса для повышения производительности, поскольку ip addrне показывает loналичие большего, чем просто 127.0.0.1собственный адрес, но фактически будет принимать трафик для любого ip в 127 ... / 8
Peter Cordes
4
@PeterCordes На самом деле линия local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1покрывает маршрут до 127.1.1.1; это означает, что все, что начинается с 127. является локальным.
wurtel
Ах, хорошо, я не поняла всего, что подразумевалось под localзаписью в localтаблице. Благодарю.
Питер Кордес
2

Команда routeбыла старой с 10 лет назад, и вы должны пойти с iproute2пакетами.

При использовании ip route showв mainтаблице отображается. Для отображения localтаблицы используйте ip route show table local.

Надеюсь, это помогло.

Юлиан
источник