Jump to content

Трассировка через туннель


Recommended Posts

Дано: туннель IPIP over IPsec через интернет. Туннель работает, но напрягает сломанная трассировка через туннель. На стенде из пары роутеров не воспроизводилось, начал ковырять дальше и таки выяснил причину - при трассировке через IPIPoverIPsec туннель TTL=1 выставялется для "внешнего" пакета, как следствие, time exceeded приходит от провайдера! На tcpdump ISP это выглядит условно так:

19:23:42.163312 IP (tos 0x0, ttl 1, id 0, offset 0, flags [DF], proto ESP (50), length 152)
    localrouter > remoterouter: ESP(spi=0x11111111,seq=0x11), length 132
19:23:42.164677 IP (tos 0x0, ttl 30, id 0, offset 0, flags [none], proto ICMP (1), length 56)
    isp-gateway > localrouter: ICMP time exceeded in-transit, length 36
        IP (tos 0x0, id 0, offset 0, flags [DF], proto ESP (50), length 152, bad cksum 82e0 (->83e0)!)

При этом при пинге удаленного конца туннеля видим, что внешний пакет приходит с TTL равен исходящему минус количество внешних хопов, однако в развернутом пакете TTL равен исходящему минус 1.

Вопрос - возможно ли его изменить, чтобы исходящий пакет уходил с нормальным TTL, не взирая на TTL заворачиваемого пакета?

Edited by KorDen
Link to comment
Share on other sites

1 час назад, KorDen сказал:

возможно ли его изменить, чтобы исходящий пакет уходил с нормальным TTL, не взирая на TTL заворачиваемого пакета?

Отвечу себе же на свой же вопрос:

ipip0: ip/ip  remote 1.2.3.4  local 5.6.7.8  ttl inherit

Короче говоря, "ip tunnel change ipip0 ttl 64" решает проблему. Остается вопрос - как перманентно установить TTL для исходящего туннельного пакета из CLI? ip adjust-ttl устанавливает не то что нужно...

Похоже это в фичреквесты добавления команды типа interface tunnel ttl как минимум для IPIP и GRE (с EoIP непонятно, поскольку RFC-подобного описания сходу не нашел), которая будет устанавливать TTL внешнего пакета. @Le ecureuil...?

 

P.S.: временно решил проблему через /opt/etc/ndm/ifstatechanged.d:

#!/bin/sh
[ "$system_name" != "ipip0" ] && exit 0
ip tunnel change ipip0 ttl 64
Edited by KorDen
Link to comment
Share on other sites

41 минуту назад, Le ecureuil сказал:

так нужно inherit сделать, или фиксированное значение а-ля 64?

Для большинства случаев использования туннелей в роутерах нужно фиксированное значение а-ля 64. По-умолчанию же идет inherit. По RFC2003 "The Time To Live (TTL) field in the outer IP header is set to a value appropriate for delivery of the encapsulated datagram to the tunnel exit point.", но linux ставит inherit если параметр ttl отсутствует при создании туннеля.

В качестве быстрого фикса установка того же 64 закроет вопрос. Аналогично по идее и для GRE, за EoIP не скажу. Но в идеале бы хотелось бы видеть опцию для настройки, хоть и не обязательно..

Edited by KorDen
Link to comment
Share on other sites

В 29.06.2018 в 22:06, KorDen сказал:

Для большинства случаев использования туннелей в роутерах нужно фиксированное значение а-ля 64. По-умолчанию же идет inherit. По RFC2003 "The Time To Live (TTL) field in the outer IP header is set to a value appropriate for delivery of the encapsulated datagram to the tunnel exit point.", но linux ставит inherit если параметр ttl отсутствует при создании туннеля.

В качестве быстрого фикса установка того же 64 закроет вопрос. Аналогично по идее и для GRE, за EoIP не скажу. Но в идеале бы хотелось бы видеть опцию для настройки, хоть и не обязательно..

Сейчас сделал, что явно забито IPDEFTTL (оно же равно 64 в большинстве реализаций). Появится в следующем draft.

Если будет работать нормально - перетащу во все остальные ветки.

  • Thanks 1
Link to comment
Share on other sites

  • 1 year later...

По мотивам данной темы, из чата: аналогичная проблема с туннелями 6in4, тоже желательно хотя бы IPDEFTTL вместо inherit

  • Thanks 1
  • Upvote 1
Link to comment
Share on other sites

16 минут назад, KorDen сказал:

По мотивам данной темы, из чата: аналогичная проблема с туннелями 6in4, тоже желательно хотя бы IPDEFTTL вместо inherit

На всякий случай мой запрос по этой теме #446611. Если я ничего не путаю, то @vst там в копии.

  • Thanks 1
Link to comment
Share on other sites

@Le ecureuil, большое спасибо, особенно за скорость :)

Если можно, пара вопросов:

  1. Я правильно понимаю, что изменения появятся в следующем обновлении 3.1?
  2. Ваш коллега из поддержки написал в запросе, что будет добавлена команда в CLI для управления значениями TTL и MTU на интерфейсе TunnelSixInFour. Теперь не ждать её появления?
Link to comment
Share on other sites

8 минут назад, rustrict сказал:

@Le ecureuil, большое спасибо, особенно за скорость :)

Если можно, пара вопросов:

  1. Я правильно понимаю, что изменения появятся в следующем обновлении 3.1?
  2. Ваш коллега из поддержки написал в запросе, что будет добавлена команда в CLI для управления значениями TTL и MTU на интерфейсе TunnelSixInFour. Теперь не ждать её появления?

Команда уже вроде есть (если мне память не изменяет). Их точно нет?
Появится в 2.11, 2.15, 3.01 и в следующих.

Link to comment
Share on other sites

Простите, да, для MTU команда interface ip mtu работает. Но для TTL я ничего в справочнике не вижу, а ip adjust-ttl send неприменима для TunnelSixInFour:

(config)> interface TunnelSixInFour0
Core::Configurator: Done.
(config-if)> ip adjust-ttl send 64
Network::Interface::Repository error[6553609]: unable to find TunnelSixInFour0 as "Network::Interface::IP".

В запросе мне ваш коллега так описал команду:

interface TunnelSixInFour0 ip
	mtu - set Maximum Transmit Unit size
	remote - set a remote peer address
	ttl - set Time to live value

interface ip ttl — такой команды как раз сейчас нет.

Edited by rustrict
русский язык :)
Link to comment
Share on other sites

10 минут назад, rustrict сказал:

Простите, да, для MTU команда interface ip mtu работает. Но для TTL я ничего в справочнике не вижу, а ip adjust-ttl send неприменима для TunnelSixInFour:


(config)> interface TunnelSixInFour0
Core::Configurator: Done.
(config-if)> ip adjust-ttl send 64
Network::Interface::Repository error[6553609]: unable to find TunnelSixInFour0 as "Network::Interface::IP".

В запросе мне ваш коллега так описал команду:


interface TunnelSixInFour0 ip
	mtu - set Maximum Transmit Unit size
	remote - set a remote peer address
	ttl - set Time to live value

interface ip ttl — такой команды как раз сейчас нет.

Видимо забыли, что эта команда только для ipv4 есть. TTL не будет, пока смысла в ней не вижу совсем.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...