Author Topic: traceroute  (Read 5611 times)

0 Members and 1 Guest are viewing this topic.

Offline Comrad

  • Jr. Member
  • **
  • Posts: 77
  • Karma: +0/-0
traceroute
« on: February 28, 2006, 23:52:11 »
Есть Slackware 9.1 работает как маршрутизатор. Как правильно настроить iptables для прохождения запросов traceroute?

Вот текущие настройки
Code: [Select]
TRACEROUTE_SRC_PORT="32769:65535"
TRACEROUTE_DEST_PORT="33434:33523"

INPUT
# destination-unreachable
$IPTABLES -A INPUT -p icmp -i $ISPDEV -s $ANYADDR \
    --icmp-type 3 -j ACCEPT
# time-exceeded
$IPTABLES -A INPUT -p icmp -i $ISPDEV -s $ANYADDR \
    --icmp-type 11 -j ACCEPT

FORWARD
$IPTABLES -A FORWARD -i $HOMEDEV -p udp \
    -s $HOMENET --sport $TRACEROUTE_SRC_PORT \
    -d $ANYADDR --dport $TRACEROUTE_DEST_PORT -j ACCEPT
# destination-unreachable
$IPTABLES -A FORWARD -p icmp -i $ISPDEV -s $ANYADDR \
    --icmp-type 3 -j ACCEPT
# time-exceeded
$IPTABLES -A FORWARD -p icmp -i $ISPDEV -s $ANYADDR \
    --icmp-type 11 -j ACCEPT

OUTPUT
# traceroute service
$IPTABLES -A OUTPUT -o $ISPDEV -p udp \
    -s $HOMENET --sport $TRACEROUTE_SRC_PORT \
    -d $ANYADDR --dport $TRACEROUTE_DEST_PORT -j ACCEPT
При попытке запроса с маршрутизатора получаю ответ
Code: [Select]
# traceroute sysadmin.tomsk.ru
traceroute to sysadmin.tomsk.ru (213.183.104.233), 30 hops max, 38 byte packets
traceroute: sendto: Operation not permitted
 1 traceroute: wrote sysadmin.tomsk.ru 38 chars, ret=-1
 *traceroute: sendto: Operation not permitted
traceroute: wrote sysadmin.tomsk.ru 38 chars, ret=-1
Если запрос идет из локальной сети
Code: [Select]
C:\>tracert sysadmin.tomsk.ru

Трассировка маршрута к sysadmin.tomsk.ru [213.183.104.233]
с максимальным числом прыжков 30:

  1    <1 мс    <1 мс    <1 мс  home.net [192.168.10.10]
  2     *        *        *     Превышен интервал ожидания для запроса.
  3     *        *        *     Превышен интервал ожидания для запроса.
  4  ^C
На мой взгляд, Запрос даже не покидает маршрутизатор. Значит все дело в настройках iptables. Кто знает, подскажите, плиз.
Кто понял жизнь, тот не торопится.

Offline demiurg

  • Hero Member
  • *****
  • Posts: 1014
  • Karma: +0/-0
    • http://larin.tomsk.ru
traceroute
« Reply #1 on: March 01, 2006, 01:35:44 »
Quote
Есть Slackware 9.1 работает как маршрутизатор. Как правильно настроить iptables для прохождения запросов traceroute?

На мой взгляд, Запрос даже не покидает маршрутизатор. Значит все дело в настройках iptables. Кто знает, подскажите, плиз.
[snapback]7761[/snapback]
Потому что все не правильно. Подумайте хорошенько. И срочно читать IPTables Tutorial, т.к. похоже что в голове нет ясности по тому как iptables работает.

Во-первых. traceroute в unix и в винде работает немного по разному. В unix по умолчанию используются udp пакеты (ключик -I меняет такое поведение), в Винде icmp.

При трассировке с хоста за маршрутизатором пакеты проходят только FORWARD (из указанных выше цепочек).
При трассировке с самого маршрутизатора исходящие пакеты проходят OUTPUT, а входящие INPUT.
Поэтому для трассировки с хостов за маршрутизатором нужно разрешить прохождение icmp пакетов через FORWARD и udp, если в сети есть UNIX машины.

Для трассировки с самого маршрутизатора нужно разрешить аналогичные пакеты в INPUT и в OUTPUT.

Самый лучший способ -- разрешить все пакеты, запустить tcpdump и понаблюдать за тем какие пакеты в каком направлении проходят. Это поможет разобраться и написать правила.
« Last Edit: March 01, 2006, 02:00:45 by demiurg »

Offline demiurg

  • Hero Member
  • *****
  • Posts: 1014
  • Karma: +0/-0
    • http://larin.tomsk.ru
traceroute
« Reply #2 on: March 01, 2006, 01:59:34 »
Для проходящих нужно еще добавить
Code: [Select]
FORWARD
$IPTABLES -A FORWARD -i $HOMEDEV -p icmp \
   -s $HOMENET --icmp-type echo-request -j ACCEPT

ну и по хорошему

$IPTABLES -A FORWARD -p icmp -i $ISPDEV -s $ANYADDR \
   --icmp-type echo-reply -j ACCEPT
Вообще, лучше распихать правила по пользовательским цепочкам, тогда не надо писать такие сложные условия и отлаживать легче.

В исходящих тоже ошибка
Code: [Select]
OUTPUT
# traceroute service
$IPTABLES -A OUTPUT -o $ISPDEV -p udp \
   -s $HOMENET --sport $TRACEROUTE_SRC_PORT \
   -d $ANYADDR --dport $TRACEROUTE_DEST_PORT -j ACCEPT
если указан -o $ISPDEV то -s $HOMENET ну никак не может быть.
(Я полагаю что $HOMENET это что-то вроде 192.168.0.0/24)
Соответственно под указанное правило пакеты не попадают и грохаются.

Offline Comrad

  • Jr. Member
  • **
  • Posts: 77
  • Karma: +0/-0
traceroute
« Reply #3 on: March 01, 2006, 20:42:41 »
Quote
Потому что все не правильно. Подумайте хорошенько. И срочно читать IPTables Tutorial, т.к. похоже что в голове нет ясности по тому как iptables работает.

Во-первых. traceroute в unix и в винде работает немного по разному. В unix по умолчанию используются udp пакеты (ключик -I меняет такое поведение), в Винде icmp.
[snapback]7762[/snapback]
Роберт Л. Зиглер, "Брандмауэры в Linux"
"Система traceroute использует протокол UDP и работает следующим образом. При прохождении данных от исходного компьютера к месту назначения все промежуточные узлы генерируют ICMP-сообщения Time Exceeded, а целевой узел передает сообщение Destination Unreachable."

Использовал этот источник, правда там все настройки для ipchains.

Quote
Самый лучший способ -- разрешить все пакеты, запустить tcpdump и понаблюдать за тем какие пакеты в каком направлении проходят. Это поможет разобраться и написать правила.
[snapback]7762[/snapback]
При всех целях ACCEPT все работает.
Кто понял жизнь, тот не торопится.

Offline Comrad

  • Jr. Member
  • **
  • Posts: 77
  • Karma: +0/-0
traceroute
« Reply #4 on: March 01, 2006, 20:47:23 »
Quote
В исходящих тоже ошибка
Code: [Select]
OUTPUT
# traceroute service
$IPTABLES -A OUTPUT -o $ISPDEV -p udp \
   -s $HOMENET --sport $TRACEROUTE_SRC_PORT \
   -d $ANYADDR --dport $TRACEROUTE_DEST_PORT -j ACCEPT
если указан -o $ISPDEV то -s $HOMENET ну никак не может быть.
(Я полагаю что $HOMENET это что-то вроде 192.168.0.0/24)
Соответственно под указанное правило пакеты не попадают и грохаются.
[snapback]7763[/snapback]
Ваша правда. Грохнул -s $HOMENET и с маршрутизатора пошло.
Буду рыть FORWARD.

Спасибо за потраченное на меня время.
Кто понял жизнь, тот не торопится.

Offline demiurg

  • Hero Member
  • *****
  • Posts: 1014
  • Karma: +0/-0
    • http://larin.tomsk.ru
traceroute
« Reply #5 on: March 01, 2006, 23:41:38 »
Quote
Ваша правда. Грохнул -s $HOMENET и с маршрутизатора пошло.
Буду рыть FORWARD.

Спасибо за потраченное на меня время.
[snapback]7784[/snapback]
Еще раз акцентирую внимание на том, что Винда отправляет не udp пакеты, а icmp echo request. См. также ключ -I для traceroute.

А с ACCEPT естественно все будет проходить, но наблюдение в tcpdump за проходящими пакетами позволит сделать вывод о том как происходит процесс обмена пакетами и устранить ошибки в правилах. По крайней мере мне очень помогало. В некоторых случаях различные авторы допускают разночтения стандартов и реализуют протоколы на свой странный манер.

Роберт Л. Зиглер, "Брандмауэры в Linux" очень хорошая книжка, жаль не хотят переводить последнее издание, там все на iptables уже переписано.
« Last Edit: March 01, 2006, 23:42:20 by demiurg »

Offline demiurg

  • Hero Member
  • *****
  • Posts: 1014
  • Karma: +0/-0
    • http://larin.tomsk.ru
traceroute
« Reply #6 on: March 02, 2006, 13:08:05 »
Вот кстати пример, я специально выбрал адрес по ближе, что бы не загромождать вывод.
Code: [Select]
/usr/sbin/traceroute -n 217.18.129.182
traceroute to vl313-core521.bbn.tomsknet.ru (217.18.129.182), 30 hops max, 38 byte packets
 1  192.168.2.1  7.237 ms  7.318 ms  7.105 ms
 2  217.18.128.7  6.963 ms  7.399 ms  7.396 ms
 3  217.18.129.182  7.392 ms *  6.441 ms
Всю процедуру обмена приводить не буду только интересный последний фрагмент

Code: [Select]
sudo /usr/sbin/tcpdump '!port ssh and !port domain and !port ircd' -n
<...>
12:58:19.041865 IP 192.168.2.2.32818 > 217.18.129.182.33439: UDP, length 10
12:58:19.049494 IP 217.18.128.7 > 192.168.2.2: ICMP time exceeded in-transit, length 36
12:58:19.050317 IP 192.168.2.2.32818 > 217.18.129.182.33440: UDP, length 10
12:58:19.057625 IP 217.18.128.7 > 192.168.2.2: ICMP time exceeded in-transit, length 36
12:58:19.058934 IP 192.168.2.2.32818 > 217.18.129.182.33441: UDP, length 10
12:58:19.066975 IP 217.18.129.182 > 192.168.2.2: ICMP 217.18.129.182 udp port 33441 unreachable, length 36
12:58:19.077124 IP 192.168.2.2.32818 > 217.18.129.182.33442: UDP, length 10
12:58:24.075770 IP 192.168.2.2.32818 > 217.18.129.182.33443: UDP, length 10
12:58:24.082796 IP 217.18.129.182 > 192.168.2.2: ICMP 217.18.129.182 udp port 33443 unreachable, length 36
Code: [Select]
/usr/sbin/traceroute -I -n 217.18.129.182
traceroute to vl313-core521.bbn.tomsknet.ru (217.18.129.182), 30 hops max, 38 byte packets
 1  192.168.2.1  7.390 ms  6.814 ms  7.253 ms
 2  217.18.128.7  7.613 ms  7.723 ms  7.305 ms
 3  217.18.129.182  7.544 ms  7.504 ms  7.558 ms
Code: [Select]
12:59:22.331021 IP 192.168.2.2 > 217.18.129.182: ICMP echo request, id 35778, seq 5, length 18
12:59:22.337740 IP 217.18.128.7 > 192.168.2.2: ICMP time exceeded in-transit, length 36
12:59:22.338583 IP 192.168.2.2 > 217.18.129.182: ICMP echo request, id 35778, seq 6, length 18
12:59:22.345632 IP 217.18.128.7 > 192.168.2.2: ICMP time exceeded in-transit, length 36
12:59:22.346921 IP 192.168.2.2 > 217.18.129.182: ICMP echo request, id 35778, seq 7, length 18
12:59:22.354102 IP 217.18.129.182 > 192.168.2.2: ICMP echo reply, id 35778, seq 7, length 18
12:59:22.364080 IP 192.168.2.2 > 217.18.129.182: ICMP echo request, id 35778, seq 8, length 18
12:59:22.371471 IP 217.18.129.182 > 192.168.2.2: ICMP echo reply, id 35778, seq 8, length 18
12:59:22.372277 IP 192.168.2.2 > 217.18.129.182: ICMP echo request, id 35778, seq 9, length 18
12:59:22.380087 IP 217.18.129.182 > 192.168.2.2: ICMP echo reply, id 35778, seq 9, length 18
« Last Edit: March 02, 2006, 13:14:00 by demiurg »

Offline Comrad

  • Jr. Member
  • **
  • Posts: 77
  • Karma: +0/-0
traceroute
« Reply #7 on: March 02, 2006, 20:26:55 »
Спасибо за примеры. Нашел для себя новое и по tcpdump/

Книгу я читаю совместно со статьей о Kernel packet traveling diagram
Кто понял жизнь, тот не торопится.